feat(integrations): M3 — geocoding (Nominatim) in the import slice #8

Merged
charles merged 1 commit from feat/m3-geocoding into main 2026-06-17 13:42:36 +00:00
Owner

Roadmap M3 (geocoding part). First real vendor integration; places resolve to modern coordinates. Testable in the browser.

Changes

  • integrations: Geocoder trait + GeoQuery/GeoHit (query carries only a place string — FR-PRV-09); Nominatim adapter (reqwest/rustls, OSM, no key, descriptive UA); StaticGeocoder fake.
  • service: TreeStore::replace (mem + pg) so geocoded/edited trees persist.
  • api: parse stores → redirects to /tree/:id (stable URL); GET /tree/:id renders from store; POST /tree/:id/geocode resolves un-geocoded places (sequential, ~1.1s/req per Nominatim policy, cap 25), saves, re-renders with name/country/coords.

Verify

just dev → upload GEDCOM → "📍 Géocoder les lieux"

Live-tested: places resolve to "Lyon, …, France (45.758, 4.832)". CI stays network-free (only the StaticGeocoder unit test runs). just qa green.

Traces: FR-IMP-07, FR-INT-09, FR-PRV-09 · tech-spec 05.

Roadmap **M3** (geocoding part). First real vendor integration; places resolve to modern coordinates. Testable in the browser. ## Changes - **integrations**: `Geocoder` trait + `GeoQuery`/`GeoHit` (query carries only a place string — **FR-PRV-09**); **Nominatim** adapter (reqwest/rustls, OSM, no key, descriptive UA); `StaticGeocoder` fake. - **service**: `TreeStore::replace` (mem + pg) so geocoded/edited trees persist. - **api**: parse stores → redirects to `/tree/:id` (stable URL); `GET /tree/:id` renders from store; `POST /tree/:id/geocode` resolves un-geocoded places (sequential, ~1.1s/req per Nominatim policy, cap 25), saves, re-renders with name/country/coords. ## Verify ``` just dev → upload GEDCOM → "📍 Géocoder les lieux" ``` Live-tested: places resolve to "Lyon, …, France (45.758, 4.832)". CI stays network-free (only the `StaticGeocoder` unit test runs). `just qa` green. Traces: FR-IMP-07, FR-INT-09, FR-PRV-09 · tech-spec 05.
feat(integrations): M3 — geocoding (Nominatim) wired into the import slice
All checks were successful
qa / qa-1 (pull_request) Successful in 56s
qa / qa (pull_request) Successful in 0s
qa / qa-1 (push) Successful in 4m26s
qa / qa (push) Successful in 0s
7b3f5ae1b9
- integrations: first real vendor adapter. Geocoder trait + GeoQuery/GeoHit
  (query carries only a place string — FR-PRV-09), Nominatim impl (reqwest
  rustls, OSM, no key, descriptive UA), StaticGeocoder fake for tests.
- service: TreeStore::replace (mem + pg) so geocoded/edited trees persist.
- api: parse now stores → redirects to /tree/:id (stable URL); GET /tree/:id
  renders from store; POST /tree/:id/geocode resolves un-geocoded places
  (sequential, ~1.1s gap per Nominatim policy, cap 25), saves, re-renders.
  Places show resolved name/country/coords.

Verified live: upload → Géocoder → "Lyon, …, France (45.758, 4.832)". CI stays
network-free (only the StaticGeocoder unit test runs); just qa green.

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!8
No description provided.