Repository navigation
Exposer GET /routes/:id et /routes/:id/timeline, stocker computed #36
Description
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:RouteDetailcomplet (étapes, lieux, horaires du jour, transitions,computed, vérification, auteur affiché) ;?token=pour un parcours privé ;410avec la date du retrait pour un parcours retiré,404pour un parcours inexistant ou non publié sans droit (D-014).- Parcours
access = premiumpour 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 (servicerecomputeRoute), 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
- Tests d'intégration : parcours publié, privé avec et sans jeton, dépublié
- Le seed v0.2 est recalculé par le moteur et reste cohérent
- Test : parcours
access = premiumsans abonnement → étape 1 complète, étapes suivantes sans lieu, coordonnées ni conseil, pas de tracé ; avec abonnement → fiche complète (Ecrans › E-05) - Test : parcours retiré →
410avec la date du retrait - Test : les transitions de la réponse portent la géométrie demandée à Mapbox, sauf pour un parcours Premium sans abonnement ; rien de Mapbox n'est écrit en base (
computed,steps.transition,direction_cache) ; Mapbox indisponible → estimations sans géométrie - La réponse porte tous les champs par étape et pour le parcours listés ci-dessus, lieux signalés compris
- Test : la réponse porte
budgetPerPersonEurexact (23 € reste 23), égal à celui de la card du même parcours, etbudgetBucketdérivé de la somme exacte ; l'arrondi d'affichage (23 € → 25 €, 22 € → 20 €, 2 € → 5 €, 0 € → « Gratuit ») reste la fonction de l'app partagée avec la card, sans seconde implémentation dans l'API - La réduction de
/routes/:idpour un parcours Premium se décide par la même règle de droit que/routes/search(fonction unique livrée par Retirer les coordonnées des étapes d'un parcours Premium de la recherche #161, étendue par Appliquer les parcours Premium, le déblocage à l'unité et la limite anti-spam dans l'API #66), sans seconde implémentation : test, comptepremiumdontplan_expires_atest passé → fiche réduite (D-075) - La réponse est validée par le schéma partagé
route-detail.tsde Construire la fiche parcours (E-05) #37, tel que décrit dans API par Écrire dans la page API le contrat de GET /routes/:id et /timeline, et trancher la zone dans la 410 #393 - Selon la décision de Écrire dans la page API le contrat de GET /routes/:id et /timeline, et trancher la zone dans la 410 #393 : la
410 route_removedporte le point de départ retenu (zone du parcours) pour que « Voir des parcours proches » recentre l'accueil (Ecrans › E-05), sans autre donnée du parcours retiré ; test
Activity
IlanAMG commentedon Sep 25, 2026
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.
IlanAMG commentedon Sep 25, 2026
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.
IlanAMG commentedon Sep 25, 2026
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).
IlanAMG commentedon Sep 26, 2026
D-056 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) :
GET /routes/:idexpose 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.IlanAMG commentedon Sep 26, 2026
D-057 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) :
GET /routes/:idexposemyReport(date du signalement de l'utilisateur connecté s'il date de moins de 7 jours et n'est pas encore tranché, sinon null).PaulThiberville commentedon Sep 29, 2026
📋 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/:idapplique 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.feat(api): decide the right to a route in one place, per caller
1 remaining item
PaulThiberville commentedon Oct 13, 2026
📋 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 la410suit la décision de #393. Le ticket reste bloqué par #378.feat(api): write the route sheets of the demo dataset for the app
feat(mobile): read the route sheet from an injectable source
feat(api): write the route sheets of the demo dataset for the app
feat(mobile): read the route sheet from an injectable source
PaulThiberville commentedon Oct 14, 2026
📋 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é :route-detail.tsde Construire la fiche parcours (E-05) #37, tel que décrit dans API par Écrire dans la page API le contrat de GET /routes/:id et /timeline, et trancher la zone dans la 410 #393 » ;410 route_removedporte le point de départ retenu… ».Dépendance
blocked_by#393 déclarée, labelstatus: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.PaulThiberville commentedon Oct 14, 2026
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.
PaulThiberville commentedon Oct 14, 2026
📋 MANAGER (2026-10-14), découverte de CODE pendant #41 (PR #443, Inbox) : E-06 (« À préparer ») attend les conseils du parcours, que
RouteDetailne 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.tipset 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 (queplanned_routes.checklistne 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 debookingUrlni debookingNote, 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).PaulThiberville commentedon Oct 15, 2026
📋 MANAGER, 2026-10-15 — à prendre en compte ici (découverte de CODE pendant #180, PR #482) :
routes.computed.accessest maintenant écrit, sous la forme{ station, lines: [{ mode, line }], distance_m }(ounullau-delà de 1,5 km). La fiche ne le sert pas encore :RouteDetail.startAccessn'existe que dans les fixtures de l'app (startAccess: null), et sonlines: 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/:iddevrait servir l'accès avec son mode et sa distance ; l'affichage côté app suivra. La forme decomputed.accessest à reporter dans Modele-de-Donnees (voir #436).