diff --git a/src/main/java/ru/yandex/practicum/filmorate/dto/film/UpdateFilmRequest.java b/src/main/java/ru/yandex/practicum/filmorate/dto/film/UpdateFilmRequest.java index 24ba4dd..2f7c0d7 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dto/film/UpdateFilmRequest.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dto/film/UpdateFilmRequest.java @@ -14,6 +14,7 @@ import ru.yandex.practicum.filmorate.validation.AfterDate; import java.time.LocalDate; +import java.util.ArrayList; import java.util.List; @Data @@ -30,12 +31,8 @@ public class UpdateFilmRequest { Integer duration; MPARatingDto mpa; List genres; - List directors; - @JsonSetter(nulls = Nulls.AS_EMPTY) - public void setDirectors(List directors) { - this.directors = directors; - } + List directors = new ArrayList<>(); public boolean hasName() { return name != null && !name.isEmpty(); diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java index 31adb6a..e2aa20b 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/film/JdbcFilmRepository.java @@ -28,10 +28,15 @@ public class JdbcFilmRepository implements FilmRepository { f.release_date, f.duration_in_minutes, f.mpa_id, - mr.name AS mpa_name, - GROUP_CONCAT(DISTINCT CONCAT(g.genre_id, ':', g.name) ORDER BY g.genre_id SEPARATOR ';') AS genres, - GROUP_CONCAT(DISTINCT CONCAT(d.director_id, ':', d.name) - ORDER BY d.director_id SEPARATOR ';') AS directors + mr.name AS mpa_name, + (SELECT GROUP_CONCAT(DISTINCT CONCAT(g2.genre_id, ':', g2.name) ORDER BY g2.genre_id SEPARATOR ';') + FROM film_genres fg2 + JOIN genres g2 ON g2.genre_id = fg2.genre_id + WHERE fg2.film_id = f.film_id) AS genres, + (SELECT GROUP_CONCAT(DISTINCT CONCAT(d2.director_id, ':', d2.name) ORDER BY d2.director_id SEPARATOR ';') + FROM film_directors fd2 + JOIN directors d2 ON d2.director_id = fd2.director_id + WHERE fd2.film_id = f.film_id) AS directors FROM films f JOIN mpa_ratings mr ON f.mpa_id = mr.mpa_id LEFT JOIN film_genres fg ON f.film_id = fg.film_id diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/like/JdbcLikesRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/like/JdbcLikesRepository.java index 85a9b6f..f309b94 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/like/JdbcLikesRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/like/JdbcLikesRepository.java @@ -14,8 +14,10 @@ public class JdbcLikesRepository implements LikesRepository { public void addLike(long userId, long filmId) { MapSqlParameterSource params = getParameterMap(userId, filmId); String addLikeToFilmSql = """ - INSERT INTO likes (user_id, film_id) - VALUES (:user_id, :film_id)"""; + MERGE INTO likes (user_id, film_id) + KEY(user_id, film_id) + VALUES (:user_id, :film_id) + """; jdbc.update(addLikeToFilmSql, params); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/review/JdbcReviewRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/review/JdbcReviewRepository.java index ab66ed5..8bbb5bc 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/review/JdbcReviewRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/review/JdbcReviewRepository.java @@ -78,6 +78,7 @@ public Optional findById(long id) { MapSqlParameterSource params = new MapSqlParameterSource("review_id", id); List list = jdbc.query(BASE_SELECT_REVIEW_SQL.concat(""" WHERE r.review_id = :review_id + ORDER BY useful_rating DESC """), params, mapper); return list.isEmpty() ? Optional.empty() : Optional.of(list.getFirst()); } @@ -88,6 +89,7 @@ public Collection findAllByFilm(Long filmId, long count) { .addValue("count", count); return jdbc.query(BASE_SELECT_REVIEW_SQL.concat(""" WHERE fr.film_id = COALESCE(:film_id, fr.film_id) + ORDER BY useful_rating DESC LIMIT :count """), params, mapper); } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ac5b1c6..fc2688c 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -5,4 +5,4 @@ spring.sql.init.mode=ALWAYS spring.datasource.url=jdbc:h2:file:./db/filmorate spring.datasource.driverClassName=org.h2.Driver spring.datasource.username=sa -spring.datasource.password=password \ No newline at end of file +spring.datasource.password=password