Skip to content

Exposer GET /routes/search et /count : bbox, filtres, tri, clusters #25

Closed

Description

@IlanAMG

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é high au lieu de premium, 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 recommended délégué au module de recommandation (ticket dédié ; en attendant, lieux vérifiés puis récence), distance depuis near, 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) et steps[].category (valeur de places.category) pour les pastilles de la carte et la ligne créateur des cards (D-004).
  • Bbox trop large (surface > seuil de settings) : réponse clusters (centroïde, compte) via ST_ClusterKMeans ou grille, et items vide.
  • GET /routes/search/count avec la même query. Le comptage accepte breakdown=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[]=high filtre le palier « Plus de 70 € » ; budgets[]=premium est refusé en validation_error

Activity

  1. added this to the v0.2 milestone on Sep 21, 2026
  2. PaulThiberville commented on Sep 25, 2026

    @PaulThiberville
    Collaborator

    🔨 Démarrage — plan :

    • branche issue/25-route-search, empilée sur issue/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 : RouteSearchQuery strict (clé inconnue refusée), RouteCountQuery avec breakdown=all_but_one, schémas de réponse RouteSearchResult et RouteCount ;
    • API : lecture de moods[]=… comme moods=… (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 dans settings, comptage par groupe en un seul parcours, cache public 30 s et ETag ;
    • tests d'intégration sur le seed et sur des parcours de test isolés, script de bench p95 sur 1 000 parcours synthétiques, plan d'exécution dans la PR.

    Tri recommended : lieux vérifiés, officiel, puis récence, en attendant #63.

  3. IlanAMG commented on Oct 13, 2026

    @IlanAMG
    MemberAuthor

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions