Files
Vincent Bourdon 16fd4c8c36 docs: cadrage initial Storytime (specs par jalon, roadmap, CLAUDE.md)
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>
2026-06-19 17:03:33 +02:00

46 lines
2.3 KiB
Markdown

# 1.2 — Service de verrouillage (domaine + use cases)
## Objectif
Encapsuler l'épinglage derrière une interface de domaine propre et des use cases
testables, indépendants de l'implémentation (plugin ou natif).
## Périmètre & hors-périmètre
- Inclus : interface `LockingRepository`, use cases, impl. data branchée sur le résultat de 1.1, providers Riverpod.
- Exclus : UI enfant (jalon 4) ; c'est elle qui appellera ces use cases.
## Dépendances
1.1 (faisabilité prouvée).
## Conception
- **Domain** (`features/locking/domain/`) :
- `LockState` (value object / enum) : `unlocked`, `locked`, `unsupported`.
- `LockingRepository` (interface) :
- `Future<Result<Unit>> startLock()`
- `Future<Result<Unit>> stopLock()`
- `Stream<LockState> watchState()`
- `Future<LockState> currentState()`
- `LockingFailure` (sous-type de `Failure`) : `LockUnsupportedFailure`, `LockDeniedFailure`.
- **Application** (`features/locking/application/`) :
- `StartLockUseCase`, `StopLockUseCase`, `WatchLockStateUseCase`.
- `StopLockUseCase` **n'autorise pas** la sortie système ; il ne fait que demander l'arrêt de l'épinglage (la confirmation reste au système). À documenter.
- **Data** (`features/locking/data/`) :
- `KioskModeLockingRepository` (impl. via plugin) **ou** `NativeChannelLockingRepository` (impl. 1.3), selon décision de 1.1.
- **DI** : provider `lockingRepositoryProvider` (override en test).
## Plan TDD
1. **Red** : `start_lock_use_case_test.dart` — avec un `LockingRepository` mocké renvoyant `Ok`, le use case renvoie `Ok` ; en `Err(LockDenied)`, propage l'échec. Échoue (types absents).
2. **Green** : créer interface + use case.
3. **Red** : `watch_lock_state_use_case_test.dart` — le stream relaie les états émis par le repo mocké.
4. **Green** : implémenter.
5. **Red** : `kiosk_mode_locking_repository_test.dart` — avec un wrapper mockable autour du plugin, `startLock` mappe succès→`Ok` et exception→`LockingFailure`.
6. **Green** : implémenter l'impl. data avec mapping d'erreurs.
7. **Refactor**.
## Definition of Done
- Tous les tests ci-dessus verts ; aucune dépendance au plugin dans `domain/`/`application/`.
- `tool/check.sh` passe.
- Étape 1.2 cochée dans `ROADMAP.md`.
## Risques / notes
- Garder l'API du repository minimale : start/stop/observe. Pas de fioritures.