From 1f661e26fad21834e4f6cc9588beef5cb5fa217e Mon Sep 17 00:00:00 2001 From: Just Roma Date: Sun, 11 May 2025 18:19:53 +0500 Subject: [PATCH 1/4] delete CHECK (release_date <= CURRENT_DATE) for schema in table films --- src/main/resources/schema.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index eaa6851..8c30e6a 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -13,7 +13,7 @@ CREATE TABLE IF NOT EXISTS films ( film_id BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, name VARCHAR(255) NOT NULL, description VARCHAR(200), - release_date DATE CHECK (release_date <= CURRENT_DATE), + release_date DATE, duration INT CHECK (duration > 0), mpa_id BIGINT REFERENCES mpa(mpa_id) ); From 1a8f0133711f480b993578a435656b8282c7e09b Mon Sep 17 00:00:00 2001 From: Just Roma Date: Tue, 13 May 2025 14:56:27 +0500 Subject: [PATCH 2/4] =?UTF-8?q?=20=D0=92=D0=B5=D1=82=D0=BA=D0=B0=20=D0=B4?= =?UTF-8?q?=D0=BB=D1=8F=20=D1=80=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=B0=D1=86?= =?UTF-8?q?=D0=B8=D0=B8=20=D0=B7=D0=B0=D0=B4=D0=B0=D1=87=D0=B8=20add-feed.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filmorate/controller/UserController.java | 8 ++ .../filmorate/dal/JdbcFilmRepository.java | 30 ++++++++ .../filmorate/dal/JdbcReviewRepository.java | 75 +++++++++++++++++++ .../filmorate/dal/JdbcUserRepository.java | 40 +++++++++- .../filmorate/dal/UserRepository.java | 3 + .../dal/mappers/ActivityrRowMapper.java | 23 ++++++ .../practicum/filmorate/model/Activity.java | 23 ++++++ .../filmorate/service/UserService.java | 3 + .../filmorate/service/UserServiceImpl.java | 9 ++- src/main/resources/schema.sql | 9 +++ 10 files changed, 221 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/dal/mappers/ActivityrRowMapper.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/model/Activity.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java index b17a7e8..488b5ac 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/UserController.java @@ -6,10 +6,12 @@ import org.springframework.http.HttpStatus; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; +import ru.yandex.practicum.filmorate.model.Activity; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.service.UserServiceImpl; import java.util.Collection; +import java.util.List; @RestController @RequiredArgsConstructor @@ -19,6 +21,12 @@ public class UserController { private final UserServiceImpl userService; + @GetMapping("/{userId}/feed") + @ResponseStatus(HttpStatus.OK) + public List getActivityByUserId(@PathVariable long userId) { + return userService.getActivityById(userId); + } + @GetMapping @ResponseStatus(HttpStatus.OK) public Collection findAll() { 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 ed04b64..b42c0f3 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java @@ -13,6 +13,7 @@ import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.model.Genre; +import java.time.Instant; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -94,6 +95,23 @@ WHERE fd.film_id IN (:film_ids) ORDER BY f.name; """; + private static final String ACTIVITY_GENERAL = + "INSERT INTO activity (userId, entityId, eventType, operation, timestamp)"; + + private static final String ACTIVITY_FILM_LIKE = ACTIVITY_GENERAL + + """ + VALUES(:userId, :entityId, 'LIKE', 'ADD', + """ + instantOfSecond() + ")"; + + private static final String ACTIVITY_FILM_LIKE_DELETE = ACTIVITY_GENERAL + + """ + VALUES(:userId, :entityId, 'LIKE', 'REMOVE', + """ + instantOfSecond() + ")"; + + private static long instantOfSecond() { + return Instant.now().toEpochMilli(); + } + @Override public Film create(Film film) { GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); @@ -258,6 +276,12 @@ public void addLike(long filmId, long userId) { params.addValue("user_id", userId); params.addValue("film_id", filmId); jdbc.update(ADD_LIKE_QUERY, params, keyHolder); + + MapSqlParameterSource params2 = new MapSqlParameterSource(); + params2.addValue("userId", userId); + params2.addValue("entityId", filmId); + + jdbc.update(ACTIVITY_FILM_LIKE, params2); } @Override @@ -267,6 +291,12 @@ public void deleteLike(long filmId, long userId) { params.addValue("user_id", userId); params.addValue("film_id", filmId); jdbc.update(DELETE_LIKE_QUERY, params, keyHolder); + + MapSqlParameterSource params2 = new MapSqlParameterSource(); + params2.addValue("userId", userId); + params2.addValue("entityId", filmId); + + jdbc.update(ACTIVITY_FILM_LIKE_DELETE, params2); } @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 c5229ae..32d2808 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java @@ -8,6 +8,7 @@ import ru.yandex.practicum.filmorate.dal.mappers.ReviewRowMapper; import ru.yandex.practicum.filmorate.model.Review; +import java.time.Instant; import java.util.List; import java.util.Optional; import java.util.stream.Stream; @@ -71,6 +72,43 @@ INSERT INTO reviews_likes (reviewId, userId, reaction_type) WHERE reviewId=:reviewId AND userId=:userId """; + private static final String ACTIVITY_GENERAL = + "INSERT INTO activity (userId, entityId, eventType, operation, timestamp)"; + + private static final String ACTIVITY_REVIEW_CREATE = ACTIVITY_GENERAL + + """ + VALUES(:userId, :entityId, 'REVIEW', 'ADD', + """ + instantOfSecond() + ")"; + + private static final String ACTIVITY_REVIEW_UPDATE = ACTIVITY_GENERAL + + """ + VALUES(:userId, :entityId, 'REVIEW', 'UPDATE', + """ + instantOfSecond() + ")"; + + private static final String ACTIVITY_REVIEW_DELETE = ACTIVITY_GENERAL + + """ + VALUES(:userId, :entityId, 'REVIEW', 'REMOVE', + """ + instantOfSecond() + ")"; + + + private static final String ACTIVITY_REVIEW_ADD_LIKE = ACTIVITY_GENERAL + + """ + VALUES(:userId, :entityId, 'LIKE', 'ADD', + """ + instantOfSecond() + ")"; + + private static final String ACTIVITY_REVIEW_ADD_DISLIKE = ACTIVITY_GENERAL + + """ + VALUES(:userId, :entityId, 'DISLIKE', 'ADD', + """ + instantOfSecond() + ")"; + + private static final String ACTIVITY_REVIEW_DELETE_REACTION = ACTIVITY_GENERAL + + """ + VALUES(:userId, :entityId, 'LIKE', 'REMOVE', + """ + instantOfSecond() + ")"; + + private static long instantOfSecond() { + return Instant.now().toEpochMilli(); + } @Override public Optional getReviewById(long reviewId) { @@ -100,6 +138,12 @@ public Review create(Review review) { jdbc.update(CREATE_REVIEW, params, keyHolder); review.setReviewId(keyHolder.getKeyAs(Long.class)); + MapSqlParameterSource params2 = new MapSqlParameterSource(); + params2.addValue("userId", review.getUserId()); + params2.addValue("entityId", review.getReviewId()); + + jdbc.update(ACTIVITY_REVIEW_CREATE, params2); + return review; } @@ -117,6 +161,12 @@ public Review update(Review review) { jdbc.update(UPDATE_REVIEW, params, keyHolder); + MapSqlParameterSource params2 = new MapSqlParameterSource(); + params2.addValue("userId", review.getUserId()); + params2.addValue("entityId", review.getReviewId()); + + jdbc.update(ACTIVITY_REVIEW_UPDATE, params2); + return review; } @@ -124,6 +174,13 @@ public Review update(Review review) { public void deleteReview(long reviewId) { MapSqlParameterSource params = new MapSqlParameterSource(); params.addValue("reviewId", reviewId); + + Optional review = getReviewById(reviewId); + MapSqlParameterSource params2 = new MapSqlParameterSource(); + params2.addValue("userId", review.get().getUserId()); + params2.addValue("entityId", review.get().getReviewId()); + + jdbc.update(ACTIVITY_REVIEW_DELETE, params2); jdbc.update(DELETE_REVIEW, params); } @@ -134,6 +191,12 @@ public void addLike(long reviewId, long userId) { params.addValue("reviewId", reviewId); params.addValue("userId", userId); jdbc.update(ADD_LIKE_REVIEW, params); + + MapSqlParameterSource params2 = new MapSqlParameterSource(); + params2.addValue("userId", userId); + params2.addValue("entityId", reviewId); + + jdbc.update(ACTIVITY_REVIEW_ADD_LIKE, params2); } @Override @@ -143,6 +206,12 @@ public void addDislike(long reviewId, long userId) { params.addValue("reviewId", reviewId); params.addValue("userId", userId); jdbc.update(ADD_DISLIKE_REVIEW, params); + + MapSqlParameterSource params2 = new MapSqlParameterSource(); + params2.addValue("userId", userId); + params2.addValue("entityId", reviewId); + + jdbc.update(ACTIVITY_REVIEW_ADD_DISLIKE, params2); } @Override @@ -151,6 +220,12 @@ public void deleteReaction(long reviewId, long userId) { params.addValue("reviewId", reviewId); params.addValue("userId", userId); jdbc.update(DELETE_LIKE_REVIEW, params); + + MapSqlParameterSource params2 = new MapSqlParameterSource(); + params2.addValue("userId", userId); + params2.addValue("entityId", reviewId); + + jdbc.update(ACTIVITY_REVIEW_DELETE_REACTION, params2); } } 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 b559549..eb037ba 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java @@ -6,9 +6,13 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.stereotype.Repository; +import ru.yandex.practicum.filmorate.dal.mappers.ActivityrRowMapper; +import ru.yandex.practicum.filmorate.model.Activity; import ru.yandex.practicum.filmorate.model.User; -import java.util.*; +import java.time.Instant; +import java.util.List; +import java.util.Optional; import java.util.stream.Stream; @Repository @@ -16,6 +20,7 @@ public class JdbcUserRepository implements UserRepository { private final NamedParameterJdbcOperations jdbc; private final RowMapper mapper; + private final ActivityrRowMapper activityrRowMapper; private static final String CREATE_USER_QUERY = "INSERT INTO users (login, email, name, birthday) VALUES(:login,:email,:name,:birthday)"; private static final String UPDATE_USER_QUERY = "UPDATE users SET login=:login, email=:email, name=:name, birthday=:birthday WHERE user_id=:user_id"; @@ -29,6 +34,29 @@ public class JdbcUserRepository implements UserRepository { + "JOIN friends f2 ON u.user_id = f2.friend_id WHERE f1.user_id = :user_id AND f2.user_id = :other_id"; private static final String FIND_USERS_BY_IDS_QUERY = "SELECT * FROM users WHERE user_id IN (:ids)"; + private static final String ACTIVITY_GENERAL = + "INSERT INTO activity (userId, entityId, eventType, operation, timestamp) "; + private static final String ACTIVITY_FRIEND_ADD = ACTIVITY_GENERAL + + """ + VALUES(:userId, :entityId, 'FRIEND', 'ADD', + """ + instantOfSecond() + ")"; + private static final String ACTIVITY_FRIEND_DELETE = ACTIVITY_GENERAL + + """ + VALUES(:userId, :entityId, 'FRIEND', 'REMOVE', + """ + instantOfSecond() + ")"; + private static final String GET_ACTIVITY_BY_USER_ID = "SELECT * FROM activity WHERE userId = :userId"; + + private static long instantOfSecond() { + return Instant.now().toEpochMilli(); + } + + @Override + public List getActivityById(long userId) { + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("userId", userId); + return jdbc.query(GET_ACTIVITY_BY_USER_ID, params, activityrRowMapper); + } + @Override public User create(User user) { GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); @@ -83,6 +111,11 @@ public void addFriend(long userId, long friendId) { params.addValue("user_id", userId); params.addValue("friend_id", friendId); jdbc.update(ADD_FRIEND_QUERY, params, keyHolder); + + MapSqlParameterSource params2 = new MapSqlParameterSource(); + params2.addValue("userId", userId); + params2.addValue("entityId", friendId); + jdbc.update(ACTIVITY_FRIEND_ADD, params2); } @Override @@ -92,6 +125,11 @@ public void deleteFriend(long userId, long friendId) { params.addValue("user_id", userId); params.addValue("friend_id", friendId); jdbc.update(DELETE_FRIEND_QUERY, params, keyHolder); + + MapSqlParameterSource params2 = new MapSqlParameterSource(); + params2.addValue("userId", userId); + params2.addValue("entityId", friendId); + jdbc.update(ACTIVITY_FRIEND_DELETE, params2); } @Override diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/UserRepository.java b/src/main/java/ru/yandex/practicum/filmorate/dal/UserRepository.java index 531de81..1d08cf9 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/UserRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/UserRepository.java @@ -1,11 +1,14 @@ package ru.yandex.practicum.filmorate.dal; +import ru.yandex.practicum.filmorate.model.Activity; import ru.yandex.practicum.filmorate.model.User; import java.util.List; import java.util.Optional; public interface UserRepository { + List getActivityById(long activityId); + Optional getUserById(long userId); List getUsersByIds(List userIds); diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/mappers/ActivityrRowMapper.java b/src/main/java/ru/yandex/practicum/filmorate/dal/mappers/ActivityrRowMapper.java new file mode 100644 index 0000000..4a9f8d2 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/mappers/ActivityrRowMapper.java @@ -0,0 +1,23 @@ +package ru.yandex.practicum.filmorate.dal.mappers; + +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.filmorate.model.Activity; + +import java.sql.ResultSet; +import java.sql.SQLException; + +@Component +public class ActivityrRowMapper implements RowMapper { + @Override + public Activity mapRow(ResultSet rs, int rowNum) throws SQLException { + Activity activity = new Activity(); + activity.setEventId(rs.getLong("eventId")); + activity.setUserId(rs.getLong("userId")); + activity.setEntityId(rs.getLong("entityId")); + activity.setEventType(rs.getString("eventType")); + activity.setOperation(rs.getString("operation")); + activity.setTimestamp(rs.getLong("timestamp")); + return activity; + } +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Activity.java b/src/main/java/ru/yandex/practicum/filmorate/model/Activity.java new file mode 100644 index 0000000..a6e54f6 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Activity.java @@ -0,0 +1,23 @@ +package ru.yandex.practicum.filmorate.model; + +import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@NoArgsConstructor +@AllArgsConstructor +public class Activity { + private long eventId; + @NotNull + private long userId; + @NotNull + private long entityId; + @NotNull + private String eventType; + @NotNull + private String operation; + @NotNull + private long timestamp; +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java index 95971a3..0b68c8a 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserService.java @@ -1,10 +1,13 @@ package ru.yandex.practicum.filmorate.service; +import ru.yandex.practicum.filmorate.model.Activity; import ru.yandex.practicum.filmorate.model.User; import java.util.List; public interface UserService { + List getActivityById(long activityId); + User getUserById(long userId); List getUsers(); 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 19c8a55..5357699 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/UserServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/UserServiceImpl.java @@ -7,9 +7,11 @@ import ru.yandex.practicum.filmorate.dal.JdbcUserRepository; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.exception.ValidationException; +import ru.yandex.practicum.filmorate.model.Activity; import ru.yandex.practicum.filmorate.model.User; -import java.util.*; +import java.util.ArrayList; +import java.util.List; @Service @Slf4j @@ -18,6 +20,11 @@ public class UserServiceImpl implements UserService { private final JdbcUserRepository jdbcUserRepository; + @Override + public List getActivityById(long userId) { + return jdbcUserRepository.getActivityById(userId); + } + @Override public User getUserById(long userId) { return jdbcUserRepository.getUserById(userId) diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 696ddca..26525b5 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -70,3 +70,12 @@ CREATE TABLE IF NOT EXISTS reviews_likes ( reaction_type SMALLINT NOT NULL CHECK (reaction_type IN (-1, 1)), PRIMARY KEY (reviewId, userId) ); + +CREATE TABLE IF NOT EXISTS activity ( + eventId BIGINT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY, + userId BIGINT NOT NULL REFERENCES users(user_id) ON DELETE CASCADE, + entityId INT NOT NULL, + eventType VARCHAR(20) NOT NULL, + operation VARCHAR(20) NOT NULL, + timestamp BIGINT NOT NULL +); From 06769f79a77a12833ca0c442b7c12d9a5ced7e3e Mon Sep 17 00:00:00 2001 From: Just Roma Date: Tue, 13 May 2025 15:32:13 +0500 Subject: [PATCH 3/4] =?UTF-8?q?=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../filmorate/dal/JdbcFilmRepository.java | 16 +++---- .../filmorate/dal/JdbcReviewRepository.java | 48 +++++++++---------- .../filmorate/dal/JdbcUserRepository.java | 26 +++++----- ...rRowMapper.java => ActivityRowMapper.java} | 2 +- 4 files changed, 46 insertions(+), 46 deletions(-) rename src/main/java/ru/yandex/practicum/filmorate/dal/mappers/{ActivityrRowMapper.java => ActivityRowMapper.java} (92%) 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 bc1e2c9..e0f29fb 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java @@ -276,11 +276,11 @@ public void addLike(long filmId, long userId) { params.addValue("film_id", filmId); jdbc.update(ADD_LIKE_QUERY, params, keyHolder); - MapSqlParameterSource params2 = new MapSqlParameterSource(); - params2.addValue("userId", userId); - params2.addValue("entityId", filmId); + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", userId); + paramsActivity.addValue("entityId", filmId); - jdbc.update(ACTIVITY_FILM_LIKE, params2); + jdbc.update(ACTIVITY_FILM_LIKE, paramsActivity); } @Override @@ -291,11 +291,11 @@ public void deleteLike(long filmId, long userId) { params.addValue("film_id", filmId); jdbc.update(DELETE_LIKE_QUERY, params, keyHolder); - MapSqlParameterSource params2 = new MapSqlParameterSource(); - params2.addValue("userId", userId); - params2.addValue("entityId", filmId); + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", userId); + paramsActivity.addValue("entityId", filmId); - jdbc.update(ACTIVITY_FILM_LIKE_DELETE, params2); + jdbc.update(ACTIVITY_FILM_LIKE_DELETE, paramsActivity); } @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 32d2808..9f14d94 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java @@ -138,11 +138,11 @@ public Review create(Review review) { jdbc.update(CREATE_REVIEW, params, keyHolder); review.setReviewId(keyHolder.getKeyAs(Long.class)); - MapSqlParameterSource params2 = new MapSqlParameterSource(); - params2.addValue("userId", review.getUserId()); - params2.addValue("entityId", review.getReviewId()); + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", review.getUserId()); + paramsActivity.addValue("entityId", review.getReviewId()); - jdbc.update(ACTIVITY_REVIEW_CREATE, params2); + jdbc.update(ACTIVITY_REVIEW_CREATE, paramsActivity); return review; } @@ -161,11 +161,11 @@ public Review update(Review review) { jdbc.update(UPDATE_REVIEW, params, keyHolder); - MapSqlParameterSource params2 = new MapSqlParameterSource(); - params2.addValue("userId", review.getUserId()); - params2.addValue("entityId", review.getReviewId()); + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", review.getUserId()); + paramsActivity.addValue("entityId", review.getReviewId()); - jdbc.update(ACTIVITY_REVIEW_UPDATE, params2); + jdbc.update(ACTIVITY_REVIEW_UPDATE, paramsActivity); return review; } @@ -176,11 +176,11 @@ public void deleteReview(long reviewId) { params.addValue("reviewId", reviewId); Optional review = getReviewById(reviewId); - MapSqlParameterSource params2 = new MapSqlParameterSource(); - params2.addValue("userId", review.get().getUserId()); - params2.addValue("entityId", review.get().getReviewId()); + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", review.get().getUserId()); + paramsActivity.addValue("entityId", review.get().getReviewId()); - jdbc.update(ACTIVITY_REVIEW_DELETE, params2); + jdbc.update(ACTIVITY_REVIEW_DELETE, paramsActivity); jdbc.update(DELETE_REVIEW, params); } @@ -192,11 +192,11 @@ public void addLike(long reviewId, long userId) { params.addValue("userId", userId); jdbc.update(ADD_LIKE_REVIEW, params); - MapSqlParameterSource params2 = new MapSqlParameterSource(); - params2.addValue("userId", userId); - params2.addValue("entityId", reviewId); + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", userId); + paramsActivity.addValue("entityId", reviewId); - jdbc.update(ACTIVITY_REVIEW_ADD_LIKE, params2); + jdbc.update(ACTIVITY_REVIEW_ADD_LIKE, paramsActivity); } @Override @@ -207,11 +207,11 @@ public void addDislike(long reviewId, long userId) { params.addValue("userId", userId); jdbc.update(ADD_DISLIKE_REVIEW, params); - MapSqlParameterSource params2 = new MapSqlParameterSource(); - params2.addValue("userId", userId); - params2.addValue("entityId", reviewId); + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", userId); + paramsActivity.addValue("entityId", reviewId); - jdbc.update(ACTIVITY_REVIEW_ADD_DISLIKE, params2); + jdbc.update(ACTIVITY_REVIEW_ADD_DISLIKE, paramsActivity); } @Override @@ -221,11 +221,11 @@ public void deleteReaction(long reviewId, long userId) { params.addValue("userId", userId); jdbc.update(DELETE_LIKE_REVIEW, params); - MapSqlParameterSource params2 = new MapSqlParameterSource(); - params2.addValue("userId", userId); - params2.addValue("entityId", reviewId); + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", userId); + paramsActivity.addValue("entityId", reviewId); - jdbc.update(ACTIVITY_REVIEW_DELETE_REACTION, params2); + 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 eb037ba..fd01570 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java @@ -6,7 +6,7 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.stereotype.Repository; -import ru.yandex.practicum.filmorate.dal.mappers.ActivityrRowMapper; +import ru.yandex.practicum.filmorate.dal.mappers.ActivityRowMapper; import ru.yandex.practicum.filmorate.model.Activity; import ru.yandex.practicum.filmorate.model.User; @@ -20,7 +20,7 @@ public class JdbcUserRepository implements UserRepository { private final NamedParameterJdbcOperations jdbc; private final RowMapper mapper; - private final ActivityrRowMapper activityrRowMapper; + private final ActivityRowMapper activityRowMapper; private static final String CREATE_USER_QUERY = "INSERT INTO users (login, email, name, birthday) VALUES(:login,:email,:name,:birthday)"; private static final String UPDATE_USER_QUERY = "UPDATE users SET login=:login, email=:email, name=:name, birthday=:birthday WHERE user_id=:user_id"; @@ -52,9 +52,9 @@ private static long instantOfSecond() { @Override public List getActivityById(long userId) { - MapSqlParameterSource params = new MapSqlParameterSource(); - params.addValue("userId", userId); - return jdbc.query(GET_ACTIVITY_BY_USER_ID, params, activityrRowMapper); + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", userId); + return jdbc.query(GET_ACTIVITY_BY_USER_ID, paramsActivity, activityRowMapper); } @Override @@ -112,10 +112,10 @@ public void addFriend(long userId, long friendId) { params.addValue("friend_id", friendId); jdbc.update(ADD_FRIEND_QUERY, params, keyHolder); - MapSqlParameterSource params2 = new MapSqlParameterSource(); - params2.addValue("userId", userId); - params2.addValue("entityId", friendId); - jdbc.update(ACTIVITY_FRIEND_ADD, params2); + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", userId); + paramsActivity.addValue("entityId", friendId); + jdbc.update(ACTIVITY_FRIEND_ADD, paramsActivity); } @Override @@ -126,10 +126,10 @@ public void deleteFriend(long userId, long friendId) { params.addValue("friend_id", friendId); jdbc.update(DELETE_FRIEND_QUERY, params, keyHolder); - MapSqlParameterSource params2 = new MapSqlParameterSource(); - params2.addValue("userId", userId); - params2.addValue("entityId", friendId); - jdbc.update(ACTIVITY_FRIEND_DELETE, params2); + MapSqlParameterSource paramsActivity = new MapSqlParameterSource(); + paramsActivity.addValue("userId", userId); + paramsActivity.addValue("entityId", friendId); + jdbc.update(ACTIVITY_FRIEND_DELETE, paramsActivity); } @Override diff --git a/src/main/java/ru/yandex/practicum/filmorate/dal/mappers/ActivityrRowMapper.java b/src/main/java/ru/yandex/practicum/filmorate/dal/mappers/ActivityRowMapper.java similarity index 92% rename from src/main/java/ru/yandex/practicum/filmorate/dal/mappers/ActivityrRowMapper.java rename to src/main/java/ru/yandex/practicum/filmorate/dal/mappers/ActivityRowMapper.java index 4a9f8d2..d32ad12 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/mappers/ActivityrRowMapper.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/mappers/ActivityRowMapper.java @@ -8,7 +8,7 @@ import java.sql.SQLException; @Component -public class ActivityrRowMapper implements RowMapper { +public class ActivityRowMapper implements RowMapper { @Override public Activity mapRow(ResultSet rs, int rowNum) throws SQLException { Activity activity = new Activity(); From 472830e232be5dd5abb1586408ddba50c7b1af67 Mon Sep 17 00:00:00 2001 From: Just Roma Date: Wed, 14 May 2025 17:10:16 +0500 Subject: [PATCH 4/4] edit constant search for Activity --- .../practicum/filmorate/Enum/EventType.java | 8 +++++ .../filmorate/Enum/OperationType.java | 7 +++++ .../filmorate/dal/JdbcFilmRepository.java | 14 ++++----- .../filmorate/dal/JdbcReviewRepository.java | 31 ++++++------------- .../filmorate/dal/JdbcUserRepository.java | 17 +++++----- 5 files changed, 40 insertions(+), 37 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/Enum/EventType.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/Enum/OperationType.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/Enum/EventType.java b/src/main/java/ru/yandex/practicum/filmorate/Enum/EventType.java new file mode 100644 index 0000000..86b32c0 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/Enum/EventType.java @@ -0,0 +1,8 @@ +package ru.yandex.practicum.filmorate.Enum; + +public enum EventType { + LIKE, + DISLIKE, + FRIEND, + REVIEW +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/Enum/OperationType.java b/src/main/java/ru/yandex/practicum/filmorate/Enum/OperationType.java new file mode 100644 index 0000000..3163dbc --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/Enum/OperationType.java @@ -0,0 +1,7 @@ +package ru.yandex.practicum.filmorate.Enum; + +public enum OperationType { + ADD, + UPDATE, + REMOVE +} 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 e0f29fb..add1ea3 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcFilmRepository.java @@ -6,6 +6,8 @@ import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.jdbc.support.rowset.SqlRowSet; import org.springframework.stereotype.Repository; +import ru.yandex.practicum.filmorate.Enum.EventType; +import ru.yandex.practicum.filmorate.Enum.OperationType; import ru.yandex.practicum.filmorate.dal.mappers.DirectorRowMapper; import ru.yandex.practicum.filmorate.dal.mappers.FilmRowMapper; import ru.yandex.practicum.filmorate.dal.mappers.GenreRowMapper; @@ -96,19 +98,15 @@ WHERE fd.film_id IN (:film_ids) """; private static final String ACTIVITY_GENERAL = - "INSERT INTO activity (userId, entityId, eventType, operation, timestamp)"; + "INSERT INTO activity (userId, entityId, eventType, operation, timestamp) VALUES(:userId, :entityId, '"; private static final String ACTIVITY_FILM_LIKE = ACTIVITY_GENERAL + - """ - VALUES(:userId, :entityId, 'LIKE', 'ADD', - """ + instantOfSecond() + ")"; + EventType.LIKE + "','" + OperationType.ADD + "', " + instantOfMilliSecond() + ")"; private static final String ACTIVITY_FILM_LIKE_DELETE = ACTIVITY_GENERAL + - """ - VALUES(:userId, :entityId, 'LIKE', 'REMOVE', - """ + instantOfSecond() + ")"; + EventType.LIKE + "','" + OperationType.REMOVE + "'," + instantOfMilliSecond() + ")"; - private static long instantOfSecond() { + private static long instantOfMilliSecond() { return Instant.now().toEpochMilli(); } 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 9f14d94..707cfe4 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcReviewRepository.java @@ -5,6 +5,8 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.stereotype.Repository; +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.model.Review; @@ -73,40 +75,27 @@ INSERT INTO reviews_likes (reviewId, userId, reaction_type) """; private static final String ACTIVITY_GENERAL = - "INSERT INTO activity (userId, entityId, eventType, operation, timestamp)"; + "INSERT INTO activity (userId, entityId, eventType, operation, timestamp) VALUES(:userId, :entityId, '"; private static final String ACTIVITY_REVIEW_CREATE = ACTIVITY_GENERAL + - """ - VALUES(:userId, :entityId, 'REVIEW', 'ADD', - """ + instantOfSecond() + ")"; + EventType.REVIEW + "','" + OperationType.ADD + "', " + instantOfMilliSecond() + ")"; private static final String ACTIVITY_REVIEW_UPDATE = ACTIVITY_GENERAL + - """ - VALUES(:userId, :entityId, 'REVIEW', 'UPDATE', - """ + instantOfSecond() + ")"; + EventType.REVIEW + "','" + OperationType.UPDATE + "', " + instantOfMilliSecond() + ")"; private static final String ACTIVITY_REVIEW_DELETE = ACTIVITY_GENERAL + - """ - VALUES(:userId, :entityId, 'REVIEW', 'REMOVE', - """ + instantOfSecond() + ")"; - + EventType.REVIEW + "','" + OperationType.REMOVE + "', " + instantOfMilliSecond() + ")"; private static final String ACTIVITY_REVIEW_ADD_LIKE = ACTIVITY_GENERAL + - """ - VALUES(:userId, :entityId, 'LIKE', 'ADD', - """ + instantOfSecond() + ")"; + EventType.LIKE + "','" + OperationType.ADD + "', " + instantOfMilliSecond() + ")"; private static final String ACTIVITY_REVIEW_ADD_DISLIKE = ACTIVITY_GENERAL + - """ - VALUES(:userId, :entityId, 'DISLIKE', 'ADD', - """ + instantOfSecond() + ")"; + EventType.DISLIKE + "','" + OperationType.ADD + "', " + instantOfMilliSecond() + ")"; private static final String ACTIVITY_REVIEW_DELETE_REACTION = ACTIVITY_GENERAL + - """ - VALUES(:userId, :entityId, 'LIKE', 'REMOVE', - """ + instantOfSecond() + ")"; + EventType.LIKE + "','" + OperationType.REMOVE + "', " + instantOfMilliSecond() + ")"; - private static long instantOfSecond() { + private static long instantOfMilliSecond() { return Instant.now().toEpochMilli(); } 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 fd01570..4b14936 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dal/JdbcUserRepository.java @@ -6,6 +6,8 @@ import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.stereotype.Repository; +import ru.yandex.practicum.filmorate.Enum.EventType; +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.User; @@ -35,18 +37,17 @@ public class JdbcUserRepository implements UserRepository { private static final String FIND_USERS_BY_IDS_QUERY = "SELECT * FROM users WHERE user_id IN (:ids)"; private static final String ACTIVITY_GENERAL = - "INSERT INTO activity (userId, entityId, eventType, operation, timestamp) "; + "INSERT INTO activity (userId, entityId, eventType, operation, timestamp) VALUES(:userId, :entityId, '"; + private static final String ACTIVITY_FRIEND_ADD = ACTIVITY_GENERAL + - """ - VALUES(:userId, :entityId, 'FRIEND', 'ADD', - """ + instantOfSecond() + ")"; + EventType.FRIEND + "','" + OperationType.ADD + "'," + instantOfMilliSecond() + ")"; + private static final String ACTIVITY_FRIEND_DELETE = ACTIVITY_GENERAL + - """ - VALUES(:userId, :entityId, 'FRIEND', 'REMOVE', - """ + instantOfSecond() + ")"; + EventType.FRIEND + "','" + OperationType.REMOVE + "', " + instantOfMilliSecond() + ")"; + private static final String GET_ACTIVITY_BY_USER_ID = "SELECT * FROM activity WHERE userId = :userId"; - private static long instantOfSecond() { + private static long instantOfMilliSecond() { return Instant.now().toEpochMilli(); }