You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
UI : liste avec recherche (e-mail, prénom, identifiant), fiche, actions de la spec, réservées au rôle indiqué dans la matrice.
API : GET /admin/users, GET /admin/users/:id, PATCH /admin/users/:id/role, POST /admin/users/:id/suspend et /reactivate (motif), POST /admin/users/:id/gift (Premium jusqu'à une date ou un parcours, plan_source = gift), GET /admin/users/:id/export, DELETE /admin/users/:id (même règle que la suppression dans l'app) ; POST /admin/users/:id/certification existe déjà.
Compte suspendu : l'API répond 403 account_suspended à toute requête authentifiée ; profil public masqué, parcours publiés gardés.
Chaque action écrit dans admin_actions.
Critères d'acceptation
Un admin ne peut ni se suspendre, ni se supprimer, ni retirer son propre rôle
Seul un compte user se supprime : un compte de l'équipe est d'abord rétrogradé en user par un admin, sinon 403 (D-098)
Un Premium offert donne l'accès aux parcours Premium jusqu'à sa date, puis s'arrête
Un moderator voit la fiche et peut suspendre, pas changer un rôle
🔨 Démarrage — branche issue/341-users-and-roles, empilée sur issue/54-reports-and-ratings (#479), main inchangée depuis le rebase du 16/10 (dernière migration 0014).
Niveau de risque : 3 (changement de rôle, suspension, suppression de compte, Premium offert, migration) : level:3, revue OWASP complète, fusion sur demande de l'opérateur.
Plan en commits autonomes
Migration 0017 : users.plan_source et origine d'un déblocage de parcours (store ou gift), schémas partagés.
API : liste (recherche, curseur) et fiche d'un utilisateur.
API : changement de rôle, suspension et réactivation (journal), profil public masqué pour un compte suspendu.
API : offrir Premium (date) ou un parcours.
API : certification (la route n'existe pas encore malgré le wiki), export, suppression.
Règles retenues avec l'opérateur : rôle, Premium offert, suppression, certification réservés à l'admin ; le moderator suspend seulement les comptes user et editor ; un admin ne touche pas à son propre compte ; offre Premium refusée sur un abonnement du store actif, et il faut exactement une date ou un parcours.
Dépend de tables absentes : avis (#64) et signalements de lieux (#49) : écran construit, réponse vide à remplacer plus tard.
🔎 PR ouverte : #499 (niveau 3, label level:3, base issue/54-reports-and-ratings). La fusion attend la demande de l'opérateur.
Vérification humaine : Marco a testé en local le 2026-10-16, sur la tête de la branche avant le découpage en commits (contenu identique à f93ed9e), dans l'admin connecté :
recherche et fiche d'un compte (Camille, Lina) ;
Premium offert jusqu'à une date, refus sur un abonnement du store actif, parcours offert ;
attribution du badge, changement de rôle, suspension et réactivation ;
fiche du suspendu (Hugo), moderator qui ne voit plus « Suspendre » sur un éditeur (Sarah) ;
panneau de droite qui défile sur une fiche longue, téléchargement de l'export, suppression d'un compte (il disparaît de la liste).
Non testé : la fiche avec des avis ou signalements de lieux (tables absentes, #64 et #49), et la nouvelle saisie du TOTP (absente du socle).
Avis dans la fiche d'un compte (CODE, 2026-10-19), commit 1fd60b8 sur #499 : ratingsGiven et ratingsReceived lisent route_ratings (50 derniers de chaque), avec la marque « Masqué ».
Vérification humaine, consignée par l'agent : Marco a testé en local le 2026-10-19 (commit 1fd60b8, base locale, avis fictifs) : la fiche d'un compte avec ses avis donnés et reçus, un avis masqué marqué « Masqué » dans la fiche, le lien vers le parcours, et un compte sans avis. Rien n'a été testé sur un environnement déployé.
📋 MANAGER, 2026-10-19 — @Nascimento95, réponse à la question de la PR #499 (« le wiki dit « lecture, suspension » pour le moderator sans préciser qui ») : Ilan a tranché le 2026-10-16, D-097. Un moderator ne suspend et ne réactive que les comptes user ; un compte de l'équipe (editor, moderator, admin) se suspend par un admin. C'est ce que la PR code dans allowedUserActions : rien à changer. La page Admin-Web (Rôles, A-06 › Actions) le dit désormais, et API › Admin note que POST /admin/users/:id/certification est écrite par la PR #499 (elle n'existait pas).
Remarque sur le commentaire de démarrage du 16/10, qui disait « le moderator suspend seulement les comptes user et editor » : la règle retenue, et codée, exclut l'éditeur.
Chef de projet (point du 19/10/2026) : priorité P1 → P0. Il bloque #532, donc #67 (P0). Chaîne #52 → #341 → #532 → #67 (P0, v0.4, RevenueCat) : un bloqueur ne peut être ni moins prioritaire ni planifié après ce qu'il bloque.
Chef de projet (point du 19/10/2026) : jalon v0.6 → v0.4. Chaîne #52 → #341 → #532 → #67 (P0, v0.4, RevenueCat) : un bloqueur ne peut être ni moins prioritaire ni planifié après ce qu'il bloque.
Activity
Nascimento95 commentedon Oct 16, 2026
🔨 Démarrage — branche
issue/341-users-and-roles, empilée surissue/54-reports-and-ratings(#479),maininchangée depuis le rebase du 16/10 (dernière migration0014).Niveau de risque : 3 (changement de rôle, suspension, suppression de compte, Premium offert, migration) :
level:3, revue OWASP complète, fusion sur demande de l'opérateur.Plan en commits autonomes
0017:users.plan_sourceet origine d'un déblocage de parcours (storeougift), schémas partagés.Règles retenues avec l'opérateur : rôle, Premium offert, suppression, certification réservés à l'admin ; le moderator suspend seulement les comptes
usereteditor; un admin ne touche pas à son propre compte ; offre Premium refusée sur un abonnement du store actif, et il faut exactement une date ou un parcours.Dépend de tables absentes : avis (#64) et signalements de lieux (#49) : écran construit, réponse vide à remplacer plus tard.
Nascimento95 commentedon Oct 16, 2026
🔎 PR ouverte : #499 (niveau 3, label
level:3, baseissue/54-reports-and-ratings). La fusion attend la demande de l'opérateur.Vérification humaine : Marco a testé en local le 2026-10-16, sur la tête de la branche avant le découpage en commits (contenu identique à
f93ed9e), dans l'admin connecté :Non testé : la fiche avec des avis ou signalements de lieux (tables absentes, #64 et #49), et la nouvelle saisie du TOTP (absente du socle).
Nascimento95 commentedon Oct 19, 2026
Avis dans la fiche d'un compte (CODE, 2026-10-19), commit
1fd60b8sur #499 :ratingsGivenetratingsReceivedlisentroute_ratings(50 derniers de chaque), avec la marque « Masqué ».Vérification humaine, consignée par l'agent : Marco a testé en local le 2026-10-19 (commit
1fd60b8, base locale, avis fictifs) : la fiche d'un compte avec ses avis donnés et reçus, un avis masqué marqué « Masqué » dans la fiche, le lien vers le parcours, et un compte sans avis. Rien n'a été testé sur un environnement déployé.PaulThiberville commentedon Oct 19, 2026
📋 MANAGER, 2026-10-19 — @Nascimento95, réponse à la question de la PR #499 (« le wiki dit « lecture, suspension » pour le moderator sans préciser qui ») : Ilan a tranché le 2026-10-16, D-097. Un moderator ne suspend et ne réactive que les comptes
user; un compte de l'équipe (editor, moderator, admin) se suspend par un admin. C'est ce que la PR code dansallowedUserActions: rien à changer. La page Admin-Web (Rôles, A-06 › Actions) le dit désormais, et API › Admin note quePOST /admin/users/:id/certificationest écrite par la PR #499 (elle n'existait pas).Remarque sur le commentaire de démarrage du 16/10, qui disait « le moderator suspend seulement les comptes
usereteditor» : la règle retenue, et codée, exclut l'éditeur.IlanAMG commentedon Oct 19, 2026
Chef de projet (point du 19/10/2026) : priorité P1 → P0. Il bloque #532, donc #67 (P0). Chaîne #52 → #341 → #532 → #67 (P0, v0.4, RevenueCat) : un bloqueur ne peut être ni moins prioritaire ni planifié après ce qu'il bloque.
IlanAMG commentedon Oct 19, 2026
Chef de projet (point du 19/10/2026) : jalon v0.6 → v0.4. Chaîne #52 → #341 → #532 → #67 (P0, v0.4, RevenueCat) : un bloqueur ne peut être ni moins prioritaire ni planifié après ce qu'il bloque.