# 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>> 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).