Files
storytime/docs/specs/jalon-1-verrouillage/02-service-verrouillage.md
T
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

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 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.