fix(sources): Manger Bouger sans filtre déroule tout le catalogue (#78) #126

Merged
kyuno merged 1 commit from fix/manger-bouger-empty-filter into main 2026-09-08 21:14:37 +02:00
Owner

Le parcours « tout voir » (filtre texte vide) de la source Manger Bouger dans l'onglet Sources s'arrêtait après la 1ʳᵉ page (9 recettes) sur le serveur déployé, au lieu de dérouler tout le catalogue de la Fabrique à Menus.

Cause

manger-bouger.ts list() construisait toujours l'URL avec un &query= final, même vide :

…/recettes?diet=ALL&page=N&query=      ← filtre vide

Sur le serveur déployé, cette URL renvoie la page 1 pour tout page=N (hypothèse : cache CDN qui replie le query= vide, ou rendu serveur qui ignore page sans query réel — non reproductible depuis une machine de dev, où l'URL avec &query= vide pagine correctement). La page 2 revenant identique à la page 1, le garde-fou anti-boucle de #38 (RecipeSourcesPanel.tsx — « 0 nouvel externalId ⇒ fin de liste ») coupe le défilement. Le garde-fou fait son travail ; la cause est en amont.

Aucun autre adaptateur scrapé n'ajoute un paramètre de recherche vide à un endpoint paginé — marmiton.ts / quitoque.ts / ohmonbento.ts le conditionnent tous ; seul manger-bouger.ts l'ajoutait systématiquement.

Correctif

  • manger-bouger.ts list() — n'ajoute &query= que si le terme de recherche est non vide (après trim). La requête catalogue nue ?diet=ALL&page=N (que mangerbouger.fr pagine réellement) est désormais utilisée pour le parcours sans filtre. diet=ALL conservé. Le chemin filtré (&query=<mot-clé>) est inchangé.
  • Commentaires LIST_URL / hasMorePages corrigés : la pagination « vérifiée en direct » ne valait que pour le chemin avec un terme query.
  • manger-bouger.test.ts — 4 cas ajoutés au describe("list") (qui n'avait aucun cas sans query, d'où la régression) :
    • list({}) construit exactement …/recettes?diet=ALL&page=1 (sans query=) ;
    • un query composé uniquement d'espaces = pas de filtre ;
    • le parcours catalogue pagine quand même (nextCursor non nul si hasMorePages) ;
    • list({ query: "salade" }) ajoute toujours &query=salade (non-régression du chemin filtré).

Hors scope

  • Le garde-fou freshItems.length === 0 de #38 : correct tel quel, il cesse simplement de se déclencher une fois la requête corrigée.
  • La section « Adaptateurs concrets » de specs/backend-architecture.md, déjà obsolète pour Marmiton/750g/Manger Bouger (cf. #37).

Vérifié localement

pnpm lint ✅ · pnpm build (tsc api + web, vite) ✅. Mocha → CI (pas de Postgres local ; les nouveaux cas suivent exactement le motif de capture d'URL déjà présent dans le fichier).

Closes #78.

🤖 Generated with Claude Code

Le parcours « tout voir » (filtre texte vide) de la source **Manger Bouger** dans l'onglet Sources s'arrêtait après la 1ʳᵉ page (9 recettes) sur le serveur déployé, au lieu de dérouler tout le catalogue de la Fabrique à Menus. ## Cause `manger-bouger.ts` `list()` construisait **toujours** l'URL avec un `&query=` final, même vide : ``` …/recettes?diet=ALL&page=N&query= ← filtre vide ``` Sur le serveur déployé, cette URL renvoie la **page 1 pour tout `page=N`** (hypothèse : cache CDN qui replie le `query=` vide, ou rendu serveur qui ignore `page` sans `query` réel — non reproductible depuis une machine de dev, où l'URL avec `&query=` vide pagine correctement). La page 2 revenant identique à la page 1, le garde-fou anti-boucle de #38 (`RecipeSourcesPanel.tsx` — « 0 nouvel `externalId` ⇒ fin de liste ») coupe le défilement. Le garde-fou fait son travail ; la cause est en amont. Aucun autre adaptateur scrapé n'ajoute un paramètre de recherche vide à un endpoint paginé — `marmiton.ts` / `quitoque.ts` / `ohmonbento.ts` le conditionnent tous ; seul `manger-bouger.ts` l'ajoutait systématiquement. ## Correctif - **`manger-bouger.ts` `list()`** — n'ajoute `&query=` que si le terme de recherche est non vide (après `trim`). La requête catalogue nue `?diet=ALL&page=N` (que `mangerbouger.fr` pagine réellement) est désormais utilisée pour le parcours sans filtre. `diet=ALL` conservé. Le chemin filtré (`&query=<mot-clé>`) est inchangé. - Commentaires `LIST_URL` / `hasMorePages` corrigés : la pagination « vérifiée en direct » ne valait que pour le chemin avec un terme `query`. - **`manger-bouger.test.ts`** — 4 cas ajoutés au `describe("list")` (qui n'avait **aucun** cas sans `query`, d'où la régression) : - `list({})` construit exactement `…/recettes?diet=ALL&page=1` (sans `query=`) ; - un `query` composé uniquement d'espaces = pas de filtre ; - le parcours catalogue pagine quand même (`nextCursor` non nul si `hasMorePages`) ; - `list({ query: "salade" })` ajoute toujours `&query=salade` (non-régression du chemin filtré). ## Hors scope - Le garde-fou `freshItems.length === 0` de #38 : correct tel quel, il cesse simplement de se déclencher une fois la requête corrigée. - La section « Adaptateurs concrets » de `specs/backend-architecture.md`, déjà obsolète pour Marmiton/750g/Manger Bouger (cf. #37). ## Vérifié localement `pnpm lint` ✅ · `pnpm build` (tsc api + web, vite) ✅. Mocha → CI (pas de Postgres local ; les nouveaux cas suivent exactement le motif de capture d'URL déjà présent dans le fichier). Closes #78. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
kyuno added 1 commit 2026-09-08 20:55:14 +02:00
fix(sources): Manger Bouger sans filtre déroule tout le catalogue (#78)
All checks were successful
CI / lint (push) Successful in 2m48s
CI / build (push) Successful in 2m53s
CI / intent-service-test (push) Successful in 4m29s
CI / e2e (push) Successful in 9m49s
CI / test (push) Successful in 18m54s
CI / build-android (push) Has been skipped
7d20404b6f
Le parcours « tout voir » (filtre texte vide) de la source Manger Bouger
s'arrêtait après la 1re page (9 recettes) sur le serveur déployé.

Cause : `list()` ajoutait toujours un `&query=` final, même vide. Sur le
serveur déployé, `…/recettes?diet=ALL&page=N&query=` renvoyait la page 1
pour tout `N`, et le garde-fou anti-boucle de #38 (« 0 nouvel externalId
⇒ fin de liste ») coupait le défilement. La requête catalogue nue
`?diet=ALL&page=N` pagine correctement.

- `manger-bouger.ts` `list()` : n'ajoute `&query=` que si le terme de
  recherche est non vide (après `trim`), comme les adaptateurs voisins
  (marmiton / quitoque / ohmonbento). Le chemin filtré ne change pas.
- Commentaires `LIST_URL` / `hasMorePages` corrigés : la pagination
  « vérifiée en direct » ne valait que pour le chemin avec `query` texte.
- Tests `manger-bouger.test.ts` : `list({})` construit une URL sans
  paramètre `query` ; un `query` blanc = pas de filtre ; le catalogue nu
  pagine quand même (`nextCursor`) ; `list({ query: salade })` ajoute
  toujours `&query=salade` (non-régression).

Closes #78.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
kyuno merged commit b20bcca07e into main 2026-09-08 21:14:37 +02:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: kyuno/batchCooking#126
No description provided.