rdv-service-public
rdv-service-public copied to clipboard
Toujours spécifier la classe de la policy qu'on invoque
Contexte
Dans le cadre du chantier visant à rendre les policies plus explicites (#3898), nous avons deux axes :
- Initialiser les policies avec un contexte clair et qui ne dépend pas de l'orga courante
- Clarifier quelle policy est magiquement invoquée lors des appels à
authorize
etpolicy_scope
Cette PR s'attaque au problème n°2.
Pour résumer le problème, si par exemple aujourd'hui je veux savoir où est utilisée Agent::RdvPolicy
, je dois chercher toutes les possibilités d'appel :
authorize(rdv)
authorize rdv
policy(rdv).show? # helper de vue
# et le nom de variable peut changer aussi
authorize(duplicated_rdv)
authorize(created_rdv)
authorize(new_rdv)
Et pour Agent::RdvPolicy::Scope
:
policy_scope(Rdv)
policy_scope Rdv
policy_scope(filtered_rdvs)
Bref, la résolution magique de la classe de policy a pour coût une certaine forme d'indirection qui empêche de retrouver facilement les usages.
Solution
Je propose de forcer le passage explicite de la classe de policy lors de des appels à authorize
, policy_scope
et policy
.
Cela implique de modifier nos overrides de ces méthodes Pundit. C'est ce que l'on fait désormais dans ExplicitPunditConcern
, qui permet définit ces trois méthodes, avec des signatures qui requiert une classe explicite.
Le reste du diff, c'est du search and replace semi-automatique, sur lequel j'ai fait une passe de vérification visuelle une fois tout remplacé.