From 31893907945c1e9a09f2d99f80a387dcb7168ef7 Mon Sep 17 00:00:00 2001 From: Aleksey Sabilin Date: Fri, 14 Aug 2026 21:44:20 +0300 Subject: [PATCH] docs(spec): waitlist API and commercial waitlist_enabled setting. Refs EventHub/EventHubBack#72 Refs EventHub/EventHubFront#70 --- EventHubBackSpec.md | 27 ++++++++++++++++++++++++++- EventHubFrontSpec.md | 4 +++- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/EventHubBackSpec.md b/EventHubBackSpec.md index 58a73bf..7773685 100644 --- a/EventHubBackSpec.md +++ b/EventHubBackSpec.md @@ -46,6 +46,8 @@ EventHub — платформа для управления событиями - `default_duration_minutes` — integer 1..1440 - `default_recurrence` — `null` или `{ "enabled": boolean, "freq": "DAILY"|"WEEKLY"|"MONTHLY", "interval": integer ≥ 1 }` + - `waitlist_enabled` — boolean (только смысл для commercial; default `false`): + лист ожидания на полных слотах (Back#72) - Невалидное значение известного ключа → **400** `{error: "invalid_settings", key: "…"}` (см. EventHub/EventHubBack#63, UI: EventHub/EventHubFront#44) @@ -135,6 +137,22 @@ Trial стартует **только** явным `POST /v1/subscription` с `a no-op успех (как для `cancelled`). - WS: `booking_update` участнику и владельцу (и specialist при confirm на «своём» событии). +#### Лист ожидания (commercial, опционально) + +Включается флагом `settings.waitlist_enabled=true` на commercial-календаре +(default `false`; personal игнорируется). + +- `POST /v1/events/:id/waitlist` — встать в очередь: commercial, `booking_open`, + `waitlist_enabled`, слот полный (`pending`+`confirmed` ≥ capacity), нет своей + активной booking, ещё не в очереди. Иначе `400`: `waitlist_disabled` | + `not_full` | `already_booked` | `already_on_waitlist` | … +- `DELETE /v1/events/:id/waitlist` — выйти из очереди (`left`); `404` если не в waiting. +- `GET /v1/events/:id/waitlist` — гость: `{enabled, joined, position?, total}`; + owner/specialist: список waiting (FIFO по `created_at`). +- **Promote:** при освобождении места (cancel / decline / expire / timeout-cancel) + первый `waiting` → booking по политике `confirmation` календаря; статус entry + `promoted`; email + in-app `waitlist_promoted`. + #### Специалисты - Специалист = существующий `user`, привязанный к commercial-календарю @@ -228,7 +246,10 @@ Legacy: прямой `POST /v1/calendars/:id/specialists` **не использ - **Pilot / ops:** SMTP / transactional email; backup; secrets / certs / alerts; legal stubs; позиция и боевой эквайринг **подписки владельца** (не оплата услуги клиентом); DNS/SPF без покупки домена без явного ок. -- Waitlist на событие (после уведомлений). +- Waitlist на событие — **сделано** (Back#72): таблица `waitlist_entry`; + API `POST/DELETE/GET /v1/events/:id/waitlist`; только commercial с + `settings.waitlist_enabled=true`; join при полном слоте; FIFO promote при + cancel/decline/expire + email/in-app `waitlist_promoted`. UI join — Front#70. - Серверный logout / revoke session; загрузка файлов avatar/cover — **сделано** (Back#71); вложения к событию — позже. - Email-reminder booking — **сделано** (Back#70, §2.6); Web Push / prefs — позже. @@ -591,6 +612,10 @@ src/ - `POST /v1/events/:id/bookings` — запись на событие. Recurring master: тело `{ "occurrence_start": "" }` обязательно; booking на материализованный instance. - `GET /v1/events/:id/bookings` — список бронирований события (владелец). +- `POST /v1/events/:id/waitlist` — лист ожидания (commercial + `settings.waitlist_enabled`); + см. §2.1.2 «Лист ожидания». +- `DELETE /v1/events/:id/waitlist` — выйти из очереди. +- `GET /v1/events/:id/waitlist` — статус (гость) или список (owner/specialist). - `GET /v1/bookings/:id` — статус бронирования. - `PUT /v1/bookings/:id` — подтвердить/отклонить (`confirm`|`decline`); владелец — любые booking календаря; active specialist — только события со своим `specialist_id`. diff --git a/EventHubFrontSpec.md b/EventHubFrontSpec.md index 36a4113..c7eebeb 100644 --- a/EventHubFrontSpec.md +++ b/EventHubFrontSpec.md @@ -376,7 +376,9 @@ legal stubs; позиция по подписке **владельца**; DNS/SP `POST /v1/calendars/:id/cover` (Back#71); UI — Front#69; вложения — позже - полноценный push / reminders (email-reminder booking: Back#70 / `process_reminders`; Web Push / prefs — позже) -- waitlist на событие +- waitlist: API Back#72; включение — чекбокс «Лист ожидания» + (`settings.waitlist_enabled`) в настройках commercial (Studio / + CalendarsPage org defaults); UI join/leave на полном слоте — Front#70 - шаринг календаря с правами (`calendar_share`) — низкий приоритет, не путать со specialist_invite - явный `client_type=mobile` — хвост (фаза 3 бэка / нативный клиент)