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>
2.3 KiB
2.3 KiB
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 deFailure) :LockUnsupportedFailure,LockDeniedFailure.
- Application (
features/locking/application/) :StartLockUseCase,StopLockUseCase,WatchLockStateUseCase.StopLockUseCasen'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) ouNativeChannelLockingRepository(impl. 1.3), selon décision de 1.1.
- DI : provider
lockingRepositoryProvider(override en test).
Plan TDD
- Red :
start_lock_use_case_test.dart— avec unLockingRepositorymocké renvoyantOk, le use case renvoieOk; enErr(LockDenied), propage l'échec. Échoue (types absents). - Green : créer interface + use case.
- Red :
watch_lock_state_use_case_test.dart— le stream relaie les états émis par le repo mocké. - Green : implémenter.
- Red :
kiosk_mode_locking_repository_test.dart— avec un wrapper mockable autour du plugin,startLockmappe succès→Oket exception→LockingFailure. - Green : implémenter l'impl. data avec mapping d'erreurs.
- Refactor.
Definition of Done
- Tous les tests ci-dessus verts ; aucune dépendance au plugin dans
domain//application/. tool/check.shpasse.- Étape 1.2 cochée dans
ROADMAP.md.
Risques / notes
- Garder l'API du repository minimale : start/stop/observe. Pas de fioritures.