16fd4c8c36
Lecteur d'histoires cadenassé pour le coucher (Android/Flutter). - CLAUDE.md : principes craftsmanship/TDD/clean code/clean archi + decisions techniques - ROADMAP.md : suivi haut niveau des 7 jalons, a tenir a jour par etape - docs/specs/ : specs completes decoupees par jalon, etapes en sous-fichiers - .gitignore Flutter (pubspec.lock versionne, projet applicatif) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
40 lines
2.2 KiB
Markdown
40 lines
2.2 KiB
Markdown
# 5.1 — Création du code au premier lancement
|
|
|
|
## Objectif
|
|
Au tout premier lancement, obliger le parent à créer un code à 4 chiffres (saisi
|
|
deux fois pour confirmation) avant d'accéder à l'app.
|
|
|
|
## Périmètre & hors-périmètre
|
|
- Inclus : détection « pas de code défini », écran de création (double saisie + validation), enregistrement.
|
|
- Exclus : stockage technique détaillé (5.2), porte d'accès (5.3).
|
|
|
|
## Dépendances
|
|
Jalon 0. (Le stockage de 5.2 peut être développé en parallèle/avant ; ici on consomme son interface.)
|
|
|
|
## Conception
|
|
- **Domain** (`features/parental/domain/`) :
|
|
- `ParentalCode` (value object) : exactement 4 chiffres ; invariant validé à la construction (sinon `Err(InvalidCodeFormat)`).
|
|
- `ParentalCodeRepository` (interface) : `Future<bool> isConfigured()`, `Future<Result<Unit>> setCode(ParentalCode code)`, `Future<bool> verify(ParentalCode code)`. (Impl. en 5.2.)
|
|
- **Application** :
|
|
- `IsCodeConfiguredUseCase`, `SetParentalCodeUseCase` (refuse si déjà configuré, ou autorise via flux dédié — documenter).
|
|
- **Presentation** :
|
|
- Au démarrage, `IsCodeConfiguredUseCase` décide : non configuré → `CreateCodeView` bloquant ; configuré → espace enfant.
|
|
- `CreateCodeView` : saisie 1 + saisie 2, contrôle d'égalité, format 4 chiffres, gros pavé numérique adapté.
|
|
|
|
## Plan TDD
|
|
1. **Red** : `parental_code_test.dart` — `ParentalCode('1234')` OK ; `'12'`, `'12a4'`, `''` → invalides.
|
|
2. **Green** : implémenter le value object.
|
|
3. **Red** : `set_parental_code_use_case_test.dart` — délègue à `setCode` ; refuse si déjà configuré (selon règle documentée).
|
|
4. **Green** : implémenter.
|
|
5. **Red** : `create_code_view_test.dart` (widget) — deux saisies différentes → erreur affichée, pas d'enregistrement ; deux saisies égales valides → `SetParentalCodeUseCase` appelé.
|
|
6. **Green** : implémenter l'écran.
|
|
7. **Refactor**.
|
|
|
|
## Definition of Done
|
|
- Tests value object + use case + widget verts.
|
|
- Premier lancement impose la création ; lancement ultérieur ne la redemande pas.
|
|
- `tool/check.sh` passe ; étape 5.1 cochée dans `ROADMAP.md`.
|
|
|
|
## Risques / notes
|
|
- Ne jamais logguer le code. Le value object ne doit pas exposer la valeur en clair dans `toString`.
|