Files
storytime/docs/specs/jalon-3-podcasts/03-persistance-abonnements.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

45 lines
2.2 KiB
Markdown

# 3.3 — Persistance des abonnements + CRUD
## Objectif
Stocker localement les podcasts auxquels le parent a souscrit, et offrir les use
cases pour les lister, ajouter et supprimer.
## Périmètre & hors-périmètre
- Inclus : table SQLite des abonnements, `SubscriptionRepository`, use cases CRUD, providers.
- Exclus : UI de gestion finale (J5) ; cache des épisodes (streaming, pas de cache v1).
## Dépendances
3.1, 3.2.
## Conception
- **Domain** (`features/podcasts/domain/`) :
- `Subscription` (entité) : `id`, `podcast` (`Podcast`), `addedAt`.
- `SubscriptionRepository` (interface) :
- `Future<Result<List<Subscription>>> all()`
- `Future<Result<Unit>> add(Podcast podcast)` (idempotent sur `feedUrl`)
- `Future<Result<Unit>> remove(String id)`
- `Stream<List<Subscription>> watch()`
- **Application** : `ListSubscriptionsUseCase`, `AddSubscriptionUseCase` (refuse un doublon de `feedUrl`), `RemoveSubscriptionUseCase`.
- **Data** (`features/podcasts/data/`) :
- `SqliteSubscriptionRepository` (`sqflite`/`drift`). Table `subscriptions(id, title, feed_url UNIQUE, artwork_url, author, added_at)`.
- DTO/mapper ligne ↔ `Subscription`.
- **DI** : provider du repository ; base ouverte via un provider initialisé au démarrage.
## Plan TDD
1. **Red** : `add_subscription_use_case_test.dart` — ajout d'un nouveau `feedUrl``Ok` ; doublon → `Err`/no-op documenté.
2. **Green** : implémenter le use case.
3. **Red** : `list/remove` use cases — délèguent correctement au repo mocké.
4. **Green** : implémenter.
5. **Red** : `sqlite_subscription_repository_test.dart` — sur une base SQLite en mémoire : add→all renvoie l'élément ; contrainte UNIQUE respectée ; remove supprime ; `watch` émet après modification.
6. **Green** : implémenter le repo + schéma.
7. **Refactor**.
## Definition of Done
- Tests use cases + repo (SQLite en mémoire) verts.
- Les abonnements persistent après redémarrage de l'app (vérif. manuelle).
- `tool/check.sh` passe ; étape 3.3 cochée dans `ROADMAP.md`.
## Risques / notes
- Migrations : prévoir un numéro de version de schéma dès le départ, même simple.
- Source unique de vérité de la liste = ce repository ; l'UI enfant (J4) lira les épisodes via les abonnements.