Olá!
Terminei de ler o livro Refatorando Com Padrões de Projeto e estou tendo dificuldades de encontrar um padrão que se encaixe no problema que estou tendo. Gostaria de compartilhá-lo aqui pra entender como vocês lidariam com o problema, e se a minha solução parece estar no caminho correto.
_Problema
Desejo expandir o sistema de autorizações do meu app.
Atualmente temos um sistema simples de permissões usando a gema Pundit. Ela permite mapear uma permissão para cada ação do meu controller. Ex.: Um usuário pode publicar um post se ele é admin OU se o fórum não está bloqueado.
A nova expansão adicionaria mais papéis a equação. Por exemplo, o usuário agora pode ser:
- admin
- dono do post
- responsável pelo post
- contribuintes do post
Além disso, para cada papel pode existir um contexto específico (ex.: O Contribuinte do post pode editá-lo se o período de revisão ainda está aberto).
Isso me parece muito complexo pra permanecer numa função só, e quebra com certeza o SRP. Cada ação da Policy teria um case role; when admin; when onwer
, e amanhã a regra de negócio muda e adiciona-se um novo role, eu teria que mudar 251 funções.
_Solução
Eu fiz um desenho de como eu imagino que deveria ser, algo assim:
Na minha visão, cada Role teria sua Policy
, então algo tipo DonoPostPolicy
, ResponsavelPostPolicy
, etc, e existiria um mediador que seria capaz de rotear para a policy certa dependendo do user.role
.
Faz sentido? Como vocês fariam? Eu adoraria discutir mais, se alguém estivesse interessado!
Obrigado!