Repository navigation
feat(api): calculer l'accès d'un parcours depuis les gares d'IDFM - #482
Merged
Merged
Conversation
Versioned reference file of the metro, RER and tram stations from the IDFM dataset emplacement-des-gares-idf (Licence Ouverte v2.0, Etalab), grouped by connection zone, written by `pnpm --filter @widoo/api transit:import`. Every record is validated; a changed licence or a truncated export is refused. No network call at API runtime. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
routes.computed.access holds the station nearest the first step, its lines and the walk to it, estimated like a walking trip (D-088), none beyond 1.5 km (D-050). Written at every save of the editor, so it follows the first step, and at the seed of the demo routes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Collaborator
Author
|
Plan et décisions techniques :
|
Open
This was referenced Oct 15, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Résultat et problème
D-050 a retiré le champ saisi « Comment venir » : l'accès d'un parcours se calcule, station la plus proche de la première étape, depuis les données ouvertes d'Île-de-France Mobilités, et se range dans
routes.computed. Rien ne le calculait.emplacement-des-gares-idf), Licence Ouverte v2.0 (Etalab), pas ODbL : réutilisation libre, y compris commerciale, sous condition d'attribution (source et date de dernière mise à jour). Mis à jour par IDFM le 2025-12-10. Ce n'est pas un sous-traitant de données personnelles : un fichier public, sans donnée personnelle, importé hors exécution.pnpm --filter @widoo/api transit:importtélécharge l'export et la fiche du catalogue depuis deux adresses fixes (ou lit des fichiers avec--file … --meta …), garde métro, RER et tram (940 enregistrements sur 1 240), les regroupe par zone de correspondance (id_ref_zdc) et écritapps/api/src/transit/generated/stations.json: 767 stations, 108 Ko, une station par ligne pour que le diff d'un rafraîchissement se lise. Le fichier porte sa source, sa licence et sa date. Aucun appel réseau à l'exécution de l'API, pas de table ni de migration : le volume ne l'impose pas.WALK_PROPOSAL_MAX_M). Rangé dansroutes.computed.access:{ "station": "Abbesses", "lines": [{ "mode": "metro", "line": "12" }], "distance_m": 63 }null. Écrit à chaque enregistrement de l'éditeur (writeInPlace, donc recalculé quand la première étape change) et au seed des dix parcours de démo.packages/orchestrationn'est pas modifié.computeRoutene prend pas l'accès en entrée et l'éditeur passe parevaluateRoute; le calcul vit dansapps/api/src/transitet réutilisestraightLineM,estimateOfModeetWALK_PROPOSAL_MAX_M.Accès des parcours de démo : Bastille (1, 5, 8) à 316 m · Abbesses (12) à 63 m · Jacques Bonsergent (5) à 188 m · Corvisart (6) à 506 m · Belleville (2, 11) à 186 m · Jussieu (7, 10) à 262 m · Cité (4) à 231 m · Buttes-Chaumont (7bis) à 537 m · Saint-Sébastien-Froissart (8) à 64 m · Gare de Lyon (1, 14, RER A, D) à 390 m.
Limites : la fiche (
RouteDetail.startAccess) n'est pas encore servie par l'API (les fixtures de l'app gardentstartAccess: null) et la réponse de l'éditeur (E-11, « Calculé pour vous ») ne porte pas l'accès ; le rafraîchissement est un script à relancer, pas une tâche planifiée ; la validation d'une révision par la modération (PR #365, non fusionnée) devra réécrirecomputedde la même façon. Signalé sur l'Inbox.Fixes #180
Écrans : aucun (donnée de E-05 « En pratique » et E-11 « Calculé pour vous », non branchée ici)
Dépendance : aucune
Comment vérifier
pnpm turbo run lint typecheck test --force,prettier --check .etpnpm audit --audit-level=highverts en local (tests de l'API relancés seuls : délais dépassés sous la charge de la machine)Tests : regroupement et ordre des lignes, filtre des modes, nettoyage des caractères invisibles, refus d'un enregistrement hors région, d'un nom avec balise, d'une ligne inattendue, d'une autre licence et d'un export tronqué (moins de 500 stations) ; aller-retour du fichier ; station la plus proche, arrêt le plus proche d'une station à plusieurs arrêts, aucune au-delà de 1,5 km ; accès des dix parcours de démo au seed ; recalcul par
PUT /routes/:id/stepsquand la première étape change (Bastille, puis Saint-Paul).Formatage mécanique : non
Risque
Niveau : 2 — nouvelle donnée persistée, non destructive (
routes.computed.access), et un import de fichier externe ; ni migration, ni appel sortant à l'exécution.Taille : commit 1, 325 lignes utiles plus
apps/api/src/transit/generated/stations.json(772 lignes, fichier généré par le script d'import, exclu du calcul) ; commit 2, 171 lignes.Revue OWASP (Top 10 2025), déclenchée par l'import d'un fichier externe :
<,>ni caractère de contrôle, 80 caractères au plus, ligne[0-9A-Za-z]{1,5}) ; licence attendue vérifiée, export tronqué refusé (moins de 500 stations), fichier versionné relu en PR et revalidé au chargement de l'API. Testé.redirect: 'error', délai de 60 s, réponse bornée à 20 Mo ; il tourne sur le poste d'un développeur, jamais dans l'API.fetchetparseArgsde Node).Licence : la Licence Ouverte demande de mentionner la source et la date de dernière mise à jour là où la donnée est réutilisée ; l'affichage dans l'app est à décider (déposé sur l'Inbox).
Retour arrière
Revert de la PR :
computed.accessreste dans les lignes déjà écrites, ignoré par tous les lecteurs (la recherche ne lit que la durée, le budget et la distance), et disparaît au prochain enregistrement ou au prochain seed. Aucune migration à annuler.🤖 Generated with Claude Code