Skip to content

Construire la file de modération et ses endpoints (A-02) #53

Open

Description

@IlanAMG

Contexte

Epic : #5
Maquette : Ecrans › Admin web · écrans de référence validés le 2026-10-09 (#339, D-086) · canevas Widoo — Admin
Admin-Web › A-02 · Creation-et-Moderation · API · écran de référence : #339
Décision : D-085 (cadrage du 2026-10-09)

Comportement attendu

  • Endpoints /admin/moderation, publish, request-changes, reject, unpublish, table moderation_actions (et admin_actions).
  • UI selon la spec : liste triée par ancienneté (rouge au-delà de 72 h), filtres, détail avec fiche, carte, avertissements, règles à cocher, Premium calculé, différence avec la version publiée pour une révision, historique de l'auteur ; actions avec message ou motif codifié.

Critères d'acceptation

  • Chaque action est journalisée et notifie l'auteur
  • L'ancienneté en file est visible et passe en rouge au-delà de 72 h
  • Une révision montre ce qui a changé depuis la version publiée

Ajouts du 2026-10-09 (D-086, D-087)

  • Maquette : Ecrans › Admin web · écrans de référence validés le 2026-10-09 (Design — admin web : coque, file de modération et tableau de bord (écrans de référence) #339, D-086) · canevas Widoo — Admin : liste (vide, chargement, erreur, 1 024 px), fiche en page dédiée avec « Parcours 1 sur 14 », règles à cocher (« Publier » actif quand les 6 sont cochées, sans confirmation), demander des modifications, refus, publié.
  • API : GET /admin/routes/:id (fiche, avertissements, différence avec la version publiée, historique de l'auteur et du parcours, position dans la file) ; 409 already_decided quand un autre membre de l'équipe a déjà tranché.
  • Libellés français et anglais des 7 motifs de refus dans packages/shared, communs à l'app (E-08) et à l'admin (Creation-et-Moderation).
  • Deux modérateurs sur le même parcours : le second voit la décision prise, rien n'est écrit deux fois

Activity

  1. added this to the v0.6 milestone on Sep 21, 2026
  2. IlanAMG commented on Sep 25, 2026

    @IlanAMG
    MemberAuthor

    D-048 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : la charte (règle 5) autorise les liens affiliés du créateur s'ils sont déclarés ; la file de modération doit les signaler pour contrôle. Voir https://github.com/Inprogress-Agency/widoo-app/wiki/Creation-et-Moderation.

  3. IlanAMG commented on Sep 25, 2026

    @IlanAMG
    MemberAuthor

    D-049 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : les lieux créés par les utilisateurs arrivent en verification_status = unverified et doivent être visibles en modération avec le parcours (règle unverified_place).

  4. IlanAMG commented on Sep 25, 2026

    @IlanAMG
    MemberAuthor

    D-050 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : la modération voit les nouveaux lieux (unverified, éventuellement éphémères) et les photos libres avec leur crédit (charte, règle 4).

  5. removed
    needs-designQuestion ou maquette à produire en mode DESIGN
    on Sep 28, 2026
  6. IlanAMG commented on Sep 28, 2026

    @IlanAMG
    MemberAuthor

    Plus de planche de design (#78 fermé, décision d'Ilan du 2026-09-28) : spécification détaillée à venir dans le wiki (section Admin web d'Ecrans), à faire par le chef de projet avant le début de v0.6 ; composants d'une bibliothèque standard.

  7. added
    needs-designQuestion ou maquette à produire en mode DESIGN
    status:blockedBloqué, voir commentaire ⛔
    and removed
    needs-designQuestion ou maquette à produire en mode DESIGN
    on Oct 9, 2026
  8. Nascimento95 commented on Oct 12, 2026

    @Nascimento95
    Collaborator

    🔨 Démarrage, sur demande de Marco, en PR empilée sur #363 (socle, pas encore fusionné) : branche issue/53-moderation-queue.

    Plan :

    1. packages/shared : les 7 motifs de refus et leurs libellés, les schémas de la file et de la fiche, le code already_decided.
    2. API : table moderation_actions, GET /admin/moderation, GET /admin/routes/:id, puis publish, request-changes, reject, unpublish, chacune écrite dans moderation_actions et admin_actions, avec 409 already_decided.
    3. Admin : liste (ancienneté, retard en rouge, filtres dans l'adresse, états), fiche en page dédiée, règles à cocher, décisions.

    Deux points du ticket dépendent de choses qui n'existent pas encore dans l'API et seront ajoutés ensuite :

    • la différence d'une révision avec la version publiée : la table route_revisions et la soumission d'un parcours viennent de Gérer PUT /routes/:id/steps, submit, statuts et lien privé #48, pas commencé ; ce ticket n'est pas déclaré comme bloquant ici ;
    • la notification de l'auteur : il n'y a pas de table notifications.

    En attendant, les parcours « en attente » sont posés à la main dans la base locale pour les tests, et l'ancienneté en file se mesure sur la dernière modification du parcours.

  9. Nascimento95 commented on Oct 13, 2026

    @Nascimento95
    Collaborator

    PR ouverte en brouillon, empilée sur le socle : #365 (niveau 2).

    État des critères :

    • Chaque action est journalisée et notifie l'auteur — journalisée dans moderation_actions et admin_actions ; pas de notification, la table notifications n'existe pas.
    • L'ancienneté en file est visible et passe en rouge au-delà de 72 h — vérifié à l'écran par Marco le 2026-10-12 (en local, émulateur Auth).
    • Une révision montre ce qui a changé depuis la version publiée — affichage prêt, aucune donnée tant que Gérer PUT /routes/:id/steps, submit, statuts et lien privé #48 n'a pas créé route_revisions.
    • Deux modérateurs sur le même parcours : le second voit la décision prise, rien n'est écrit deux fois — couvert par un test à deux requêtes simultanées.

    ⛔ Bloqué pour les deux critères restants par #48 (soumission d'un parcours, révisions) et par l'absence de table notifications. Ni l'un ni l'autre n'est déclaré comme bloquant de ce ticket.

  10. PaulThiberville commented on Oct 14, 2026

    @PaulThiberville
    Collaborator

    Note de CODE (#420, pour #48) : de quoi brancher la file de modération.

    • Statut : écrire routes.status seulement par moveRoute(tx, route, to, 'moderator', now) (apps/api/src/editor/lifecycle.ts) : il vérifie la transition (canMoveRoute de @widoo/shared, 409 sinon), date la première publication et retire les lignes user_featured_routes d'un parcours qui sort de published, dans la même transaction.
    • Révision d'un parcours publié : table route_revisions (migration 0008), au plus une ouverte par parcours (draft, pending, changes_requested) ; la file doit aussi lister les révisions pending. Publier une révision : writeInPlace(tx, route, revision.content, now) (apps/api/src/editor/save.ts), puis la révision en published avec decided_at, comme le fait déjà la publication directe d'un éditeur dans submitRoute (apps/api/src/editor/submit.ts). Demander des modifications ou refuser une révision : changes_requested ou rejected sur la révision, la version publiée restant en ligne ; l'auteur réédite une révision changes_requested et la resoumet.
  11. IlanAMG commented on Oct 16, 2026

    @IlanAMG
    MemberAuthor

    Chef de projet (16/10/2026) : glissé du Sprint 0 au Sprint 1, non terminé.

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