From 95711a7c44aeba4bfa799562240f25e299dd0fe6 Mon Sep 17 00:00:00 2001 From: Hermann_Kitio Date: Tue, 21 Apr 2026 03:34:49 +0300 Subject: [PATCH] =?UTF-8?q?docs(tech-debt):=20FTD-21=20documentation=20com?= =?UTF-8?q?pl=C3=A8te=20persistance=20session?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.7 (1M context) --- docs/TECH_DEBT.md | 45 +++++++++++++++++++++++++++++++++------------ 1 file changed, 33 insertions(+), 12 deletions(-) diff --git a/docs/TECH_DEBT.md b/docs/TECH_DEBT.md index 1595a6e..48372cf 100644 --- a/docs/TECH_DEBT.md +++ b/docs/TECH_DEBT.md @@ -270,21 +270,42 @@ 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. +**Statut :** Partiellement résolu — `/simulation/ee` en cours -**À 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`) +**Pages concernées par ordre de priorité :** -**À 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é +🔴 **`/simulation/ee`** (cette session) +- Autosave contenu toutes les 30 s +- Save on `beforeunload` +- Reprise au refresh via `localStorage` + `GET /simulations/:id` -**Condition de résolution :** session dédiée après G1-G5. +🟡 **`/simulation/eo`** (Sprint 4) +- Identique EE + état audio/enregistrement + +🟡 **`/examen`** (Sprint 7) +- Autosave critique — timer inarrêtable + 3 tâches +- Crash pendant examen = perte totale + +🟢 **`/sujets`** (inclus dans cette session) +- `localStorage simulation_id` suffit +- Pas d'autosave (pas de données saisies) + +❌ **Pas nécessaire :** `/dashboard`, `/rapport/:id`, `/historique`, `/progression` + +**À faire pour `/simulation/ee` :** + +Backend : +- Migration Supabase : ajouter `sujet_id uuid REFERENCES sujets(id)` dans `productions` +- `simulationController` : stocker `sujet_id` à la création +- `GET /simulations/:id` : retourner sujet associé +- Nouveau endpoint `PATCH /simulations/:id/contenu` pour autosave + +Frontend : +- `localStorage` : stocker/lire `simulation_id` courant +- `SimulationForm` : autosave debounce 30 s + save on `beforeunload` +- `SimulationFlowProvider` : au chargement, détecter simulation en cours via `localStorage` → `GET /simulations/:id` → restaurer state + +**Condition de résolution :** session dédiée après G1-G5 (EE d'abord, EO + examen ultérieurement). ---