Skip to content

Independent agent roles per organisation

Vincent Agnano requested to merge feature/independent-agent-roles into master

Created by: adipasquale

Grosse PR, pour changer. Une grande partie des changements vient de renommages toutefois, notamment dans les specs

Introdution du modèle AgentRole

La table de jointure Agents - Organisations devient un véritable modèle AgentRole qui possède pour l'instant un seul attribut propre : le level , valeurs possibles : basic (defaut) ou admin

Justifications des nommages :

  • J'aime bien avoir des noms parlants pour les modeles, meme les tables de jointures. Ici ce n'est pas super évident de nommer le lien entre un agent et une orga. Role est pas mal, même si c'est un peu ambigu avec le "niveau" du rôle agent/admin qui est ici une caractéristique
  • je pense qu'à l'avenir on va peut-être/probablement permettre aux agents d'appartenir à plusieurs services. Dans la modélisation proposée, il "suffira" de déplacer le service de l'agent vers l'AgentRole, et de relâcher un peu la contrainte d'unicité.
  • Rôle me semble suffisament générique dans ce cadre, et il me semble resterait à peu près acceptable si on rajoutait le service
  • j'ai renommé le niveau de base de "agent" vers "basic", dans le but de rendre ça plus greppable, et d'éviter la polysémie existante entre un agent agent et un agent admin. Je n'ai pas répercuté ça dans l'UI pour l'instant, on parle toujours d'agent, pas de rôle basique.
  • je n'ai pas renommé la table, elle s'appelle toujours agents_organisations . ce n'est pas hyper evident de renommer une table donc je préfère m'économiser ça.

Ces choix sont très discutables.

Policies

C'était moins douloureux que ce que j'envisageais de gérer les permissions dans les policies. le gros truc était de déplacer la méthode can_access_others_planning? des agents vers l'AgentRole

Par contre ça devient pas mal absurde ce qu'on fait pour les routes de niveaux départements, il faut qu'on attaque le sujet pour introduire le modèle département et les permissions qui s'y réfèrent rapidement

petite complexité supplémentaire pour le scope des absences, la seule ressource exposée depuis l'API et qui peut donc être récupérée en dehors du contexte d'une orga

PermissionsController devient AgentRolesController

Les routes d'éditions d'agents existantes sont sur un controlleur non-AR qui s'appelle Permissions; qui devait j'imagine préfigurer les AgentRole. J'ai supprimé complètement la notion de Permission

Ce n'est pas tout à fait cohérent car je n'ai pas déplacé la route Agents#index vers AgentRoles, mais je pense que c'est a peu pres acceptable, en tout cas mieux que permissions

Specs

Dans les specs, ca devient un peu ambigu de faire create(:agent, organisations: []), meme si ca continue à fonctionner. J'ai rajouté des helpers pour pouvoir faire create(:agent, basic_role_in_organisations: [...]) et create(:agent, admin_role_in_organisations: [...]) pour rester explicite, et j'ai migré tous les appels du code existant

Complexifications des formulaires d'invitation et de creation d'orga

Je m'appuie au max sur la possibilité de créer des objets imbriqués native de rails grace à accepts_nested_attributes_for . Dans le cas de la création d'une orga ca va assez loin puisque j'imbrique la création d'un agent et la création d'un agentrole pour cet agent 🤯 ca fonctionne et ca evite du code custom, au détriment de rendre ca un peu moins explicite, il faut bien connaitre rails.

Migration

Pas de questions particulières je copie juste la valeur d'agent vers agent_roles et a partir de maintenant elles pourront évoluer indépendemment.

Il faudra dans un ticket successif supprimer la colonne agents.role

testée sur les données de prod √

Contrainte un admin par orga

J'introduis la contrainte qu'il doit toujours y avoir un admin par orga. par conséquent : interdit de dégrader ou supprimer le dernier admin. Ce n'est pas méga évident à exprimer dans le système de validations AR, je pense être arrivé à qqch d'acceptable.

modifications de l'UI

Dans la liste des orgas, j'affiche un petit icône pour distinguer celles où l'agent courant est admin Screenshot 2021-02-01 at 16 56 25

Dans la liste des agents j'ai déplacé l'info admin vers une colonne à part plutôt qu'un badge Screenshot 2021-02-01 at 16 54 47

Dans le formulaire d'un agent, j'ai rajouté une infobox pour prévenir du changement Screenshot 2021-02-01 at 17 02 30

Bonus

  • regroupement du comportement commun des policies niveau département (== celles de la secto)
  • l'enum agent.roles 0/1 devient une colonne level string lisible dans la table des AgentRoles
  • je supprime deux helpers un peu louches human_enum_name_html
  • on enleve un -> { distinct } bizarre sur les associations entre agents et orgas

A bien tester sur la review app

  • Org creation from homepage
  • sectorisation interface
  • invite an agent
  • manage agents roles

Note : l'invitation d'un agent depuis la super admin plante pour les review apps, mais je suis quasiment sûr que ce n'est pas lié à cette PR, ça doit dater du dernier changement sur les emails d'invitations et au fait que la super admin sur les review apps n'est pas authentifiée pareil. Ca fonctionne bien en local

Merge request reports