docs: контракт review vote + OTP 28.2/rebar пути в WORKFLOW. Refs EventHub/EventHubBack#47

This commit is contained in:
2026-07-19 21:31:55 +03:00
parent d7271f836d
commit f1ede63deb
2 changed files with 33 additions and 9 deletions
+15 -2
View File
@@ -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 новых).