rdv-service-public icon indicating copy to clipboard operation
rdv-service-public copied to clipboard

Toujours spécifier la classe de la policy qu'on invoque

Open francois-ferrandis opened this issue 4 months ago • 0 comments

Contexte

Dans le cadre du chantier visant à rendre les policies plus explicites (#3898), nous avons deux axes :

  1. Initialiser les policies avec un contexte clair et qui ne dépend pas de l'orga courante
  2. Clarifier quelle policy est magiquement invoquée lors des appels à authorize et policy_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é.

francois-ferrandis avatar Oct 04 '24 15:10 francois-ferrandis