# 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>> all()` - `Future> add(Podcast podcast)` (idempotent sur `feedUrl`) - `Future> remove(String id)` - `Stream> 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.