+28
−3
Loading
Étape 2 du socle multi-organisations. Le root peut enfin créer une organisation —
jusqu'ici elles ne naissaient que du seed. Il règle ses plafonds et sa rétention,
la suspend, la supprime, et y rattache un compte existant.
La décision qui structure le reste : le root n'a AUCUN droit ambiant sur les
données des organisations. `RolesGuard` reste inchangé, donc `INSTANCE_ADMIN` ne
passe pas les routes `TENANT_ADMIN`. Pour voir un exercice, il entre
explicitement : motif obligatoire, 30 minutes, lecture seule sauf demande
d'écriture, et une ligne dans un journal persisté. C'est le patron du « voir
comme » joueur, appliqué un cran plus haut.
Trois détails qui ne sont pas des détails :
- `InstanceAudit` n'a pas de clé étrangère vers `Tenant`, et recopie son nom.
Sans ça, supprimer une organisation effacerait la preuve de ce qui lui est
arrivé — exactement la trace qu'un client viendrait réclamer.
- `InstanceGuard` relit les appartenances au lieu de croire le jeton, et refuse
les sessions déjà basculées. Un root entré chez un client ne peut pas, de cette
session, continuer à administrer l'instance.
- La sortie de bascule est un POST, que la lecture seule refuserait : elle rejoint
la liste blanche du garde de session, sur le modèle de `ALLOWED_OUTSIDE_PLAY`
côté joueur. Sans elle, un administrateur resterait enfermé 30 minutes.
Suspendre coupe l'accès sans attendre l'expiration des jetons (8 h) : le garde de
session consulte l'état de l'organisation à chaque requête, derrière un cache
court invalidé à chaque changement. La fenêtre de 30 s ne joue que si plusieurs
instances de l'API tournent en parallèle — c'est documenté, pas subi.
La rétention devient propre à chaque organisation. La purge parcourt désormais
les organisations une par une : un `deleteMany` global appliquerait la durée de
l'hébergeur à tout le monde. `null` = valeur du déploiement, `0` = refus explicite
de purge — d'où un `??` et non un `||`, qui aurait confondu les deux.
Correction d'outillage : mon détecteur de doublons i18n ignorait les clés non
quotées (`Déconnexion:`) et ne voyait donc que 393 des 567 clés. Corrigé, il a
immédiatement trouvé un doublon que je venais d'introduire (`Création
impossible`), qui aurait cassé le typage. Aucun autre doublon dans le fichier.
Non vérifié : aucune chaîne Node dans cet environnement, donc rien n'a été
compilé ni testé. Contrôles manuels : équilibre des délimiteurs, balises JSX
appariées, classes CSS présentes, clés i18n sans doublon.
Co-Authored-By:
Claude (RCA) <noreply@anthropic.com>