feat(api): CRUD admin des scénarios de didacticiel (#44 — API) #59

Merged
kyuno merged 1 commit from feat/admin-tour-crud into main 2026-09-06 06:16:50 +02:00
Owner

Deuxième volet backend du tutoriel guidé, sur le socle de [PR précédente / #58]. Permet à un admin de gérer les scénarios que GET /reference/tours sert au moteur front.

API — /admin/api/tours (agrégateur admin.routes.ts, tout derrière requireAdmin)

Route Rôle
GET / Tous les scénarios (activés et désactivés) avec leurs étapes ordonnées
GET /targets Le catalogue TourTarget — pour le sélecteur de cible du formulaire
POST / Crée un scénario vide (key + name). 409 TOUR_KEY_ALREADY_IN_USE (nouveau code 4025) sur une clé prise
PATCH /:id Édite name/enabled et remplace toute la liste d'étapes en bloc (delete-all puis recreate avec order = index), même convention que recipe.service.ts's updateRecipe pour les étapes d'une recette. key immuable. 404 TOUR_NOT_FOUND (id inconnu), 404 TOUR_TARGET_NOT_FOUND (nouveau code 4054, targetKey d'une étape hors catalogue — vérifié avant d'écrire, donc les étapes existantes restent intactes si la requête est rejetée)
DELETE /:id 204 ; les étapes et les TourProgress des utilisateurs cascadent

Schémas partagés (packages/shared/src/schemas/admin.ts) : adminTourStepSchema, createTourScenarioSchema (clé lowerCamel, validée), updateTourScenarioSchema (≤ 30 étapes). Vues : AdminTourScenarioView, TourTargetView.

Tests (Mocha — admin-tours.test.ts, 11 cas)

401 sans session admin sur chaque route ; GET / liste activés + désactivés ; GET /targets ; create → patch pour remplir les étapes ; remplacement en bloc (deleteMany + recreate, compté en base) ; 409 clé dupliquée ; 404 cible inconnue sans toucher aux étapes existantes ; 404 id inconnu (PATCH et DELETE) ; delete + cascade TourScenarioStep/TourProgress vérifiée ; un scénario désactivé disparaît de /reference/tours mais reste dans la liste admin.

pnpm build + pnpm lint verts ; tests DB en CI (pas de Postgres local).

Suite

  • PR moteur front (#42) : driver.js, useTour() consommant GET /reference/tours, data-tour-*, déclenchement auto, section « Revoir » — prête, poussée juste après.
  • Page admin /admin/didacticiels (l'UI CRUD par-dessus cette API) — à faire ensuite, cy.intercept-testable comme le reste de la suite admin.

Refs #44

🤖 Generated with Claude Code

Deuxième volet backend du tutoriel guidé, sur le socle de [PR précédente / #58]. Permet à un admin de gérer les scénarios que `GET /reference/tours` sert au moteur front. ## API — `/admin/api/tours` (agrégateur `admin.routes.ts`, tout derrière `requireAdmin`) | Route | Rôle | |---|---| | `GET /` | Tous les scénarios (**activés et désactivés**) avec leurs étapes ordonnées | | `GET /targets` | Le catalogue `TourTarget` — pour le sélecteur de cible du formulaire | | `POST /` | Crée un scénario vide (`key` + `name`). 409 `TOUR_KEY_ALREADY_IN_USE` (nouveau code `4025`) sur une clé prise | | `PATCH /:id` | Édite `name`/`enabled` **et remplace toute la liste d'étapes en bloc** (delete-all puis recreate avec `order` = index), même convention que `recipe.service.ts`'s `updateRecipe` pour les étapes d'une recette. `key` immuable. 404 `TOUR_NOT_FOUND` (id inconnu), 404 `TOUR_TARGET_NOT_FOUND` (nouveau code `4054`, `targetKey` d'une étape hors catalogue — **vérifié avant d'écrire**, donc les étapes existantes restent intactes si la requête est rejetée) | | `DELETE /:id` | 204 ; les étapes et les `TourProgress` des utilisateurs cascadent | Schémas partagés (`packages/shared/src/schemas/admin.ts`) : `adminTourStepSchema`, `createTourScenarioSchema` (clé lowerCamel, validée), `updateTourScenarioSchema` (≤ 30 étapes). Vues : `AdminTourScenarioView`, `TourTargetView`. ## Tests (Mocha — `admin-tours.test.ts`, 11 cas) 401 sans session admin sur chaque route ; `GET /` liste activés + désactivés ; `GET /targets` ; create → patch pour remplir les étapes ; remplacement en bloc (`deleteMany` + recreate, compté en base) ; 409 clé dupliquée ; 404 cible inconnue **sans toucher aux étapes existantes** ; 404 id inconnu (PATCH et DELETE) ; delete + cascade `TourScenarioStep`/`TourProgress` vérifiée ; un scénario désactivé disparaît de `/reference/tours` mais reste dans la liste admin. `pnpm build` + `pnpm lint` verts ; tests DB en CI (pas de Postgres local). ## Suite - **PR moteur front** (#42) : `driver.js`, `useTour()` consommant `GET /reference/tours`, `data-tour-*`, déclenchement auto, section « Revoir » — prête, poussée juste après. - Page admin `/admin/didacticiels` (l'UI CRUD par-dessus cette API) — à faire ensuite, `cy.intercept`-testable comme le reste de la suite admin. Refs #44 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-06 05:58:42 +02:00
feat(api): CRUD admin des scénarios de didacticiel (#44)
All checks were successful
CI / lint (push) Successful in 2m57s
CI / build (push) Successful in 2m59s
CI / intent-service-test (push) Successful in 4m22s
CI / e2e (push) Successful in 9m4s
CI / test (push) Successful in 17m32s
2beff139a3
Deuxième volet backend du tutoriel guidé, sur le socle de #42/#44 : permet
à un admin de créer/éditer/supprimer les scénarios que
`GET /reference/tours` sert au moteur front.

`/admin/api/tours` (agrégateur `admin.routes.ts`, tout derrière
`requireAdmin`) :
- `GET /` — tous les scénarios (activés **et** désactivés) + étapes
  ordonnées.
- `GET /targets` — le catalogue `TourTarget` pour le sélecteur de cible de
  l'éditeur.
- `POST /` — crée un scénario vide (`key` + `name`) ; 409
  `TOUR_KEY_ALREADY_IN_USE` (nouveau code 4025) sur une clé prise.
- `PATCH /:id` — édite `name`/`enabled` **et remplace toute la liste
  d'étapes en bloc** (delete-all puis recreate avec `order` = index), même
  convention que `updateRecipe` pour les étapes d'une recette. `key`
  immuable. 404 `TOUR_NOT_FOUND` (id inconnu), 404 `TOUR_TARGET_NOT_FOUND`
  (nouveau code 4054, `targetKey` d'une étape hors catalogue — vérifié
  avant d'écrire, les étapes réelles restent intactes si la requête est
  rejetée).
- `DELETE /:id` — 204 ; les étapes et les `TourProgress` des utilisateurs
  cascadent.

Tests Mocha (`admin-tours.test.ts`) : 401 sans session admin sur chaque
route ; list (activés+désactivés) ; targets ; create→patch pour remplir
les étapes ; remplacement en bloc ; 409 clé dupliquée ; 404 cible
inconnue (sans toucher aux étapes existantes) ; 404 id inconnu ; delete +
cascade vérifiée ; un scénario désactivé disparaît de `/reference/tours`
mais reste dans la liste admin.

Refs #44
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno merged commit c21adeda72 into main 2026-09-06 06:16:50 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/batchCooking#59
No description provided.