Skip to content

feat: add film reviews with useful rating - #7

Merged
DariaPrindina merged 3 commits into
developfrom
add-reviews
Oct 8, 2026
Merged

DariaPrindina merged 3 commits into
developfrom
add-reviews

Conversation

@DariaPrindina

@DariaPrindina DariaPrindina commented Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator

Отзывы на фильмы

Добавлены отзывы к фильмам с рейтингом полезности.

API

  • POST /reviews — добавить отзыв
  • PUT /reviews — изменить отзыв
  • DELETE /reviews/{id} — удалить отзыв
  • GET /reviews/{id} — получить отзыв по id
  • GET /reviews?filmId={filmId}&count={count} — отзывы к фильму (без filmId — все), по умолчанию 10
  • PUT /reviews/{id}/like/{userId}, PUT /reviews/{id}/dislike/{userId} — оценить отзыв
  • DELETE /reviews/{id}/like/{userId}, DELETE /reviews/{id}/dislike/{userId} — убрать оценку

Как работает

  • При создании useful = 0. Лайк даёт +1, дизлайк −1.
  • useful не хранится в таблице, а считается по оценкам в review_likes, поэтому не может разойтись с ними.
  • Один пользователь — одна оценка: дизлайк после лайка заменяет лайк (useful 1 → −1).
  • Отзывы сортируются по useful по убыванию, при равенстве — по id.
  • PUT /reviews меняет только content и isPositive. Автор, фильм и useful из тела запроса не берутся.
  • Валидация: пустой текст или отсутствие isPositive, userId или filmId дают 400. Неизвестный пользователь, фильм или отзыв дают 404.

База данных

  • reviews — отзывы
  • review_likes — оценки отзывов (is_useful: TRUE — лайк, FALSE — дизлайк), составной ключ (review_id, user_id)

Обе таблицы ссылаются на users и films с ON DELETE CASCADE. При удалении пользователя или фильма его отзывы и оценки удаляются автоматически, отдельно в удалении ничего делать не нужно.

Тесты

  • ReviewDbStorageTest — 9 интеграционных тестов хранилища: CRUD, подсчёт useful, замена лайка дизлайком, сортировка и фильтр по фильму, каскадное удаление с фильмом.
  • Локально прогнала Postman Практикума для add-reviews: 168/168.

Для остальных веток

  • Новые таблицы дописаны в конец schema.sql. Если в вашей ветке там тоже новые таблицы, при подтягивании develop будет простой конфликт: оставить обе части.
  • README: добавлены эндпоинты отзывов и таблицы на ER-диаграмме.

@ksupyl ksupyl left a comment

Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Даша, спасибо, очень аккуратная работа 🙌

Тесты Практикума проходят все, юнит-тесты и чекстайл зелёные. Каскадное удаление на месте, полезность считается из оценок, README и ER-диаграмма обновлены.

Когда Кирилл апрувнет — влей, пожалуйста, через Squash and merge с заголовком:
feat: add film reviews with useful rating (#7)

@ksupyl

ksupyl commented Oct 8, 2026

Copy link
Copy Markdown
Owner

На будущее, к ленте событий (в этом PR ничего менять не надо):

Тесты ленты ждут события REVIEW на ADD, UPDATE и REMOVE, и в каждом userId — автор отзыва.

— В delete() отзыв из getReviewOrThrow сейчас никуда не сохраняется, а в DELETE /reviews/{id} userId нет.
Сохранить его лучше в переменную — оттуда и возьмёшь автора для события REMOVE.
— Для UPDATE автора тоже лучше брать из базы, а не из тела запроса: тест обновления присылает в теле чужой userId.

getReviewOrThrow(reviewId);
checkUserExists(userId);
reviewStorage.addRating(reviewId, userId, isUseful);
log.debug("Пользователь id={} оценил отзыв id={}: полезный={}", userId, reviewId, isUseful);

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Можно добавить запрет на самолайк

@DariaPrindina DariaPrindina Oct 8, 2026 •

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

запрет на самолайк сломает автотесты Практикума: в тесте «Add like to review» автор лайкает собственный отзыв и ожидается 200. Поэтому оставляю как в спецификации, без ограничения.

@Kirill-Kazantcev Kirill-Kazantcev left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Апрув, тесты проходят, все выполнено по заданию
Можно улучшить добавив запрет на самолайк

@ksupyl ksupyl linked an issue Oct 8, 2026 that may be closed by this pull request
@DariaPrindina DariaPrindina changed the title Add reviews feat: add film reviews with useful rating (#7) Oct 8, 2026
@DariaPrindina DariaPrindina changed the title feat: add film reviews with useful rating (#7) feat: add film reviews with useful rating Oct 8, 2026
@DariaPrindina
DariaPrindina merged commit 90c59c8 into develop Oct 8, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Функциональность «Отзывы». 4 SP

3 participants