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
{{ message }}
Repository navigation
Construire la file de modération et ses endpoints (A-02) #53
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
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
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.
🔨 Démarrage, sur demande de Marco, en PR empilée sur #363 (socle, pas encore fusionné) : branche issue/53-moderation-queue.
Plan :
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.
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.
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.
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).
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.
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.
Activity
IlanAMG commentedon Sep 25, 2026
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.
IlanAMG commentedon Sep 25, 2026
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).
IlanAMG commentedon Sep 25, 2026
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).
IlanAMG commentedon Sep 28, 2026
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.
Nascimento95 commentedon Oct 12, 2026
🔨 Démarrage, sur demande de Marco, en PR empilée sur #363 (socle, pas encore fusionné) : branche
issue/53-moderation-queue.Plan :
packages/shared: les 7 motifs de refus et leurs libellés, les schémas de la file et de la fiche, le codealready_decided.moderation_actions,GET /admin/moderation,GET /admin/routes/:id, puispublish,request-changes,reject,unpublish, chacune écrite dansmoderation_actionsetadmin_actions, avec 409already_decided.Deux points du ticket dépendent de choses qui n'existent pas encore dans l'API et seront ajoutés ensuite :
route_revisionset 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 ;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.
Nascimento95 commentedon Oct 13, 2026
PR ouverte en brouillon, empilée sur le socle : #365 (niveau 2).
État des critères :
moderation_actionsetadmin_actions; pas de notification, la tablenotificationsn'existe pas.route_revisions.⛔ 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.feat(api): return the full profile in GET /me
PaulThiberville commentedon Oct 14, 2026
Note de CODE (#420, pour #48) : de quoi brancher la file de modération.
routes.statusseulement parmoveRoute(tx, route, to, 'moderator', now)(apps/api/src/editor/lifecycle.ts) : il vérifie la transition (canMoveRoutede@widoo/shared, 409 sinon), date la première publication et retire les lignesuser_featured_routesd'un parcours qui sort depublished, dans la même transaction.route_revisions(migration 0008), au plus une ouverte par parcours (draft,pending,changes_requested) ; la file doit aussi lister les révisionspending. Publier une révision :writeInPlace(tx, route, revision.content, now)(apps/api/src/editor/save.ts), puis la révision enpublishedavecdecided_at, comme le fait déjà la publication directe d'un éditeur danssubmitRoute(apps/api/src/editor/submit.ts). Demander des modifications ou refuser une révision :changes_requestedourejectedsur la révision, la version publiée restant en ligne ; l'auteur réédite une révisionchanges_requestedet la resoumet.IlanAMG commentedon Oct 16, 2026
Chef de projet (16/10/2026) : glissé du Sprint 0 au Sprint 1, non terminé.