# 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> startLock()` - `Future> stopLock()` - `Stream watchState()` - `Future 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.