Repository navigation
Exposer GET /routes/search et /count : bbox, filtres, tri, clusters #25
Copy link
Copy link
Closed
Labels
area:apiapps/apiapps/apiprio:P0BloquantBloquantstatus:readySpec complète, prêt à coderSpec complète, prêt à codertype:featureNouvelle fonctionnalitéNouvelle fonctionnalité
Milestone
Description
Contexte
Epic : #8
Prérequis : #133, clé de budget high dans packages/shared et en base
Maquette : sans objet — endpoint d'API sans écran propre ; le comptage alimente les filtres E-03 (voir #29), dont les planches 1 et 2 sont validées le 2026-09-23
API · Filtres-et-Recherche · Modele-de-Donnees · D-001
Comportement attendu
- Query validée par
RouteSearchQuery:bbox,audiences[],moods[],conditions[],durations[],budgets[](free,low,medium,high: le palier « Plus de 70 € » prend la cléhighau lieu depremium, posée par Passer la clé de budget premium à high et aligner les libellés de budget et de durée #133, D-016),transports[],sort,near,cursor,limit(max 50). - Combinaison : ET entre groupes ; OU dans Public et Ambiance (
&&) ; toutes les Conditions demandées (@>). - Tri
recommendeddélégué au module de recommandation (ticket dédié ; en attendant, lieux vérifiés puis récence),distancedepuisnear,duration,rating. - Réponse :
RouteCard[](id, titre, quartier, photo de couverture, ambiance principale, durée, budget bucket, nombre d'étapes, point de départ, badge de vérification) +nextCursor. - Chaque card expose
author(id,firstName,avatarUrl, ou « Widoo » pour un parcours officiel) etsteps[].category(valeur deplaces.category) pour les pastilles de la carte et la ligne créateur des cards (D-004). - Bbox trop large (surface > seuil de
settings) : réponseclusters(centroïde, compte) viaST_ClusterKMeansou grille, etitemsvide. GET /routes/search/countavec la même query. Le comptage acceptebreakdown=all_but_one: la réponse porte alors, en plus du total, le nombre de parcours obtenu en retirant chaque filtre actif pris isolément ({ count, without: { moods: 42, budgets: 18, … } }), une seule requête pour alimenter les suggestions du zéro résultat de E-03 (voir Implémenter les chips rapides et le panneau de filtres complet (E-03) #29). Les filtres sont retirés groupe par groupe, jamais valeur par valeur.- Cache HTTP court (30 s) et ETag.
Critères d'acceptation
- Tests d'intégration sur données seed : filtre par ambiance, par condition, combinaison, bbox hors zone → vide, dézoom → clusters
- p95 sous 150 ms sur 1 000 parcours seed synthétiques (script de bench fourni)
- La requête utilise les index GiST et GIN (plan d'exécution vérifié dans la PR)
-
budgets[]=highfiltre le palier « Plus de 70 € » ;budgets[]=premiumest refusé envalidation_error
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:apiapps/apiapps/apiprio:P0BloquantBloquantstatus:readySpec complète, prêt à coderSpec complète, prêt à codertype:featureNouvelle fonctionnalitéNouvelle fonctionnalité
Activity
PaulThiberville commentedon Sep 25, 2026
🔨 Démarrage — plan :
issue/25-route-search, empilée surissue/32-demo-routes(PR chore(api): créer le jeu de démonstration de 10 parcours Paris #137, elle-même sur feat(api): passer la clé de budget premium à high #136) ;packages/shared:RouteSearchQuerystrict (clé inconnue refusée),RouteCountQueryavecbreakdown=all_but_one, schémas de réponseRouteSearchResultetRouteCount;moods[]=…commemoods=…(les deux formes, normalisées), prédicats de la requête centrale entièrement paramétrés, tri par clés avec curseur opaque, clusters sur grille au-delà d'un seuil de surface lu danssettings, comptage par groupe en un seul parcours, cache public 30 s et ETag ;Tri
recommended: lieux vérifiés, officiel, puis récence, en attendant #63.test(api-client): give the step of the search card fixture a name and…
test(mobile): give the step of the discovery store fixture a name and…
test(mobile): give the step of the card text fixture a name and a time
test(mobile): give the step of the section fixture a name and a time
IlanAMG commentedon Oct 13, 2026
Chef de projet (point du 2026-10-13) : colonne À review → À déployer : ticket fermé par le merge, la colonne n'avait pas suivi. Il passe en Terminés après vérification en staging par Ilan ou Paul.