diff --git a/GOAL.md b/GOAL.md index 07fc8cf..751fb59 100644 --- a/GOAL.md +++ b/GOAL.md @@ -4,7 +4,7 @@ Flashcards est application web SPA PWA permet d'afficher des cartes sur des suje ## Principe du jeu -Le jeu consiste à afficher une carte au hasard. +Le jeu consiste à afficher une carte au hasard. une question ou un terme apparaît. La réponse est cachée. Si l'utilisateur souhaite consuletr la réponse, il peut faire dérouler la réponse. Il est néanmoins possible de sélectionner une carte au hasard sur un thème plus précis : code, langage, etc... @@ -34,4 +34,3 @@ Les composants d'accès aux données devront être le plus génériques possible - Docker via docker-compose - Volumes managés - diff --git a/TODO.md b/TODO.md index 452c3fb..078f8a9 100644 --- a/TODO.md +++ b/TODO.md @@ -25,18 +25,18 @@ Application web **SPA + PWA** : Flashcards affiche des cartes (questions/répons > Chaque exigence doit être satisfaite avant de considérer la feature terminée. -| Ref | Exigence | Critère d'acceptation | -|-----|----------|------------------------| -| F-01 | Afficher une carte au hasard | Un clic sur « Jouer » affiche UNE carte tirée aléatoirement de l'ensemble des cartes | -| F-02 | Dans un tirage aléatoire, la question est visible et la réponse cachée | Le terme/question s'affiche ; la réponse ne s'affiche pas | -| F-03 | Révéler la réponse | Un clic (ou action) déroule/affiche la réponse cachée ; un second clic la masque | -| F-04 | Tirer une carte au hasard **par thème** | L'utilisateur choisit un thème ; le tirage se fait uniquement parmi les cartes de ce thème | -| F-05 | Créer une carte | Formulaire de création avec question, réponse et thème ; la carte est persistée | -| F-06 | Modifier une carte | Formulaire pré-rempli ; la modification est persistée | -| F-07 | Supprimer une carte | Confirmation avant suppression ; la carte disparaît de la liste | -| F-08 | Lister les cartes | La liste complète des cartes s'affiche (avec au minimum question + thème) | -| F-09 | Consulter une carte spécifique | L'accès direct à une carte (via sa route/id) affiche son détail complet | -| F-10 | Thèmes | L'utilisateur peut choisir un thème reflétant les cartes existantes | +| Ref | Exigence | Critère d'acceptation | +| ---- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ | +| F-01 | Afficher une carte au hasard | Un clic sur « Jouer » affiche UNE carte tirée aléatoirement de l'ensemble des cartes | +| F-02 | Dans un tirage aléatoire, la question est visible et la réponse cachée | Le terme/question s'affiche ; la réponse ne s'affiche pas | +| F-03 | Révéler la réponse | Un clic (ou action) déroule/affiche la réponse cachée ; un second clic la masque | +| F-04 | Tirer une carte au hasard **par thème** | L'utilisateur choisit un thème ; le tirage se fait uniquement parmi les cartes de ce thème | +| F-05 | Créer une carte | Formulaire de création avec question, réponse et thème ; la carte est persistée | +| F-06 | Modifier une carte | Formulaire pré-rempli ; la modification est persistée | +| F-07 | Supprimer une carte | Confirmation avant suppression ; la carte disparaît de la liste | +| F-08 | Lister les cartes | La liste complète des cartes s'affiche (avec au minimum question + thème) | +| F-09 | Consulter une carte spécifique | L'accès direct à une carte (via sa route/id) affiche son détail complet | +| F-10 | Thèmes | L'utilisateur peut choisir un thème reflétant les cartes existantes | --- @@ -44,15 +44,15 @@ Application web **SPA + PWA** : Flashcards affiche des cartes (questions/répons ### Entité `Card` -| Champ | Type | Contrainte | Description | -|-------------|------------|-------------------|------------------------------------------| -| `id` | string/INT | unique (PK) | Identifiant stable de la carte | -| `question` | string | requis | Terme ou question affiché | -| `response` | string | requis | Réponse cachée puis révélée | -| `theme` | string | requis | Thème/catégorie (ex. « code », « javascript ») | -| `tags` | string[] | optionnel | Mots-clés additionnels | -| `createdAt` | datetime | auto | Date de création | -| `updatedAt` | datetime | auto | Date de dernière modification | +| Champ | Type | Contrainte | Description | +| ----------- | ---------- | ----------- | ---------------------------------------------- | +| `id` | string/INT | unique (PK) | Identifiant stable de la carte | +| `question` | string | requis | Terme ou question affiché | +| `response` | string | requis | Réponse cachée puis révélée | +| `theme` | string | requis | Thème/catégorie (ex. « code », « javascript ») | +| `tags` | string[] | optionnel | Mots-clés additionnels | +| `createdAt` | datetime | auto | Date de création | +| `updatedAt` | datetime | auto | Date de dernière modification | > La liste des thèmes peut être dérivée dynamiquement des valeurs `theme` distinctes présentes en base (simplicité) ou gérée en entité `Theme` dédiée (robustesse). Choix à figer en phase de conception. @@ -118,6 +118,7 @@ Une feature est « faite » si et seulement si : > Ordre d'exécution recommandé. Passer à la phase suivante uniquement si la DoD de la phase courante est remplie. ### Phase 0 — Scaffolding + - [ ] Initialiser le projet Next.js + TypeScript (strict) - [ ] Configurer Tailwind - [ ] Configurer ESLint + Prettier @@ -126,6 +127,7 @@ Une feature est « faite » si et seulement si : - [ ] DoD : `lint`, `format`, `typecheck`, `test` s'exécutent sans erreur sur un squelette ### Phase 1 — Données et couche d'accès générique + - [ ] Schéma MySQL (table `cards`) + migration/seed - [ ] Schéma MongoDB (collection `cards`) + seed - [ ] Interface générique `CardRepository` (contrat complet) @@ -136,6 +138,7 @@ Une feature est « faite » si et seulement si : - [ ] DoD : phase 0 + les 2 repositories testés et interchangeables ### Phase 2 — API / services métier + - [ ] Service métier `CardService` reposant uniquement sur l'abstraction repository - [ ] Routes API : liste, détail, création, modification, suppression - [ ] Routes API : tirage aléatoire simple + tirage aléatoire par thème + liste des thèmes @@ -145,6 +148,7 @@ Une feature est « faite » si et seulement si : - [ ] DoD : phases précédentes + contexte de MCP de l'API ### Phase 3 — Interface utilisateur + - [ ] Page/vue **liste des cartes** (F-08) - [ ] Page/vue **détail d'une carte** (F-09) - [ ] Formulaire **création** (F-05) @@ -155,12 +159,14 @@ Une feature est « faite » si et seulement si : - [ ] DoD : phases précédentes + parcours utilisateur complet fonctionnel ### Phase 4 — Tests + - [ ] Tests des composants UI (composants critiques) - [ ] Couverture des critères F-01 à F-10 - [ ] Coverage au seuil défini (Phase 0) - [ ] DoD : toutes phases précédentes vertes + coverage ok ### Phase 5 — PWA, déploiement + - [ ] Manifest PWA + service worker (installable, hors-ligne) — la stack SPA le permet - [ ] `docker-compose.yml` : `web`, `mysql`, `mongo` - [ ] Volumes nommés pour l'ensemble des données @@ -176,4 +182,4 @@ Une feature est « faite » si et seulement si : - [ ] Couverture : seuil de coverage exact - [ ] Selon cas : `Theme` en table dédiée vs dérivation des `theme` distincts - [ ] Choix par défaut de l'implémentation repository pour la prod (MySQL ou Mongo) -- [ ] Authentification éventuelle (hors périmètre README, à confirmer si nécessaire) \ No newline at end of file +- [ ] Authentification éventuelle (hors périmètre README, à confirmer si nécessaire)