Project

General

Profile

Actions

Feature #1281

open
RA

Feature #1280: Tutoriels de la fiche événement (coachmarks page par page) — /EventDetails + 9 onglets

Backend — Entité TutorialState + getTutorialState/updateTutorialState (fondation)

Feature #1281: Backend — Entité TutorialState + getTutorialState/updateTutorialState (fondation)

Added by Redmine Admin about 1 month ago. Updated about 1 month ago.

Status:
Preprod
Priority:
Normal
Assignee:
-
Start date:
07/01/2026
Due date:
% Done:

0%

Estimated time:
spec_ref:
build_status:
build_number:
ci_run_url:
scan_status:
scan_report_url:
deploy_status:
preprod_url:
https://preprod-scobby.omdev.tech
deployed_at:
07/01/2026
branch:
feat/tutorials-1280
pr_url:
https://github.com/Scobby-organisation/scobby/pull/98
security_key:
severity:
paused:

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.

Actions

Also available in: PDF Atom