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
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).
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).