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>
39 lines
2.1 KiB
Markdown
39 lines
2.1 KiB
Markdown
# 3.1 — Recherche annuaire (iTunes Search)
|
|
|
|
## Objectif
|
|
Permettre au parent de rechercher un podcast par mots-clés et d'obtenir une liste
|
|
de résultats (titre, image, URL du flux RSS) prêts à être ajoutés.
|
|
|
|
## Périmètre & hors-périmètre
|
|
- Inclus : domaine `Podcast`/`PodcastSearchResult`, interface de recherche, impl. HTTP iTunes Search, use case, mapping DTO.
|
|
- Exclus : ajout/persistance (3.2/3.3), UI parent finale (J5).
|
|
|
|
## Dépendances
|
|
Jalon 0.
|
|
|
|
## Conception
|
|
- **Domain** (`features/podcasts/domain/`) :
|
|
- `Podcast` (entité) : `id`, `title`, `feedUrl`, `artworkUrl?`, `author?`.
|
|
- `PodcastSearchRepository` (interface) : `Future<Result<List<Podcast>>> search(String query)`.
|
|
- `PodcastFailure` : `SearchFailure`, `InvalidFeedFailure`, `FeedUnreachableFailure`.
|
|
- **Application** : `SearchPodcastsUseCase` (trim/garde-fou requête vide → `Err` ou liste vide selon choix documenté).
|
|
- **Data** (`features/podcasts/data/`) :
|
|
- `ItunesPodcastSearchRepository` : appelle `https://itunes.apple.com/search?media=podcast&term=...`.
|
|
- DTO `ItunesResultDto` + mapper → `Podcast` (`feedUrl` = champ `feedUrl` d'iTunes).
|
|
- Client HTTP injecté (interface fine) pour testabilité ; erreurs réseau → `SearchFailure`.
|
|
|
|
## Plan TDD
|
|
1. **Red** : `search_podcasts_use_case_test.dart` — requête non vide délègue au repo ; requête vide → comportement défini (documenter : `Err(SearchFailure)` ou `Ok([])`).
|
|
2. **Green** : implémenter le use case.
|
|
3. **Red** : `itunes_podcast_search_repository_test.dart` — client HTTP mocké renvoyant un JSON iTunes d'exemple → liste de `Podcast` correctement mappée ; HTTP 500 / timeout → `SearchFailure`.
|
|
4. **Green** : implémenter repo + mapper.
|
|
5. **Refactor**.
|
|
|
|
## Definition of Done
|
|
- Tests use case + repository verts (HTTP mocké, fixture JSON iTunes).
|
|
- `tool/check.sh` passe ; étape 3.1 cochée dans `ROADMAP.md`.
|
|
|
|
## Risques / notes
|
|
- Les résultats iTunes peuvent être larges/inadaptés ; le filtrage fin relève du parent (il choisit). Ne pas sur-filtrer côté code en v1.
|
|
- Certains résultats n'ont pas de `feedUrl` : les écarter du résultat (un podcast sans flux n'est pas exploitable).
|