feat(api): minimal auth + trip-build UI — full flow clickable #14

Merged
charles merged 1 commit from feat/m7-auth-build into main 2026-06-17 14:21:33 +00:00
Owner

The whole pipeline is now clickable end-to-end in the browser.

just dev → import GEDCOM → 📍 geocode → validate → log in → ✨ Construire le voyage → itinerary

Changes

  • dev login: /login (email only — placeholder for FR-ACC-05 OAuth/email), gtr_uid cookie → Actor::User; /logout. actor_of(headers) resolves it.
  • POST /tree/:id/build: account-gated (FR-OV-02) — anon → 303 /login; otherwise builds via cx.trips().build_trip and renders the itinerary (stops with day-range + family anchors, transport/lodging/activity proposals + prices, total + breakdown). NoPlaces → geocode hint.
  • Tree view shows Construire le voyage when logged in, else a login link.

Verification (live, end-to-end)

import → geocode (Nominatim) → build-without-login 303→/login → login → build → "Votre voyage · Total ≈ 500 € · 2 étapes" with 🏨/🎟 per stop. just qa green.

Auth is dev-grade (cookie, no password/signing) — real OAuth/email + users table later. This unblocks browser testing of M1–M6. Traces: FR-OV-02, FR-PRES-01/03, FR-TRP-*.

**The whole pipeline is now clickable end-to-end in the browser.** ``` just dev → import GEDCOM → 📍 geocode → validate → log in → ✨ Construire le voyage → itinerary ``` ## Changes - **dev login**: `/login` (email only — placeholder for FR-ACC-05 OAuth/email), `gtr_uid` cookie → `Actor::User`; `/logout`. `actor_of(headers)` resolves it. - **`POST /tree/:id/build`**: account-gated (FR-OV-02) — anon → 303 `/login`; otherwise builds via `cx.trips().build_trip` and renders the itinerary (stops with day-range + family anchors, transport/lodging/activity proposals + prices, **total + breakdown**). `NoPlaces` → geocode hint. - Tree view shows **✨ Construire le voyage** when logged in, else a login link. ## Verification (live, end-to-end) import → geocode (Nominatim) → build-without-login **303→/login** → login → build → **"Votre voyage · Total ≈ 500 € · 2 étapes"** with 🏨/🎟 per stop. `just qa` green. Auth is **dev-grade** (cookie, no password/signing) — real OAuth/email + users table later. This unblocks browser testing of M1–M6. Traces: FR-OV-02, FR-PRES-01/03, FR-TRP-*.
feat(api): minimal auth + trip-build UI — full flow clickable end-to-end
All checks were successful
qa / qa-1 (push) Successful in 16s
qa / qa-1 (pull_request) Successful in 17s
qa / qa (push) Successful in 0s
qa / qa (pull_request) Successful in 0s
d730cf5376
- dev login: GET/POST /login (email only, no password — placeholder for
  FR-ACC-05 OAuth/email), gtr_uid cookie → Actor::User; /logout clears it.
  actor_of(headers) resolves the cookie; anonymous otherwise.
- POST /tree/:id/build: account-gated (FR-OV-02) — anon redirects to /login;
  builds via cx.trips().build_trip and renders the itinerary (stops with
  day-range + family anchors, transport/lodging/activity proposals with prices,
  total + per-category breakdown). NoPlaces → "géocodez d'abord" hint.
- tree view shows " Construire le voyage" when logged in, else a login link.

Verified live end-to-end: import → geocode (Nominatim) → build-without-login
303→/login → login → build → "Votre voyage · Total ≈ 500 € · 2 étapes" with
🏨/🎟 per stop. just qa green.

Auth is dev-grade (cookie, no password/signing) — real OAuth/email + a users
table land later; this unblocks browser testing of the whole pipeline.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
charles/geneatrip!14
No description provided.