docs(geo): OSM/Photon canon; stage without Photon. Refs EventHub/EventHubSpec#21

This commit is contained in:
2026-08-17 23:23:25 +03:00
parent 14da77fd7e
commit 4a96834d8e
4 changed files with 251 additions and 1 deletions
+16 -1
View File
@@ -270,6 +270,10 @@ Legacy: прямой `POST /v1/calendars/:id/specialists` **не использ
- История календаря: hot = текущий месяц + будущее; warm = 3 закрытых месяца;
cold = gzip-файлы. Контракт: [`ARCHIVE.md`](ARCHIVE.md). Код: Back#76.
#### Фаза 3 / гео (Spec#19, канон Spec#21)
- Стек: свой Photon + MapLibre/OpenFreeMap; Google/Яндекс **не** провайдеры
(только outbound-ссылки с карточки). Контракт: [`GEO.md`](GEO.md). Код: Back#77.
### 2.1.3. Share / приглашения (соредактор и заместитель)
Таблица `calendar_share` (`id`, `calendar_id`, `user_id`, `rights`: `read` | `write` | `admin`,
@@ -401,11 +405,17 @@ API:
- Полнотекстовый поиск по названиям событий, календарей, тегам (при наличии `q` или любого
фильтра из списка выше).
- Фильтрация по дате, категории, местоположению, рейтингу.
- **Гео (волна 2, [GEO.md](GEO.md)):** `lat`+`lon` выключают discovery-tops. События —
по `event.location`; commercial-календари — по `settings.default_location`.
`radius` **опционален** (1..100 км); без ключа — без отсечения, сортировка `distance`.
В ответе `distance_km`. Без координат сущность в geo-выборку не входит.
- Пагинация результатов (`limit`, `offset`; default `limit=20`, max `100`).
- Поиск должен учитывать права доступа (не показывать скрытые/заблокированные календари).
### 2.6. Расширенные возможности
- Локация события (`location` запись с адресом, широтой, долготой).
- Локация события (`location` запись с адресом, широтой, долготой). Address-only
допустим; lat/lon оба или ни одного. Геокодер: [`GEO.md`](GEO.md)
(`GET /v1/geo/suggest`, `POST /v1/geo/geocode`, `POST /v1/geo/reverse`).
- Онлайн-ссылка (`online_link`).
- Вложения к событию (`attachments`).
- История изменений события (`edit_history`).
@@ -613,6 +623,11 @@ src/
(в т.ч. свои). С Bearer — commercial + доступные; busy для Time Arc берётся из personal отдельно.
В calendar-результатах — `image_url` (если задан на календаре). Upload/multipart
**не** входит в контракт: поле URL.
Гео: `lat`+`lon` (и опциональный `radius` 1..100) — ближайшие события и календари;
`sort=distance`; в элементах `distance_km` ([GEO.md](GEO.md)).
- `GET /v1/geo/suggest` — typeahead адреса (Photon); **без токена** + IP rate-limit.
- `POST /v1/geo/geocode``{q, lang?}``{address, lat, lon, source}` (Bearer).
- `POST /v1/geo/reverse``{lat, lon, lang?}` (Bearer). Photon down → `503` `geo_unavailable`.
- `GET /v1/calendars` — список календарей (auth): owned shared (`role`, `share_rights`,
`mirror_to_default`).
- `POST /v1/calendars` — создать календарь (`commercial` → нужна уже active sub/trial;