Skip to content

Admin : utilisateurs et rôles (A-06) #341

Open

Description

@IlanAMG

Contexte

Epic : #5
Admin-Web › A-06
Décision : D-085 (cadrage du 2026-10-09)

Comportement attendu

  • 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

Activity

  1. added this to the v0.6 milestone on Oct 9, 2026
  2. Nascimento95 commented on Oct 16, 2026

    @Nascimento95
    Collaborator

    🔨 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

    1. Migration 0017 : users.plan_source et origine d'un déblocage de parcours (store ou gift), schémas partagés.
    2. API : liste (recherche, curseur) et fiche d'un utilisateur.
    3. API : changement de rôle, suspension et réactivation (journal), profil public masqué pour un compte suspendu.
    4. API : offrir Premium (date) ou un parcours.
    5. API : certification (la route n'existe pas encore malgré le wiki), export, suppression.
    6. Admin : liste et panneau de détail.
    7. Admin : rôle, suspension. 8. Admin : offrir, certification, 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.

  3. Nascimento95 commented on Oct 16, 2026

    @Nascimento95
    Collaborator

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

  4. Nascimento95 commented on Oct 19, 2026

    @Nascimento95
    Collaborator

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

  5. PaulThiberville commented on Oct 19, 2026

    @PaulThiberville
    Collaborator

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

  6. added and removed on Oct 19, 2026
  7. IlanAMG commented on Oct 19, 2026

    @IlanAMG
    MemberAuthor

    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.

  8. modified the milestones: v0.6, v0.4 on Oct 19, 2026
  9. IlanAMG commented on Oct 19, 2026

    @IlanAMG
    MemberAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions