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>
46 lines
2.3 KiB
Markdown
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.
|