docs: контракт review vote + OTP 28.2/rebar пути в WORKFLOW. Refs EventHub/EventHubBack#47
This commit is contained in:
+15
-2
@@ -74,6 +74,8 @@ EventHub — платформа для управления событиями
|
||||
- `booking` — добавлены `notes :: binary() | undefined`, `reminder_sent :: boolean()`
|
||||
- `review` — добавлены `likes :: non_neg_integer()`, `dislikes :: non_neg_integer()`,
|
||||
`edited_at :: calendar:datetime() | undefined`
|
||||
- `review_vote` — голос пользователя за отзыв: `id`, `review_id`, `user_id`,
|
||||
`value :: like | dislike`, `created_at`, `updated_at` (уникальность пары review+user)
|
||||
|
||||
#### 2.2.6. Требования к реализации
|
||||
- Все операции с событиями должны быть транзакционными.
|
||||
@@ -97,7 +99,15 @@ EventHub — платформа для управления событиями
|
||||
- Отзывы могут быть скрыты модератором.
|
||||
- При добавлении/изменении/удалении отзыва пересчитывается средний рейтинг события
|
||||
(`rating_avg`, `rating_count`).
|
||||
- Реализованы лайки/дизлайки отзывов (`likes`, `dislikes`).
|
||||
- Голосование за отзывы (user API, JWT):
|
||||
- таблица `review_vote` (один голос на пару `review_id` + `user_id`: `like` | `dislike`);
|
||||
- счётчики `likes` / `dislikes` на `review` обновляются в одной транзакции с голосом;
|
||||
- `PUT /v1/reviews/:id/vote` body `{"value":"like"|"dislike"}` — поставить/сменить
|
||||
(идемпотентно при том же value);
|
||||
- `DELETE /v1/reviews/:id/vote` — снять голос (идемпотентно);
|
||||
- нельзя голосовать за свой отзыв (`403`); скрытый/удалённый/отсутствующий → `404`;
|
||||
- в ответах `GET /v1/reviews`, `GET /v1/reviews/:id` (и при сериализации review) —
|
||||
поле `my_vote`: `"like"` | `"dislike"` | `null`.
|
||||
- Возможность пожаловаться на отзыв (создание `report`).
|
||||
|
||||
### 2.5. Поиск и фильтрация
|
||||
@@ -267,8 +277,11 @@ src/
|
||||
- `POST /v1/events/:id/bookings` — запись на событие.
|
||||
- `GET /v1/bookings/:id` — статус бронирования.
|
||||
- `POST /v1/reviews` — создать отзыв.
|
||||
- `GET /v1/reviews` — список отзывов.
|
||||
- `GET /v1/reviews` — список отзывов (поле `my_vote` для текущего пользователя).
|
||||
- `GET /v1/reviews/:id` — отзыв по ID (`my_vote`).
|
||||
- `PUT /v1/reviews/:id` — обновить отзыв.
|
||||
- `PUT /v1/reviews/:id/vote` — поставить/сменить голос (`{"value":"like"|"dislike"}`).
|
||||
- `DELETE /v1/reviews/:id/vote` — снять голос.
|
||||
- `POST /v1/reports` — пожаловаться (`target_type`: `event` | `calendar` | `review`).
|
||||
- `GET /v1/tickets` — тикеты пользователя.
|
||||
- `POST /v1/tickets` — создать или обновить тикет (дедуп по `error_hash`): body `{ error_message, stacktrace?, context?, source?: frontend|manual }`; ответ 201 (или 429 при rate-limit новых).
|
||||
|
||||
Reference in New Issue
Block a user