Skip to content

refactor users and ApplicationPolicy

Vincent Agnano requested to merge refactor/application-policy into master

Created by: adipasquale

preliminary to #1215

Direction

La direction que j'envisage pour les policies est de limiter le contexte à l'agent ou l'usager connecté. Le contexte désigne ici le pundit_userutilisé comme premier argument d'instanciation des policies.

Aujourd'hui côté agent on utilise comme pundit_user un AgentContext qui contient l'agent connecté + l'organisation courante si l'agent parcoure des routes scopées à l'organisation. Pour les routes scopées au département entier, pour l'instant on hacke complètement.

Une direction alternative pourrait être de rajouter dans le contexte le Territoire pour supprimer le hack et faire quelque chose de propre.

A mon avis, il vaut mieux simplifier au maximum le contexte et donc les policies. La policy devrait être uniquement en charge de dire si, dans l'absolu, un agent a le droit de faire telle action sur telle ressource, indépendamment du contexte.

Ça devient la responsabilité des controlleurs de scoper sur l'orga courante ou le département courant.

Changement sur les users

Cette premiere PR ne fait pas ce refacto côté agent, mais elle simplifie d'abord les policies côté User.

  • Simplification et générisation de l'ApplicationPolicy. Le but est de pouvoir l'utiliser ensuite comme classe de base pour toutes les policies, dont celles Agent.
  • j'ai tenté de transformer cet héritage en composition via concerns mais ce n'est pas très pratique à cause des classes scopées Scope qui doivent aussi hériter d'un peu de comportement. C'est aussi la manière de faire recommandée par Pundit et ça suit les conventions Rails d'hériter d'un ApplicationController::Base etc.
  • utilisation d'un alias current_user pour designer le pundit_user dans les policies user. L'idée sera d'aliaser symmétriquement le pundit_user en current_agent côté policies Agents. J'utilise la même convention que devise pour désigner l'agent connecté même si ce n'est pas nécessaire je pense que ça peut aider la lisibilité.

Il faudrait ensuite refacto les policies Agent pour supprimer la notion de current_organisation dans le AgentContext et simplifier toutes les policies.

Merge request reports