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.1 KiB
2.1 KiB
2.1 — Domaine de lecture
Objectif
Modéliser le cœur métier de la lecture : ce qu'est une histoire jouable et l'état de lecture, indépendamment de toute techno audio.
Périmètre & hors-périmètre
- Inclus : entités, value objects, interface
PlaybackRepository, use cases. - Exclus : implémentation audio (2.2), UI (2.3).
Dépendances
Jalon 0.
Conception
- Domain (
features/playback/domain/) :Episode(entité) :id,title,audioUrl,duration?,artworkUrl?. Immuable.PlaybackState(value object) :status(idle/loading/playing/paused/completed/error),current(Episode?),position,bufferedPosition.PlaybackRepository(interface) :Future<Result<Unit>> load(List<Episode> queue, {int startIndex})Future<Result<Unit>> play()/pause()/next()/previous()Future<Result<Unit>> seek(Duration position)Stream<PlaybackState> watch()
PlaybackFailure:AudioSourceFailure,PlaybackUnavailableFailure.
- Application (
features/playback/application/) :PlayStoryUseCase(charge la file + démarre à l'index voulu).TogglePlayPauseUseCase,SkipNextUseCase,SkipPreviousUseCase,SeekUseCase.WatchPlaybackStateUseCase.
Plan TDD
- Red :
playback_state_test.dart—copyWith, transitions et égalité (immuabilité) dePlaybackState. - Green : implémenter entités/value objects.
- Red :
play_story_use_case_test.dart— avecPlaybackRepositorymocké : charge la file et appelleplay; index hors bornes →Err. - Green : implémenter le use case.
- Red : use cases toggle/skip/seek — vérifient l'appel correct au repo selon l'état.
- Green : implémenter.
- Refactor.
Definition of Done
- Tests domaine + use cases verts, sans import Flutter/just_audio.
tool/check.shpasse ; étape 2.1 cochée dansROADMAP.md.
Risques / notes
Episodeest volontairement minimal ; J3 fournira de quoi le construire depuis un flux RSS. Garder le mapping RSS→Episode dans la featurepodcasts, pas ici.