Фаза 3 / волна 2: API геокодирования, location и поиск рядом #77

Closed
opened 2026-08-16 23:38:35 +03:00 by cursor-ai · 1 comment
Owner

Проблема

Геокодера нет. Create event по сути требует lat+lon; address-only отбрасывается. Search по geo режет только события, не календари; радиус всегда default 10, нет sort=distance.

Влияние

Клиент не получает координаты с сервера; «ближайшие студии» не работают; ключи провайдера негде держать (и не нужны).

Ожидаемый результат

По канону GEO.md (Spec#21, вариант Ц):

  • GET /v1/geo/suggest (можно без токена, IP rate-limit), POST /v1/geo/geocode, POST /v1/geo/reverse — прокси к своему Photon + кэш
  • Create/update: address без coords допускается
  • Search: geo по event.location и settings.default_location; radius опционален (1..100; без ключа — без отсечения); sort=distance; в ответе distance_km
  • Photon down → 503 geo_unavailable, не 500 на create

Критерии приёмки

  • Geo-эндпоинты в swagger/spec; eunit или API-тест (mock Photon)
  • Rate-limit / таймаут задокументированы
  • Address-only create не молча дропает location
  • Geo-search: календари + события, optional radius, distance_km
  • Spec sync после тестов

Связь

Родитель: EventHub/EventHubSpec#19
Зависит от: Spec#21 + DevOps#16
Канон: EventHub/EventHubSpec#21
Волна: 2 (гео)

Приоритет

P1

## Проблема Геокодера нет. Create event по сути требует lat+lon; address-only отбрасывается. Search по geo режет только события, не календари; радиус всегда default 10, нет `sort=distance`. ## Влияние Клиент не получает координаты с сервера; «ближайшие студии» не работают; ключи провайдера негде держать (и не нужны). ## Ожидаемый результат По канону GEO.md (Spec#21, вариант Ц): - `GET /v1/geo/suggest` (можно без токена, IP rate-limit), `POST /v1/geo/geocode`, `POST /v1/geo/reverse` — прокси к своему Photon + кэш - Create/update: address без coords допускается - Search: geo по `event.location` и `settings.default_location`; `radius` опционален (1..100; без ключа — без отсечения); `sort=distance`; в ответе `distance_km` - Photon down → `503` `geo_unavailable`, не 500 на create ## Критерии приёмки - [ ] Geo-эндпоинты в swagger/spec; eunit или API-тест (mock Photon) - [ ] Rate-limit / таймаут задокументированы - [ ] Address-only create не молча дропает location - [ ] Geo-search: календари + события, optional radius, `distance_km` - [ ] Spec sync после тестов ## Связь Родитель: https://git.sabilin.com/EventHub/EventHubSpec/issues/19 Зависит от: Spec#21 + DevOps#16 Канон: https://git.sabilin.com/EventHub/EventHubSpec/issues/21 Волна: 2 (гео) ## Приоритет P1
cursor-ai added the Story label 2026-08-16 23:38:35 +03:00
cursor-ai self-assigned this 2026-08-16 23:38:35 +03:00
cursor-ai changed title from Фаза 3 / волна 2: API геокодирования и location to Фаза 3 / волна 2: API геокодирования, location и поиск рядом 2026-08-17 22:36:35 +03:00
Author
Owner

Реализовано и проверено:

  • handler_geo.erl: /v1/geo/suggest, /v1/geo/geocode, /v1/geo/reverse (прокси к геокодеру, degrade 503 geo_unavailable без ключа/квоты) — коммиты 6b70e13, 73d43e5 (переход Photon → OpenCage), cc08b3b;
  • address-only create не дропает location; поиск рядом: календари (default_location) + события, optional radius, sort=distance, distance_km;
  • logic_geo_tests 7/7 зелёные локально (OTP 28.2 / rebar 3.27);
  • spec sync: EventHubBackSpec.md § гео + GEO.md.

Закрываю по канону GEO.md (Spec#21).

Реализовано и проверено: - handler_geo.erl: `/v1/geo/suggest`, `/v1/geo/geocode`, `/v1/geo/reverse` (прокси к геокодеру, degrade 503 geo_unavailable без ключа/квоты) — коммиты 6b70e13, 73d43e5 (переход Photon → OpenCage), cc08b3b; - address-only create не дропает location; поиск рядом: календари (`default_location`) + события, optional radius, `sort=distance`, `distance_km`; - `logic_geo_tests` 7/7 зелёные локально (OTP 28.2 / rebar 3.27); - spec sync: EventHubBackSpec.md § гео + GEO.md. Закрываю по канону GEO.md (Spec#21).
Sign in to join this conversation.