Repository navigation
feat: add film reviews with useful rating - #7
Conversation
ksupyl
left a comment
There was a problem hiding this comment.
Даша, спасибо, очень аккуратная работа 🙌
Тесты Практикума проходят все, юнит-тесты и чекстайл зелёные. Каскадное удаление на месте, полезность считается из оценок, README и ER-диаграмма обновлены.
Когда Кирилл апрувнет — влей, пожалуйста, через Squash and merge с заголовком:
feat: add film reviews with useful rating (#7)
|
На будущее, к ленте событий (в этом PR ничего менять не надо): Тесты ленты ждут события REVIEW на ADD, UPDATE и REMOVE, и в каждом userId — автор отзыва. — В delete() отзыв из getReviewOrThrow сейчас никуда не сохраняется, а в DELETE /reviews/{id} userId нет. |
| getReviewOrThrow(reviewId); | ||
| checkUserExists(userId); | ||
| reviewStorage.addRating(reviewId, userId, isUseful); | ||
| log.debug("Пользователь id={} оценил отзыв id={}: полезный={}", userId, reviewId, isUseful); |
There was a problem hiding this comment.
Можно добавить запрет на самолайк
There was a problem hiding this comment.
запрет на самолайк сломает автотесты Практикума: в тесте «Add like to review» автор лайкает собственный отзыв и ожидается 200. Поэтому оставляю как в спецификации, без ограничения.
Kirill-Kazantcev
left a comment
There was a problem hiding this comment.
Апрув, тесты проходят, все выполнено по заданию
Можно улучшить добавив запрет на самолайк
Отзывы на фильмы
Добавлены отзывы к фильмам с рейтингом полезности.
API
POST /reviews— добавить отзывPUT /reviews— изменить отзывDELETE /reviews/{id}— удалить отзывGET /reviews/{id}— получить отзыв по idGET /reviews?filmId={filmId}&count={count}— отзывы к фильму (безfilmId— все), по умолчанию 10PUT /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, поэтому не может разойтись с ними.useful1 → −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, замена лайка дизлайком, сортировка и фильтр по фильму, каскадное удаление с фильмом.add-reviews: 168/168.Для остальных веток
schema.sql. Если в вашей ветке там тоже новые таблицы, при подтягиванииdevelopбудет простой конфликт: оставить обе части.