diff --git a/EventHubBackSpec.md b/EventHubBackSpec.md index 3bcdf0a..eb502ca 100644 --- a/EventHubBackSpec.md +++ b/EventHubBackSpec.md @@ -19,6 +19,11 @@ EventHub — платформа для управления событиями - Гибкое подтверждение заявок: auto (автоматически), manual (вручную), timeout (авто через N секунд) - Теги календаря, рейтинг (средняя оценка, количество голосов) +- После успешной верификации email (`POST /v1/verify`, статус пользователя → `active`) система + идемпотентно создаёт дефолтный **personal**-календарь владельцу (`logic_calendar:ensure_default_calendar/1`): + название — `nickname` или «Мой календарь», `confirmation=manual`. Повторный вызов не создаёт дубликат, + если у пользователя уже есть active personal-календарь. Существующим пользователям без календаря + backfill не выполняется. **Новые поля (задача #12):** - `short_name` — короткое уникальное имя для API и поиска @@ -111,9 +116,16 @@ EventHub — платформа для управления событиями - Возможность пожаловаться на отзыв (создание `report`). ### 2.5. Поиск и фильтрация -- Полнотекстовый поиск по названиям событий, календарей, тегам. +- **Discovery (пустой поиск):** `GET /v1/search` без `q`, `tags`, `from`/`to`, `lat`/`lon`, `sort` + возвращает топ публичных календарей и событий по рейтингу из `stats_tops` + (`core_calendar:get_top_calendars_by_rating/1`, `core_event:get_top_events_by_rating/1`). + Параметр `type` (`event` | `calendar`) ограничивает один тип; без `type` — оба в `results`. + Если tops пусты или после фильтра `can_access` ничего не осталось — fallback на полный scan + (как при фильтрованном поиске без `q`). +- Полнотекстовый поиск по названиям событий, календарей, тегам (при наличии `q` или любого + фильтра из списка выше). - Фильтрация по дате, категории, местоположению, рейтингу. -- Пагинация результатов. +- Пагинация результатов (`limit`, `offset`; default `limit=20`, max `100`). - Поиск должен учитывать права доступа (не показывать скрытые/заблокированные календари). ### 2.6. Расширенные возможности @@ -263,6 +275,7 @@ src/ ### Пользовательские (порт 8080) - `GET /health` — health + build identity: `status`, `service`, `version`, `build`, `git_sha`, `built_at` (как admin health). - `POST /v1/register` — регистрация. +- `POST /v1/verify` — подтверждение email; при успехе — `active` и дефолтный personal-календарь. - `POST /v1/login` — вход. - `POST /v1/refresh` — обновление токена. - `GET /v1/user/me` — профиль пользователя. @@ -272,7 +285,7 @@ src/ email/role/status; неизвестные поля → `400`. Ответ — полный профиль как GET. - `GET /v1/user/bookings` — бронирования пользователя. - `GET /v1/user/reviews` — отзывы пользователя. -- `GET /v1/search` — поиск. +- `GET /v1/search` — поиск; пустой запрос (только auth + пагинация/`type`) — discovery tops. - `GET /v1/calendars` — список календарей. - `GET /v1/calendars/:id` — календарь. - `GET /v1/calendars/:calendar_id/events` — события календаря. diff --git a/EventHubFrontSpec.md b/EventHubFrontSpec.md index 3300e54..7e9540b 100644 --- a/EventHubFrontSpec.md +++ b/EventHubFrontSpec.md @@ -19,7 +19,7 @@ Deep-link на календарь, владельцем которого явл Эндпоинты: - `POST /v1/register` — регистрация (`email`, `password`); статус пользователя `pending` до верификации. -- `POST /v1/verify` — подтверждение email `{ token }`. +- `POST /v1/verify` — подтверждение email `{ token }`; после успеха у пользователя есть дефолтный personal-календарь. - `POST /v1/login` — вход; ответ `{ token, refresh_token, user }`. Сессия `auth_session` с `client_type=web`. - `POST /v1/refresh` — ротация пары токенов по `{ refresh_token }`. - `GET /v1/user/me` — профиль текущего пользователя. @@ -101,7 +101,7 @@ Redirects: `/discover` → `/search`; `/calendars/:id` → `/c/:id`; `/calendars `GET /v1/user/me` — отображение полей. `PATCH /v1/user/me` — язык (`language`), mood в `preferences.mood`, прочие поля профиля. Язык при первом визите — из браузера; при первом логине без `language` в профиле — записывается в профиль. Mood по умолчанию `calm`, в профиль при логине не сидится. ### 5.3. Поиск (участник) -`GET /v1/search` — фильтры (`type`, `q`, даты, теги, geo, sort, пагинация). Переход к календарю/событию. +`GET /v1/search` — фильтры (`type`, `q`, даты, теги, geo, sort, пагинация). Без фильтров (страница «Найти») — топ календарей и событий по рейтингу; с `q`/фильтрами — полнотекстовый поиск. Переход к календарю/событию. ### 5.4. Календари - Список своих: `GET /v1/calendars`