Skip to content

fix(api): garder sans conflit un lieu toujours ouvert d'une sortie - #543

Merged
PaulThiberville merged 3 commits into
mainfrom
issue/539-always-open-planned-timeline
Oct 19, 2026
Merged

PaulThiberville merged 3 commits into
mainfrom
issue/539-always-open-planned-timeline

Conversation

@PaulThiberville

@PaulThiberville PaulThiberville commented Oct 19, 2026 •

Copy link
Copy Markdown
Collaborator

Résultat et problème

Un lieu « Accessible à toute heure » sans horaires recevait hours_unknown dans la timeline d'une sortie programmée (GET /v1/me/planned), alors que GET /v1/routes/:id/timeline ne lui en mettait aucun, comme le veut D-049. Le snapshot (PlannedRouteSnapshot) ne gardait pas alwaysOpen et timelineOf ne le passait pas à computeTimeline.

  • PlannedRoutePlace porte alwaysOpen: z.boolean().default(false) : un snapshot déjà enregistré sans ce champ se lit avec false, sans migration.
  • snapshotOf fige alwaysOpen du lieu ; timelineOf le transmet à computeTimeline.

Limite : la timeline d'une sortie est figée en base à sa programmation. Une sortie déjà programmée avant ce correctif garde son hours_unknown jusqu'à ce que son départ soit modifié (PATCH, qui recalcule la timeline sur son snapshot, lui aussi sans alwaysOpen, donc false). Aucune réécriture des sorties existantes : il n'y a pas de données de production concernées à ce stade.

Fixes #539
Écrans : aucun
Dépendance : aucune

Comment vérifier

Le premier commit a été écrit par un agent opencode (GLM) et est gardé tel quel ; le second ajoute les tests des trois critères au niveau HTTP (le test GLM ne couvrait que timelineOf) ; le troisième ajoute alwaysOpen: false aux lieux de la sortie fictive des tests du Go (apps/mobile/src/go/testPlanned.ts), que le nouveau champ, obligatoire une fois parsé, faisait échouer au typecheck mobile.

  • apps/api/src/routes/planned.test.ts, « the timeline of a planning and an always-open place (D-049) » :

    • pas de hours_unknown pour le lieu toujours ouvert dans GET /v1/me/planned ;
    • même timeline complète (heures et conflits) que GET /v1/routes/:id/timeline?startsAt=, pour la démo et pour un parcours avec un lieu toujours ouvert ;
    • un snapshot enregistré sans alwaysOpen se lit en 200 avec alwaysOpen: false partout.
  • Contrôle par mutation en local : sans la ligne alwaysOpen de timelineOf, les trois tests liés au lieu toujours ouvert échouent.

  • pnpm lint && pnpm typecheck && pnpm test verts en local — lint et typecheck verts sans cache (pnpm turbo run lint typecheck --force) ; tests verts par paquet. Un test jest mobile sans lien (SectionList.test.tsx) a dépassé son délai sous la même charge, vert relancé seul. La suite API complète a eu 4 timeouts de 5 s sous une charge machine de 92, dans des fichiers non touchés, verts une fois relancés seuls.

  • Testé sur iOS / Android (préciser) — si mobile : sans objet, API seule.

Formatage mécanique : non

Risque

Niveau : 1 — champ de snapshot avec défaut à la lecture, sans migration ni effet sur l'accès ; seuls les conflits d'un lieu always_open changent.

Taille : 3 commits, +5 / −2, +119 / −2 et +1 lignes, tests compris.

Revue OWASP : non déclenchée (règle d'affichage d'horaires, pas d'accès, d'entrée non fiable ni de stockage nouveau).

Retour arrière

Revert de la PR suffisant : aucune migration. Les snapshots enregistrés entre-temps garderaient un champ alwaysOpen que l'ancien schéma Zod ignore à la lecture.

🤖 Generated with Claude Code

PaulThiberville and others added 2 commits October 19, 2026 17:00
…line

Fixes #539

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…utes

Covers the three criteria of the ticket on GET /v1/me/planned: no
hours_unknown for an always-open place, the same timeline as
GET /v1/routes/:id/timeline, and a snapshot stored without alwaysOpen read
as false. The fictitious place moves into the planning fixtures, deleted
with the routes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@PaulThiberville

Copy link
Copy Markdown
Collaborator Author

Plan et décisions : le correctif (premier commit, écrit par GLM, gardé tel quel) ajoute alwaysOpen au lieu du snapshot avec un défaut Zod à false, choisi plutôt qu'une migration des snapshots enregistrés. Le second commit teste les trois critères par les routes HTTP et range le lieu fictif dans plannedFixtures (placé à -40/-40, loin de la démo, pour qu'aucune recherche de lieux des autres fichiers ne le voie), supprimé après les parcours dans cleanUp.

The planned place now carries alwaysOpen, required once parsed: the
fictitious planning of the Go tests is a parsed PlannedRoute, so its places
say they are not always open.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@PaulThiberville
PaulThiberville merged commit 617ce82 into main Oct 19, 2026
6 checks passed
@PaulThiberville
PaulThiberville deleted the issue/539-always-open-planned-timeline branch October 19, 2026 15:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Tenir compte de « Accessible à toute heure » dans la timeline d'une sortie programmée

1 participant