feat(production): exposer SujetData dans Production + FTD-21 persistance session

This commit is contained in:
Hermann_Kitio 2026-04-20 23:05:01 +03:00
parent b16dbfa1c8
commit e130d3792e
3 changed files with 42 additions and 0 deletions

View file

@ -268,6 +268,26 @@ Vient du pattern `c.json(result, result.status)` où `result` contient déjà `s
---
### FTD-21 — Persistance session simulation
**Priorité :** 🔴 Critique
**Statut :** Ouvert — session backend + frontend requise
**Estimation de session :** ~2 jours (1 jour backend + 1 jour frontend)
**Description :** Si l'utilisateur rafraîchit la page ou fait « retour » pendant une simulation, la production et le sujet sont perdus. L'utilisateur doit pouvoir reprendre exactement où il en était.
**À faire (backend) :**
- Ajouter colonne `sujet_id` (FK → `sujets.id`) dans `productions` pour persister le sujet associé à chaque simulation
- Autosave du contenu de la textarea toutes les 30 s via `PATCH /simulations/:id/contenu`
- `GET /simulations/:id` retourne aussi le sujet associé (joint sur `sujet_id`)
**À faire (frontend) :**
- `useSimulation` détecte si une simulation est en cours au chargement (via `localStorage` ou URL param)
- Reprend la `production` + `sujet` depuis `GET /simulations/:id`
- La textarea reprend le contenu sauvegardé
**Condition de résolution :** session dédiée après G1-G5.
---
## 4. Tests à renforcer
### FTD-09 — Tests de la state machine T2 Live non implémentés
@ -334,3 +354,4 @@ Vient du pattern `c.json(result, result.status)` où `result` contient déjà `s
| 1.5 | 2026-04-19 | Ajout FTD-17 (clé ['plan'] dupliquée entre features — Sprint 3 étape 14) |
| 1.6 | 2026-04-20 | Ajout FTD-18 (SimulationForm shadcn Button — Sprint 0.5 bis D2) ; ajout FTD-19 (token --shadow-focus manquant — Sprint 0.5 bis D2) |
| 1.7 | 2026-04-20 | Ajout FTD-20 🔴 (GET /simulations/:id manquant backend — bloque RapportPage Sprint 3 étape 15) |
| 1.8 | 2026-04-20 | Ajout FTD-21 🔴 (persistance session simulation — prod + sujet perdus au refresh, session dédiée après G1-G5) |

View file

@ -17,6 +17,25 @@ export type Tache = 'EE_T1' | 'EE_T2' | 'EE_T3' | 'EO_T1' | 'EO_T3'
/** Mode de la simulation — examen uniquement accessible au plan Premium. */
export type Mode = 'entrainement' | 'examen'
/**
* Sujet d'examen (consigne + documents) associé à une production.
*
* Retourné par `POST /simulations` depuis la table `sujets` (filtrage actif + tâche).
* `null` lorsque la table ne contient aucun sujet actif pour la tâche, ou pour `EO_T2_LIVE`
* (interaction live sans sujet pré-défini). Voir TECH_DEBT FTD-21 pour la persistance
* via `GET /simulations/:id` (pas encore branchée).
*/
export interface SujetData {
id: string
consigne: string
role: string | null
contexte: string | null
doc1_titre: string | null
doc1_texte: string | null
doc2_titre: string | null
doc2_texte: string | null
}
/**
* Réponse du backend pour `POST /simulations` (HTTP 201) et `GET /simulations/:id`.
* Format confirmé par l'audit backend 2026-04-17 (cf. ARCHITECTURE.md §5).
@ -26,6 +45,7 @@ export interface Production {
tache: Tache
mode: Mode
created_at: string
sujet: SujetData | null
}
/** Corps de la requête `POST /simulations`. */

View file

@ -31,6 +31,7 @@ const mockProduction: Production = {
tache: 'EE_T1',
mode: 'entrainement',
created_at: '2026-04-19T00:00:00Z',
sujet: null,
}
const mockReport: Report = {