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

2.2 KiB

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