Feature #1281
openFeature #1280: Tutoriels de la fiche événement (coachmarks page par page) — /EventDetails + 9 onglets
Backend — Entité TutorialState + getTutorialState/updateTutorialState (fondation)
0%
Description
Fondation de l'épic (bloque les autres). Calqué EXACTEMENT sur le pattern `OnboardingState` déjà livré (#1262).
- Entité base44 `TutorialState.jsonc` (workspace-scoped, rls) + `cd server && npm run schema:generate` (schéma Prisma généré, JAMAIS édité à la main) + migration dédiée.
- Champs : `user_email` (clé applicative), `state` JSON = `{ userId, workspaceId?, seen: Record<EventTutorialContext, boolean>, updatedAt }` avec `EventTutorialContext = evt.overview|evt.plateau|evt.budget|evt.regie|evt.contrat|evt.gestion|evt.com|evt.fdr|evt.chat|evt.emails`.
- Use-cases `getTutorialState` / `updateTutorialState` dans `server/src/application/functions/` (modelés sur `onboarding.use-cases.ts`), enregistrés via `registry.register(...)` (par défaut workspace-scoped, X-Workspace-Id imposé). `updateTutorialState` : marque `seen[ctx]=true` SANS toucher aux autres contextes ; supporte le RESET (un contexte ou les 10 → réactivation). Merge profond, `updatedAt` rafraîchi.
- Exposé via la couture AppClient par la paire `functions.invoke('getTutorialState')` / `invoke('updateTutorialState', patch)` (endpoints logiques `GET/PATCH /tutorials/:workspaceId`), sans élargir l'interface AppClient.
- Hook front `useTutorial()` (lecture + mutation optimiste TanStack Query), modelé sur `useOnboarding()`.
Dépend de : —
## Critères d'acceptation
- `GET /tutorials/:workspaceId` renvoie l'état par contexte pour (utilisateur × espace) ; défaut `seen[ctx]=false` pour tout contexte inconnu.
- `PATCH` marque `seen[ctx]=true` sans modifier les autres contextes.
- `PATCH` supporte le reset (remet un contexte OU les 10 à `seen=false`).
- Isolé par (utilisateur × espace), X-Workspace-Id imposé.
- Paire `functions.invoke` exposée via le seam et enregistrée avec `register(...)`.
- Hook `useTutorial()` (read + mutation) disponible côté front.
- Entité générée via `schema:generate` (schema.prisma non édité à la main) + migration ; tests unitaires use-cases + test de contrat AppClient verts ; `architecture.test` passe.
RA Updated by Redmine Admin about 1 month ago
- Status changed from Submitted to Preprod
- preprod_url set to https://preprod-scobby.omdev.tech
- deployed_at set to 07/01/2026
- branch set to feat/tutorials-1280
- pr_url set to https://github.com/Scobby-organisation/scobby/pull/98
Livré dans la PR #98 (→dev→preprod). Backend TutorialState (entité workspace-scoped + migration index unique) + getTutorialState/updateTutorialState (marque vu sans effet de bord + reset) + hook useTutorial(). 7 unit + 4 e2e vraie base ; test:unit serveur 250 ; typecheck OK. Sur preprod.