P1: Aggregated booking-requests + image_url в search #59

Closed
opened 2026-07-27 14:24:48 +03:00 by cursor-ai · 1 comment
Owner

Проблема

На /bookings нет единого inbox для pending-заявок, которые пользователь должен подтвердить как владелец календаря или назначенный specialist (event.specialist_id). Сейчас Confirm/Decline есть только в карточке события (GET /v1/events/:id/bookings), а GET /v1/user/bookings — только участник.

Также Discover (GET /v1/search) не отдаёт image_url календаря в format_calendar, хотя поле есть в модели.

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

  1. GET /v1/user/booking-requests — агрегированный список pending bookings, которыми пользователь может управлять (owner всех событий своих календарей + active specialist только на событиях со своим specialist_id).
  2. Confirm/Decline по-прежнему через PUT /v1/bookings/:id (без изменений).
  3. В search/discovery для calendar-результатов отдаётся image_url (если задан).
  4. eunit + OpenAPI trails + обновление BackSpec.

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

  • Endpoint auth-only, default status=pending
  • Owner видит pending всех своих commercial-событий; specialist — только свои слоты
  • Ответ обогащён контекстом события (title, start_time, calendar_id/title, role owner|specialist)
  • image_url в format_calendar поиска
  • eunit покрывает owner + specialist + stranger empty
  • Spec/OpenAPI обновлены

Приоритет

P1

Связь

Refs EventHub/EventHubSpec#10, #11. UI — отдельная задача Front.

## Проблема На `/bookings` нет единого inbox для pending-заявок, которые пользователь должен подтвердить как владелец календаря или назначенный specialist (`event.specialist_id`). Сейчас Confirm/Decline есть только в карточке события (`GET /v1/events/:id/bookings`), а `GET /v1/user/bookings` — только участник. Также Discover (`GET /v1/search`) не отдаёт `image_url` календаря в format_calendar, хотя поле есть в модели. ## Ожидаемый результат 1. `GET /v1/user/booking-requests` — агрегированный список pending bookings, которыми пользователь может управлять (owner всех событий своих календарей + active specialist только на событиях со своим `specialist_id`). 2. Confirm/Decline по-прежнему через `PUT /v1/bookings/:id` (без изменений). 3. В search/discovery для calendar-результатов отдаётся `image_url` (если задан). 4. eunit + OpenAPI trails + обновление BackSpec. ## Критерии приёмки - [ ] Endpoint auth-only, default `status=pending` - [ ] Owner видит pending всех своих commercial-событий; specialist — только свои слоты - [ ] Ответ обогащён контекстом события (title, start_time, calendar_id/title, role owner|specialist) - [ ] `image_url` в format_calendar поиска - [ ] eunit покрывает owner + specialist + stranger empty - [ ] Spec/OpenAPI обновлены ## Приоритет P1 ## Связь Refs EventHub/EventHubSpec#10, #11. UI — отдельная задача Front.
cursor-ai added the Task label 2026-07-27 14:24:48 +03:00
cursor-ai self-assigned this 2026-07-27 14:24:48 +03:00
Author
Owner

Готово (Back)

Задеплоено в master: 1d9752bb69113ccb0e3303375c663478f6ab5bd8

API

  • GET /v1/user/booking-requests (auth) — агрегат pending-заявок:
    • owner — все pending по событиям своих календарей
    • specialist — только pending на событиях с event.specialist_id = me и active specialist на календаре
    • если owner+specialist на одном событии — одна запись с role=owner
  • Confirm/Decline без изменений: PUT /v1/bookings/:id
  • Search: image_url в format_calendar и в event-hits (из календаря)

Тесты

rebar3 eunit --module=logic_booking_tests,logic_search_tests
→ 38 tests, 0 failures

Покрыто: owner inbox, specialist inbox (чужие слоты не видны), stranger → [], search image_url.

Осталось вне Back

  • Обновление EventHubSpec / BackSpec (контракт) — агент Spec
  • UI inbox на /bookings — Front#30
## Готово (Back) Задеплоено в `master`: `1d9752bb69113ccb0e3303375c663478f6ab5bd8` ### API - `GET /v1/user/booking-requests` (auth) — агрегат pending-заявок: - **owner** — все pending по событиям своих календарей - **specialist** — только pending на событиях с `event.specialist_id = me` и active specialist на календаре - если owner+specialist на одном событии — одна запись с `role=owner` - Confirm/Decline без изменений: `PUT /v1/bookings/:id` - Search: `image_url` в `format_calendar` и в event-hits (из календаря) ### Тесты ``` rebar3 eunit --module=logic_booking_tests,logic_search_tests → 38 tests, 0 failures ``` Покрыто: owner inbox, specialist inbox (чужие слоты не видны), stranger → `[]`, search `image_url`. ### Осталось вне Back - Обновление `EventHubSpec` / BackSpec (контракт) — агент Spec - UI inbox на `/bookings` — Front#30
Sign in to join this conversation.