Skip to content

Exposer GET /routes/:id et /routes/:id/timeline, stocker computed #36

Open

Description

@IlanAMG

Contexte

Epic : #9
Maquette : sans objet — API ; la fiche E-05 qu'elle alimente est validée depuis le 2026-09-23
API · Orchestration · D-002

Débloqué le 2026-10-14 par D-088 (décision d'Ilan sur #378) : computed et steps.transition n'enregistrent que nos estimations ; à chaque GET /v1/routes/:id, l'API demande à Mapbox Directions les trajets exacts et leur géométrie pour cette réponse seulement, sans rien enregistrer ni mettre en cache (direction_cache reste vide) ; si Mapbox ne répond pas, la réponse porte l'estimation (estimated: true), sans géométrie.

Contrat de la réponse : la PR #390 (#37) a fixé la forme dans packages/shared/src/schemas/route-detail.ts (timeline incluse, 410 route_removed avec details.removedAt, LockedStep, vérification, encart créateur, sharedBy, reviews) ; son report dans la page API et la question de la zone dans la 410 sont portés par #393 (needs-design). L'endpoint tient ce schéma partagé, sans seconde définition.

Comportement attendu

  • GET /v1/routes/:id : RouteDetail complet (étapes, lieux, horaires du jour, transitions, computed, vérification, auteur affiché) ; ?token= pour un parcours privé ; 410 avec la date du retrait pour un parcours retiré, 404 pour un parcours inexistant ou non publié sans droit (D-014).
  • Parcours access = premium pour un appelant non abonné : étape 1 complète ; étapes suivantes réduites à l'heure, la catégorie, la durée et le trajet, sans lieu, coordonnées ni conseil ; pas de tracé (D-014).
  • Par étape : horaires du jour et statut ouvert, coût, réservation nécessaire et lien, nombre de vérifications et date de la dernière, conseil du créateur. Lieux signalés avec le nombre de signalements et leur date (D-013, D-014).
  • Pour le parcours : nombre d'avis, les trois derniers avis, nombre de parcours publiés par le créateur (D-013).
  • GET /v1/routes/:id/timeline?startsAt=.
  • Recalcul et stockage de computed à chaque modification d'étapes (service recomputeRoute), sur nos estimations de trajet seulement (D-088), remplaçant les valeurs manuelles du seed.
  • Chaque transition de la réponse porte sa géométrie, demandée à Mapbox Directions pour cette réponse et jamais enregistrée (D-088), pour le tracé du parcours le long des rues (Tracer le parcours sélectionné le long des rues (E-04) #154) ; sans réponse de Mapbox, l'estimation enregistrée, sans géométrie ; aucune géométrie pour un parcours Premium sans abonnement, qui n'a pas de tracé (D-014). Piste : une requête Directions par profil et par parcours, les étapes en points de passage (25 au plus), plutôt qu'une par trajet, pour tenir la limite de 300 requêtes par minute.
  • Budget (D-032, D-066) : l'API expose budgetPerPersonEur, la somme exacte par personne, comme sur la card de /routes/search ; l'app l'arrondit aux 5 € à l'affichage (« ≈ 25 € par pers. », « Gratuit » à zéro) par la même fonction que la card ; le palier de budget se calcule sur la somme exacte. (Amendé le 2026-10-14 : l'API ne renvoie plus de budget arrondi.)

Critères d'acceptation

Activity

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

    @IlanAMG
    MemberAuthor

    D-048 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : exposer suggested_start, tips (À prévoir), getting_there (Comment venir), et par étape booking_note, booking_is_affiliate et le mode du trajet. Schéma : #176.

  3. IlanAMG commented on Sep 25, 2026

    @IlanAMG
    MemberAuthor

    D-050 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : exposer computed.access (#180), les suggestions « À prévoir » non masquées, ends_on des lieux et étapes, le crédit des photos.

  4. IlanAMG commented on Sep 25, 2026

    @IlanAMG
    MemberAuthor

    D-052 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : exposer ends_on par étape, computed.access (#180), booking_is_affiliate, le mode de chaque trajet, et le crédit des médias (author, license, source_url).

  5. IlanAMG commented on Sep 26, 2026

    @IlanAMG
    MemberAuthor

    D-056 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : GET /routes/:id expose par étape la date de la dernière vérification du lieu (verified_at) et le statut, pour la ligne « Dernière vérification il y a N mois » ; aucune donnée de signalement de parcours n'est exposée.

  6. IlanAMG commented on Sep 26, 2026

    @IlanAMG
    MemberAuthor

    D-057 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : GET /routes/:id expose myReport (date du signalement de l'utilisateur connecté s'il date de moins de 7 jours et n'est pas encore tranché, sinon null).

  7. PaulThiberville commented on Sep 29, 2026

    @PaulThiberville
    Collaborator

    📋 Report de D-075 (2026-09-29, correction de D-066 sur la card de recherche Premium, décision de Paul au nom d'Ilan ; voir #161) : critère ajouté au corps. /routes/:id applique la même règle de droit au parcours que la recherche (fonction unique livrée par #161), sans seconde implémentation. Le critère existant « avec abonnement → fiche complète » reste valable.

  8. 1 remaining item

  9. PaulThiberville commented on Oct 13, 2026

    @PaulThiberville
    Collaborator

    📋 MANAGER (2026-10-13) : contexte et deux critères ajoutés après la PR #390 (#37) : la réponse tient le schéma partagé route-detail.ts ; la zone dans la 410 suit la décision de #393. Le ticket reste bloqué par #378.

  10. added
    status:readySpec complète, prêt à coder
    and removed
    status:blockedBloqué, voir commentaire ⛔
    on Oct 14, 2026
  11. added
    status:blockedBloqué, voir commentaire ⛔
    and removed
    status:readySpec complète, prêt à coder
    on Oct 14, 2026
  12. PaulThiberville commented on Oct 14, 2026

    @PaulThiberville
    Collaborator

    📋 MANAGER (2026-10-14) : D-088 est bien reporté dans le corps (estimations seules en base, trajets exacts et géométrie demandés à Mapbox pour la réponse, rien d'enregistré) : le bloqueur #378 est levé.

    Ce ticket reste pourtant non livrable en l'état : deux de ses critères dépendent de #393 (needs-design), qui n'est pas tranché :

    Dépendance blocked_by #393 déclarée, label status:ready → status:blocked, Status du Project Prêts → Bloqués. Le ticket n'avait ni branche ni PR. Dès la fermeture de #393, MANAGER reporte le contrat dans ce corps et le ticket repasse Prêts.

  13. PaulThiberville commented on Oct 14, 2026

    @PaulThiberville
    Collaborator

    Corps amendé le 2026-10-14 (MANAGER) : d'après D-066 et le brouillon DESIGN de #393 (Q11), l'API renvoie le budget exact et l'app l'arrondit comme pour la card ; la puce Budget et son critère de test sont réécrits en ce sens.

  14. PaulThiberville commented on Oct 14, 2026

    @PaulThiberville
    Collaborator

    📋 MANAGER (2026-10-14), découverte de CODE pendant #41 (PR #443, Inbox) : E-06 (« À préparer ») attend les conseils du parcours, que RouteDetail ne porte pas encore. Ils sont déjà dans le périmètre de ce ticket : API › GET /routes/:id, « À ajouter au schéma de #390 par #36 », ligne « À prévoir » (routes.tips et suggestions calculées non masquées, D-048, D-050). Pas de nouveau ticket API. Leur affichage et leur cochage dans la checklist d'une sortie (que planned_routes.checklist ne sait pas garder) partent en #445 (needs-design, bloqué par ce ticket).

    Au passage : aucune fiche de démo (apps/mobile/src/route/generated/route-sheets.json) n'a de bookingUrl ni de bookingNote, si bien que « Réserver » et « Lien affilié » ne se voient pas en recette. Le seed recalculé de ce ticket (critère « Le seed v0.2 est recalculé ») est l'occasion d'en donner à au moins une étape de démo (lien fictif).

  15. PaulThiberville commented on Oct 15, 2026

    @PaulThiberville
    Collaborator

    📋 MANAGER, 2026-10-15 — à prendre en compte ici (découverte de CODE pendant #180, PR #482) : routes.computed.access est maintenant écrit, sous la forme { station, lines: [{ mode, line }], distance_m } (ou null au-delà de 1,5 km). La fiche ne le sert pas encore : RouteDetail.startAccess n'existe que dans les fixtures de l'app (startAccess: null), et son lines: string[] sans mode ne permet pas « Métro Abbesses, ligne 12 » de la maquette (D-052, mappings.access) ni « à 50 m du départ ». GET /routes/:id devrait servir l'accès avec son mode et sa distance ; l'affichage côté app suivra. La forme de computed.access est à reporter dans Modele-de-Donnees (voir #436).

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