# Aplicando Padrões de Projeto em Autorizações

**URL:** <https://forum.casadocodigo.com.br/t/aplicando-padroes-de-projeto-em-autorizacoes/1435>\
**Category:** Livros\
**Tags:** refatoracao-ruby\
**Created:** [Julho 2, 2019, 9:12pm UTC](https://forum.casadocodigo.com.br/t/aplicando-padroes-de-projeto-em-autorizacoes/1435 "2019-07-02T21:12:16Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![marco\_beduschi](https://avatars.discourse-cdn.com/v4/letter/m/df788c/32.png) [@marco\_beduschi](https://forum.casadocodigo.com.br/u/marco_beduschi)\
**Post date:** [Julho 2, 2019, 9:12pm UTC](https://forum.casadocodigo.com.br/t/aplicando-padroes-de-projeto-em-autorizacoes/1435/1 "2019-07-02T21:12:17Z")

</div>

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:

 ![IMG_20190702_180803](https://canada1.discourse-cdn.com/flex029/uploads/casadocodigo/original/2X/3/312570f1b175e2cc4c22c574d0ee7c095fa4c615.jpeg)

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! 🙂
