docs(spec): waitlist API and commercial waitlist_enabled setting.

Refs EventHub/EventHubBack#72
Refs EventHub/EventHubFront#70
This commit is contained in:
2026-08-14 21:44:20 +03:00
parent 07e89052fe
commit 3189390794
2 changed files with 29 additions and 2 deletions
+26 -1
View File
@@ -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": "<ISO8601>" }` обязательно; 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`.