Aplicando Padrões de Projeto em Autorizações

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. :confused:

_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! :slight_smile: