From a536203321f068bf132d42f684d738cc1362ab81 Mon Sep 17 00:00:00 2001 From: Just Roma Date: Thu, 15 May 2025 02:05:43 +0500 Subject: [PATCH 1/7] fix --- .../controller/ReviewController.java | 2 +- .../filmorate/dal/JdbcFilmRepository.java | 28 ++++++----- .../filmorate/dal/JdbcReviewRepository.java | 48 +++++++++++++++---- .../filmorate/dal/JdbcUserRepository.java | 9 +++- .../filmorate/service/ReviewServiceImpl.java | 2 +- .../filmorate/service/UserServiceImpl.java | 6 ++- 6 files changed, 70 insertions(+), 25 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/ReviewController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/ReviewController.java index 8b53672..af952ac 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/ReviewController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/ReviewController.java @@ -26,7 +26,7 @@ public Optional getReviewById(@PathVariable long id) { @GetMapping @ResponseStatus(HttpStatus.OK) - public List getAllReviewsByFilmId(@RequestParam(value = "filmId") long filmId, + public List getAllReviewsByFilmId(@RequestParam(value = "filmId", defaultValue = "-1") long filmId, @RequestParam(value = "count", defaultValue = "10") long count) { return reviewService.getAllReviewsByFilmId(filmId, count); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java index fe7e86f..32b3e83 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java @@ -1,6 +1,8 @@ package ru.yandex.practicum.filmorate.dal; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DataIntegrityViolationException; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.support.GeneratedKeyHolder; @@ -21,6 +23,7 @@ import java.util.stream.Collectors; import java.util.stream.Stream; +@Slf4j @Repository @RequiredArgsConstructor public class JdbcFilmRepository implements FilmRepository { @@ -281,17 +284,20 @@ public void connectDirectors(Collection films) { @Override public void addLike(long filmId, long userId) { - GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); - MapSqlParameterSource params = new MapSqlParameterSource(); - params.addValue("user_id", userId); - params.addValue("film_id", filmId); - jdbc.update(ADD_LIKE_QUERY, params, keyHolder); - - MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); - paramsActivity.addValue("userId", userId); - paramsActivity.addValue("entityId", filmId); - - jdbc.update(ACTIVITY_FILM_LIKE, paramsActivity); + try { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("user_id", userId); + params.addValue("film_id", filmId); + jdbc.update(ADD_LIKE_QUERY, params); + + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", userId); + paramsActivity.addValue("entityId", filmId); + + jdbc.update(ACTIVITY_FILM_LIKE, paramsActivity); + } catch (DataIntegrityViolationException ex) { + log.debug("Лайк уже существует: userId={}, filmId={}", userId, filmId); + } } @Override diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java index 707cfe4..e0c7086 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java @@ -11,8 +11,11 @@ import ru.yandex.practicum.filmorate.model.Review; import java.time.Instant; +import java.util.ArrayList; +import java.util.Comparator; import java.util.List; import java.util.Optional; +import java.util.stream.Collectors; import java.util.stream.Stream; @Repository @@ -45,7 +48,22 @@ public class JdbcReviewRepository implements ReviewRepository { COALESCE(SUM(rl.reaction_type), 0) AS useful FROM reviews r LEFT JOIN reviews_likes rl ON r.reviewId = rl.reviewId - GROUP BY r.reviewId, r.content, r.isPositive, r.userId, r.filmId; + GROUP BY r.reviewId, r.content, r.isPositive, r.userId, r.filmId + LIMIT :count; + """; + private static final String GET_ALL_REVIEW_BY_FILM = """ + SELECT + r.reviewId, + r.content, + r.isPositive, + r.userId, + r.filmId, + COALESCE(SUM(rl.reaction_type), 0) AS useful + FROM reviews r + LEFT JOIN reviews_likes rl ON r.reviewId = rl.reviewId + WHERE r.filmId = :filmId + GROUP BY r.reviewId, r.content, r.isPositive, r.userId, r.filmId + LIMIT :count; """; private static final String CREATE_REVIEW = """ @@ -54,7 +72,7 @@ INSERT INTO reviews (content, isPositive, userId, filmId, useful) """; private static final String UPDATE_REVIEW = """ UPDATE reviews - SET content=:content, isPositive=:isPositive, userId=:userId, filmId=:filmId, useful=:useful + SET content=:content, isPositive=:isPositive, useful=:useful WHERE reviewId=:reviewId """; private static final String DELETE_REVIEW = """ @@ -110,7 +128,17 @@ public Optional getReviewById(long reviewId) { @Override public List getAllReviewsByFilmId(long filmId, long count) { - return jdbc.query(GET_ALL_REVIEW, reviewMapper).reversed(); + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("count", count); + if (filmId == -1) { + return jdbc.query(GET_ALL_REVIEW, params, reviewMapper).stream() + .sorted(Comparator.comparingLong(Review::getUseful).reversed()) + .collect(Collectors.toList()); + } + params.addValue("filmId", filmId); + return jdbc.query(GET_ALL_REVIEW_BY_FILM, params, reviewMapper).stream() + .sorted(Comparator.comparingLong(Review::getUseful).reversed()) + .collect(Collectors.toList()); } @Override @@ -143,8 +171,8 @@ public Review update(Review review) { params.addValue("content", review.getContent()); params.addValue("isPositive", review.getIsPositive()); - params.addValue("userId", review.getUserId()); - params.addValue("filmId", review.getFilmId()); +// params.addValue("userId", review.getUserId()); +// params.addValue("filmId", review.getFilmId()); params.addValue("useful", review.getUseful()); params.addValue("reviewId", review.getReviewId()); @@ -196,11 +224,11 @@ public void addDislike(long reviewId, long userId) { params.addValue("userId", userId); jdbc.update(ADD_DISLIKE_REVIEW, params); - MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); - paramsActivity.addValue("userId", userId); - paramsActivity.addValue("entityId", reviewId); - - jdbc.update(ACTIVITY_REVIEW_ADD_DISLIKE, paramsActivity); +// MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); +// paramsActivity.addValue("userId", userId); +// paramsActivity.addValue("entityId", reviewId); +// +// jdbc.update(ACTIVITY_REVIEW_ADD_DISLIKE, paramsActivity); } @Override diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java index e1ad717..346cd72 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java @@ -51,6 +51,14 @@ public class JdbcUserRepository implements UserRepository { EventType.FRIEND + "','" + OperationType.REMOVE + "', " + instantOfMilliSecond() + ")"; private static final String GET_ACTIVITY_BY_USER_ID = "SELECT * FROM activity WHERE userId = :userId"; + private static final String GET_ACTIVITY_BY_USER_FRIEND = """ + SELECT a.* + FROM activity a + WHERE a.userId IN ( + SELECT friend_id FROM friends WHERE user_id = :userId + ) + ORDER BY a.timestamp DESC; + """; private static long instantOfMilliSecond() { return Instant.now().toEpochMilli(); @@ -107,7 +115,6 @@ public Optional getUserById(long userId) { @Override public List getAllUsers() { return jdbc.query(GET_ALL_USERS_QUERY, mapper); - } @Override diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java index ecf6c7e..2c7c53f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java @@ -30,7 +30,7 @@ public Optional getReviewById(long reviewId) { @Override public List getAllReviewsByFilmId(long filmId, long count) { - checkFilmId(filmId); +// checkFilmId(filmId); return jdbcReviewRepository.getAllReviewsByFilmId(filmId, count); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/UserServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/UserServiceImpl.java index 05d6655..3decc38 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserServiceImpl.java @@ -22,7 +22,11 @@ public class UserServiceImpl implements UserService { @Override public List getActivityById(long userId) { - return jdbcUserRepository.getActivityById(userId); + List activities = jdbcUserRepository.getActivityById(userId); + if (activities.isEmpty()) { + throw new NotFoundException("Активность пользователя не найдена"); + } + return activities; } @Override From 899d6e199ed2db5bcbcc98caf1b8d80c92556889 Mon Sep 17 00:00:00 2001 From: Nadezhda Kotegova Date: Thu, 15 May 2025 01:53:04 +0300 Subject: [PATCH 2/7] clean ups --- .../filmorate/dal/JdbcReviewRepository.java | 1 - .../filmorate/service/ReviewService.java | 16 ++++++++-------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java index e0c7086..21e8424 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java @@ -11,7 +11,6 @@ import ru.yandex.practicum.filmorate.model.Review; import java.time.Instant; -import java.util.ArrayList; import java.util.Comparator; import java.util.List; import java.util.Optional; diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/ReviewService.java b/src/main/java/ru/yandex/practicum/filmorate/service/ReviewService.java index 55d8dab..f2a70b1 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/ReviewService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/ReviewService.java @@ -6,20 +6,20 @@ import java.util.Optional; public interface ReviewService { - public Optional getReviewById(long reviewId); + Optional getReviewById(long reviewId); - public List getAllReviewsByFilmId(long filmId, long count); + List getAllReviewsByFilmId(long filmId, long count); - public Review create(Review review); + Review create(Review review); - public Review update(Review review); + Review update(Review review); - public void deleteReview(long reviewId); + void deleteReview(long reviewId); - public void addLike(long reviewId, long userId); + void addLike(long reviewId, long userId); - public void addDislike(long reviewId, long userId); + void addDislike(long reviewId, long userId); - public void deleteReaction(long reviewId, long userId); + void deleteReaction(long reviewId, long userId); } From f777dc6609935d8271a96ca483da233ceb73adaa Mon Sep 17 00:00:00 2001 From: Just Roma Date: Thu, 15 May 2025 14:21:55 +0500 Subject: [PATCH 3/7] fix 2 --- .../filmorate/dal/JdbcReviewRepository.java | 24 +++++++++---------- .../filmorate/dal/JdbcUserRepository.java | 8 ------- 2 files changed, 11 insertions(+), 21 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java index e0c7086..83fd592 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java @@ -171,8 +171,6 @@ public Review update(Review review) { params.addValue("content", review.getContent()); params.addValue("isPositive", review.getIsPositive()); -// params.addValue("userId", review.getUserId()); -// params.addValue("filmId", review.getFilmId()); params.addValue("useful", review.getUseful()); params.addValue("reviewId", review.getReviewId()); @@ -184,7 +182,7 @@ public Review update(Review review) { jdbc.update(ACTIVITY_REVIEW_UPDATE, paramsActivity); - return review; + return getReviewById(review.getReviewId()).get(); } @Override @@ -209,11 +207,11 @@ public void addLike(long reviewId, long userId) { params.addValue("userId", userId); jdbc.update(ADD_LIKE_REVIEW, params); - MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); - paramsActivity.addValue("userId", userId); - paramsActivity.addValue("entityId", reviewId); - - jdbc.update(ACTIVITY_REVIEW_ADD_LIKE, paramsActivity); +// MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); +// paramsActivity.addValue("userId", userId); +// paramsActivity.addValue("entityId", reviewId); +// +// jdbc.update(ACTIVITY_REVIEW_ADD_LIKE, paramsActivity); } @Override @@ -238,11 +236,11 @@ public void deleteReaction(long reviewId, long userId) { params.addValue("userId", userId); jdbc.update(DELETE_LIKE_REVIEW, params); - MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); - paramsActivity.addValue("userId", userId); - paramsActivity.addValue("entityId", reviewId); - - jdbc.update(ACTIVITY_REVIEW_DELETE_REACTION, paramsActivity); +// MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); +// paramsActivity.addValue("userId", userId); +// paramsActivity.addValue("entityId", reviewId); +// +// jdbc.update(ACTIVITY_REVIEW_DELETE_REACTION, paramsActivity); } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java index 346cd72..05c4d0e 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java @@ -51,14 +51,6 @@ public class JdbcUserRepository implements UserRepository { EventType.FRIEND + "','" + OperationType.REMOVE + "', " + instantOfMilliSecond() + ")"; private static final String GET_ACTIVITY_BY_USER_ID = "SELECT * FROM activity WHERE userId = :userId"; - private static final String GET_ACTIVITY_BY_USER_FRIEND = """ - SELECT a.* - FROM activity a - WHERE a.userId IN ( - SELECT friend_id FROM friends WHERE user_id = :userId - ) - ORDER BY a.timestamp DESC; - """; private static long instantOfMilliSecond() { return Instant.now().toEpochMilli(); From 8f9f057255616bdbeab2f5a75eb80547ed51ba55 Mon Sep 17 00:00:00 2001 From: Just Roma Date: Thu, 15 May 2025 15:53:17 +0500 Subject: [PATCH 4/7] fix 2 --- .../practicum/filmorate/Enum/EventType.java | 1 - .../filmorate/dal/JdbcReviewRepository.java | 31 ++----------------- .../filmorate/dal/JdbcUserRepository.java | 5 +++ 3 files changed, 7 insertions(+), 30 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/Enum/EventType.java b/src/main/java/ru/yandex/practicum/filmorate/Enum/EventType.java index 86b32c0..c31602b 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/Enum/EventType.java +++ b/src/main/java/ru/yandex/practicum/filmorate/Enum/EventType.java @@ -2,7 +2,6 @@ public enum EventType { LIKE, - DISLIKE, FRIEND, REVIEW } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java index 83fd592..f4e916b 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java @@ -104,14 +104,6 @@ INSERT INTO reviews_likes (reviewId, userId, reaction_type) private static final String ACTIVITY_REVIEW_DELETE = ACTIVITY_GENERAL + EventType.REVIEW + "','" + OperationType.REMOVE + "', " + instantOfMilliSecond() + ")"; - private static final String ACTIVITY_REVIEW_ADD_LIKE = ACTIVITY_GENERAL + - EventType.LIKE + "','" + OperationType.ADD + "', " + instantOfMilliSecond() + ")"; - - private static final String ACTIVITY_REVIEW_ADD_DISLIKE = ACTIVITY_GENERAL + - EventType.DISLIKE + "','" + OperationType.ADD + "', " + instantOfMilliSecond() + ")"; - - private static final String ACTIVITY_REVIEW_DELETE_REACTION = ACTIVITY_GENERAL + - EventType.LIKE + "','" + OperationType.REMOVE + "', " + instantOfMilliSecond() + ")"; private static long instantOfMilliSecond() { return Instant.now().toEpochMilli(); @@ -190,10 +182,9 @@ public void deleteReview(long reviewId) { MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("reviewId", reviewId); - Optional review = getReviewById(reviewId); MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); - paramsActivity.addValue("userId", review.get().getUserId()); - paramsActivity.addValue("entityId", review.get().getReviewId()); + paramsActivity.addValue("userId", getReviewById(reviewId).get().getUserId()); + paramsActivity.addValue("entityId", reviewId); jdbc.update(ACTIVITY_REVIEW_DELETE, paramsActivity); jdbc.update(DELETE_REVIEW, params); @@ -206,12 +197,6 @@ public void addLike(long reviewId, long userId) { params.addValue("reviewId", reviewId); params.addValue("userId", userId); jdbc.update(ADD_LIKE_REVIEW, params); - -// MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); -// paramsActivity.addValue("userId", userId); -// paramsActivity.addValue("entityId", reviewId); -// -// jdbc.update(ACTIVITY_REVIEW_ADD_LIKE, paramsActivity); } @Override @@ -221,12 +206,6 @@ public void addDislike(long reviewId, long userId) { params.addValue("reviewId", reviewId); params.addValue("userId", userId); jdbc.update(ADD_DISLIKE_REVIEW, params); - -// MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); -// paramsActivity.addValue("userId", userId); -// paramsActivity.addValue("entityId", reviewId); -// -// jdbc.update(ACTIVITY_REVIEW_ADD_DISLIKE, paramsActivity); } @Override @@ -235,12 +214,6 @@ public void deleteReaction(long reviewId, long userId) { params.addValue("reviewId", reviewId); params.addValue("userId", userId); jdbc.update(DELETE_LIKE_REVIEW, params); - -// MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); -// paramsActivity.addValue("userId", userId); -// paramsActivity.addValue("entityId", reviewId); -// -// jdbc.update(ACTIVITY_REVIEW_DELETE_REACTION, paramsActivity); } } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java index 05c4d0e..d69d230 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java @@ -10,10 +10,12 @@ import ru.yandex.practicum.filmorate.Enum.OperationType; import ru.yandex.practicum.filmorate.dal.mappers.ActivityRowMapper; import ru.yandex.practicum.filmorate.model.Activity; +import ru.yandex.practicum.filmorate.model.Review; import ru.yandex.practicum.filmorate.model.User; import java.time.Instant; import java.util.*; +import java.util.stream.Collectors; import java.util.stream.Stream; @Repository @@ -61,6 +63,9 @@ public List getActivityById(long userId) { MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); paramsActivity.addValue("userId", userId); return jdbc.query(GET_ACTIVITY_BY_USER_ID, paramsActivity, activityRowMapper); +// .stream() +// .sorted(Comparator.comparingLong(Activity::getTimestamp).reversed()) +// .collect(Collectors.toList()); } @Override From a40945266f19034443e3704b9d137763f0c97286 Mon Sep 17 00:00:00 2001 From: Just Roma Date: Thu, 15 May 2025 16:45:33 +0500 Subject: [PATCH 5/7] fix 3 --- .../practicum/filmorate/dal/JdbcFilmRepository.java | 3 +++ .../practicum/filmorate/dal/JdbcReviewRepository.java | 11 +++++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java index 32b3e83..d0e0564 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java @@ -8,6 +8,7 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.rowset.SqlRowSet; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import ru.yandex.practicum.filmorate.Enum.EventType; import ru.yandex.practicum.filmorate.Enum.OperationType; import ru.yandex.practicum.filmorate.dal.mappers.DirectorRowMapper; @@ -282,6 +283,7 @@ public void connectDirectors(Collection films) { } } + @Transactional @Override public void addLike(long filmId, long userId) { try { @@ -300,6 +302,7 @@ public void addLike(long filmId, long userId) { } } + @Transactional @Override public void deleteLike(long filmId, long userId) { GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java index ba32006..cb7849c 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java @@ -5,9 +5,11 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.stereotype.Repository; +import org.springframework.transaction.annotation.Transactional; import ru.yandex.practicum.filmorate.Enum.EventType; import ru.yandex.practicum.filmorate.Enum.OperationType; import ru.yandex.practicum.filmorate.dal.mappers.ReviewRowMapper; +import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.model.Review; import java.time.Instant; @@ -132,6 +134,7 @@ public List getAllReviewsByFilmId(long filmId, long count) { .collect(Collectors.toList()); } + @Transactional @Override public Review create(Review review) { GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); @@ -141,7 +144,7 @@ public Review create(Review review) { params.addValue("isPositive", review.getIsPositive()); params.addValue("userId", review.getUserId()); params.addValue("filmId", review.getFilmId()); - params.addValue("useful", review.getUseful()); + params.addValue("useful", 0); jdbc.update(CREATE_REVIEW, params, keyHolder); review.setReviewId(keyHolder.getKeyAs(Long.class)); @@ -155,6 +158,7 @@ public Review create(Review review) { return review; } + @Transactional @Override public Review update(Review review) { GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); @@ -176,13 +180,16 @@ public Review update(Review review) { return getReviewById(review.getReviewId()).get(); } + @Transactional @Override public void deleteReview(long reviewId) { MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("reviewId", reviewId); MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); - paramsActivity.addValue("userId", getReviewById(reviewId).get().getUserId()); + Review review = getReviewById(reviewId) + .orElseThrow(() -> new NotFoundException("Review not found")); + paramsActivity.addValue("userId", review.getUserId()); paramsActivity.addValue("entityId", reviewId); jdbc.update(ACTIVITY_REVIEW_DELETE, paramsActivity); From 4855d3679cca6a945e7d01abbda909269bb06c98 Mon Sep 17 00:00:00 2001 From: Just Roma Date: Thu, 15 May 2025 21:15:30 +0500 Subject: [PATCH 6/7] fix fatalities --- .../practicum/filmorate/dal/JdbcFilmRepository.java | 12 ++++++------ .../filmorate/dal/JdbcReviewRepository.java | 12 ++++++------ .../practicum/filmorate/dal/JdbcUserRepository.java | 7 +------ 3 files changed, 13 insertions(+), 18 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java index d0e0564..60cd7fd 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java @@ -286,17 +286,17 @@ public void connectDirectors(Collection films) { @Transactional @Override public void addLike(long filmId, long userId) { + + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", userId); + paramsActivity.addValue("entityId", filmId); + + jdbc.update(ACTIVITY_FILM_LIKE, paramsActivity); try { MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("user_id", userId); params.addValue("film_id", filmId); jdbc.update(ADD_LIKE_QUERY, params); - - MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); - paramsActivity.addValue("userId", userId); - paramsActivity.addValue("entityId", filmId); - - jdbc.update(ACTIVITY_FILM_LIKE, paramsActivity); } catch (DataIntegrityViolationException ex) { log.debug("Лайк уже существует: userId={}, filmId={}", userId, filmId); } diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java index cb7849c..6964c1f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java @@ -124,7 +124,7 @@ public List getAllReviewsByFilmId(long filmId, long count) { MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("count", count); if (filmId == -1) { - return jdbc.query(GET_ALL_REVIEW, params, reviewMapper).stream() + return jdbc.query(GET_ALL_REVIEW, params, reviewMapper).stream() .sorted(Comparator.comparingLong(Review::getUseful).reversed()) .collect(Collectors.toList()); } @@ -168,16 +168,16 @@ public Review update(Review review) { params.addValue("isPositive", review.getIsPositive()); params.addValue("useful", review.getUseful()); params.addValue("reviewId", review.getReviewId()); - jdbc.update(UPDATE_REVIEW, params, keyHolder); + Review reviewUpdated = getReviewById(review.getReviewId()) + .orElseThrow(() -> new NotFoundException("Review not found")); MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); - paramsActivity.addValue("userId", review.getUserId()); - paramsActivity.addValue("entityId", review.getReviewId()); - + paramsActivity.addValue("userId", reviewUpdated.getUserId()); + paramsActivity.addValue("entityId", reviewUpdated.getReviewId()); jdbc.update(ACTIVITY_REVIEW_UPDATE, paramsActivity); - return getReviewById(review.getReviewId()).get(); + return reviewUpdated; } @Transactional diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java index d69d230..881c63d 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java @@ -10,12 +10,10 @@ import ru.yandex.practicum.filmorate.Enum.OperationType; import ru.yandex.practicum.filmorate.dal.mappers.ActivityRowMapper; import ru.yandex.practicum.filmorate.model.Activity; -import ru.yandex.practicum.filmorate.model.Review; import ru.yandex.practicum.filmorate.model.User; import java.time.Instant; import java.util.*; -import java.util.stream.Collectors; import java.util.stream.Stream; @Repository @@ -52,7 +50,7 @@ public class JdbcUserRepository implements UserRepository { private static final String ACTIVITY_FRIEND_DELETE = ACTIVITY_GENERAL + EventType.FRIEND + "','" + OperationType.REMOVE + "', " + instantOfMilliSecond() + ")"; - private static final String GET_ACTIVITY_BY_USER_ID = "SELECT * FROM activity WHERE userId = :userId"; + private static final String GET_ACTIVITY_BY_USER_ID = "SELECT * FROM activity WHERE userId = :userId ORDER BY eventId ASC"; private static long instantOfMilliSecond() { return Instant.now().toEpochMilli(); @@ -63,9 +61,6 @@ public List getActivityById(long userId) { MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); paramsActivity.addValue("userId", userId); return jdbc.query(GET_ACTIVITY_BY_USER_ID, paramsActivity, activityRowMapper); -// .stream() -// .sorted(Comparator.comparingLong(Activity::getTimestamp).reversed()) -// .collect(Collectors.toList()); } @Override From 4ac3bf025cd627526d42a42769dec0178927991e Mon Sep 17 00:00:00 2001 From: Nadezhda Kotegova Date: Thu, 15 May 2025 22:01:07 +0300 Subject: [PATCH 7/7] clean ups --- .../ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java index 2c7c53f..6b8f385 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/ReviewServiceImpl.java @@ -30,7 +30,6 @@ public Optional getReviewById(long reviewId) { @Override public List getAllReviewsByFilmId(long filmId, long count) { -// checkFilmId(filmId); return jdbcReviewRepository.getAllReviewsByFilmId(filmId, count); }