Sources externes : Manger Bouger sans filtre s'arrête à la première page #78
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Contexte
En parcourant la source Manger Bouger dans l'onglet Sources
(
/recettes) sans filtre texte, le défilement infini s'arrête après lapremière page (9 recettes) au lieu de dérouler tout le catalogue de la
Fabrique à Menus (plusieurs milliers de recettes). Constaté sur l'app
déployée.
Avec un filtre texte (
?query=<mot-clé>), la pagination fonctionnenormalement — seul le parcours « tout voir » (filtre vide) est touché.
L'adaptateur
apps/api/src/sources/manger-bouger.tscible déjà le bonschéma d'URL (
?diet=ALL&page=N), celui quemangerbouger.frpaginecorrectement :
https://www.mangerbouger.fr/manger-mieux/la-fabrique-a-menus/recettes?diet=ALL&page=1Ce qui a été vérifié
manger-bouger.ts:287-288construit toujours l'URL avec un paramètrequeryfinal, même vide :(
browseSourceSchema,packages/shared/src/schemas/sources.ts:4-7, faitarriver le filtre vide en
undefined; l'adaptateur le transforme en""et ajoute quand même
&query=.)Cette URL exacte (
?diet=ALL&page=N&query=) a été testée en direct depuistrois clients — navigateur,
curl, et lefetchnatif de Node 22 (leruntime de l'API) — sur les pages 1, 2, 3, 5, 10, 25, 50, 100 :
hasMorePages: truejusqu'au bout, puishasMorePages: false+ listevide au-delà de la dernière page (fin propre).
Depuis une machine de dev, l'URL avec
&query=vide pagine donccorrectement. Le blocage n'est reproductible que sur le serveur
déployé — la raison serveur/CDN exacte reste une hypothèse (voir plus
bas), mais le correctif n'a pas besoin de la trancher.
Côté front, le garde-fou anti-boucle ajouté pour l'issue #38
(
apps/web/src/features/recipes/sources/RecipeSourcesPanel.tsx:239-254)traite « cette page n'apporte aucun
externalIdnouveau » comme une fin deliste (
nextCursor: null) :Si, côté serveur déployé, la page 2 du parcours
&query=vide revientidentique à la page 1 (cache CDN qui normalise le
query=vide et sertla page 1 pour tout
page=N, ou rendu serveur qui ignorepageenl'absence de
queryréel), alorsfreshItemsest vide, ce garde-fou coupele défilement, et on ne voit que 9 recettes. Le garde-fou fait son travail
— la cause est en amont, dans la requête envoyée par l'adaptateur.
Cause
L'adaptateur envoie un
&query=vide superflu sur le parcours sans filtre,au lieu de la requête « catalogue » nue
?diet=ALL&page=Nquemangerbouger.frpagine réellement. Aucun des autres adaptateurs scrapésn'ajoute un paramètre de recherche vide à un endpoint paginé —
marmiton.ts:117-121,quitoque.ts:114-141etohmonbento.ts:100-104conditionnent le paramètre ; seul
manger-bouger.tsl'ajoutesystématiquement.
Correctif proposé
manger-bouger.ts,list()— n'ajouter&query=que si le filtre est nonvide, comme les adaptateurs voisins :
diet=ALLreste (présent aussi dans l'URL de référence). Le chemin filtré(
&query=<mot-clé>) ne change pas — il fonctionne déjà et doit continuer.Corriger aussi les commentaires de
LIST_URL(l.16-25) et dehasMorePages(l.45) : ils affirment une pagination « vérifiée en direct »sans préciser que ça ne valait que pour le chemin avec
querytexte.Fichiers à toucher
apps/api/src/sources/manger-bouger.ts—list(): paramètrequeryconditionnel ; commentaires
LIST_URL/hasMorePagesmis à jour.apps/api/test/recipe-sources/manger-bouger.test.ts— ledescribe("list")(l.84-185) n'a aucun cas sansquery. Ajouter :list({})(filtre absent) construit une URL sans paramètrequery(pas de
&query=final) — modèle : le test de capture d'URL l.120-133(
requestedUrl) + les helpersstubFetchHtml/htmlWithListNextData.list({})renvoie unnextCursornon nul quand__NEXT_DATA__portehasMorePages: true.list({ query: "salade" })ajoute toujours&query=salade(nonrégression du chemin filtré).
Vérification
api,curlsur…/recettes?diet=ALL&page=1&query=puis&page=2,comparer les
slugdu__NEXT_DATA__(recouvrement = bug confirmé) ;refaire sans le
&query=.pnpm --filter @batch-cooking/api test(Mocha) — nouveaux cas verts.défilement dépasse la première page et déroule le catalogue ; avec un
filtre → toujours OK.
Hors scope
freshItems.length === 0deRecipeSourcesPanel.tsx(issue #38) : correct tel quel, il cesse simplement de se déclencher une
fois la requête corrigée.
list()quand__NEXT_DATA__estabsent (
{ items: [], nextCursor: null }sans rien signaler,manger-bouger.ts:66-74+ l.306) — pas la cause ici (la page 2 revientavec des items, juste dupliqués) ; à traiter séparément si besoin.
specs/backend-architecture.md,déjà obsolète pour Marmiton/750g/Manger Bouger (aucun n'y a de puce
dédiée) — rattrapage global à part, cf. issue #37.
🤖 Filed by Claude Code