From 30757ced1ee1ec286ec85549ba7642324ea43852 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 19:54:11 +0300 Subject: [PATCH 01/34] Add files via upload --- .../filmorate/controller/FeedController.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java new file mode 100644 index 0000000..b65b5c8 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java @@ -0,0 +1,23 @@ +package ru.yandex.practicum.filmorate.controller; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; +import ru.yandex.practicum.filmorate.model.Event; +import ru.yandex.practicum.filmorate.service.feed.FeedService; + +import java.util.List; + +@RestController +@RequestMapping("/users") +@Slf4j +@RequiredArgsConstructor +public class FeedController { + private final FeedService feedService; + + @GetMapping("/{id}/feed") + public List getUserFeed(@PathVariable long id) { + log.info("GET /users/{}/feed", id); + return feedService.getUserFeed(id); + } +} \ No newline at end of file From 9271c5452d858768b9e9d36b903fb39c3094db2d Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 19:55:20 +0300 Subject: [PATCH 02/34] Add files via upload --- .../yandex/practicum/filmorate/model/Event.java | 15 +++++++++++++++ .../practicum/filmorate/model/EventType.java | 5 +++++ .../practicum/filmorate/model/Operation.java | 5 +++++ 3 files changed, 25 insertions(+) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/model/Event.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/model/EventType.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/model/Operation.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Event.java b/src/main/java/ru/yandex/practicum/filmorate/model/Event.java new file mode 100644 index 0000000..86cdd7a --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Event.java @@ -0,0 +1,15 @@ +package ru.yandex.practicum.filmorate.model; + +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class Event { + private Long eventId; + private Long timestamp; + private Long userId; + private EventType eventType; + private Operation operation; + private Long entityId; +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/EventType.java b/src/main/java/ru/yandex/practicum/filmorate/model/EventType.java new file mode 100644 index 0000000..508d573 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/EventType.java @@ -0,0 +1,5 @@ +package ru.yandex.practicum.filmorate.model; + +public enum EventType { + LIKE, REVIEW, FRIEND +} diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Operation.java b/src/main/java/ru/yandex/practicum/filmorate/model/Operation.java new file mode 100644 index 0000000..74ef03b --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Operation.java @@ -0,0 +1,5 @@ +package ru.yandex.practicum.filmorate.model; + +public enum Operation { + REMOVE, ADD, UPDATE +} From f7a60c118ae0a1500b719f08daf9452d96791ba5 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 19:56:10 +0300 Subject: [PATCH 03/34] Add files via upload --- src/main/java/ru/yandex/practicum/filmorate/repository/feed | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/repository/feed diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/feed b/src/main/java/ru/yandex/practicum/filmorate/repository/feed new file mode 100644 index 0000000..e69de29 From cd008fc4820b373fbff2f9e4148e9e14be102a8c Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 19:56:37 +0300 Subject: [PATCH 04/34] Delete src/main/java/ru/yandex/practicum/filmorate/repository/feed --- src/main/java/ru/yandex/practicum/filmorate/repository/feed | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/repository/feed diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/feed b/src/main/java/ru/yandex/practicum/filmorate/repository/feed deleted file mode 100644 index e69de29..0000000 From 15ad4cbd071b6f171809a8e8722b620b63a7d04f Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:01:20 +0300 Subject: [PATCH 05/34] Add files via upload --- .../repository/feed/FeedRepository.java | 10 +++ .../repository/feed/JdbcFeedRepository.java | 63 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/repository/feed/FeedRepository.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/feed/FeedRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/feed/FeedRepository.java new file mode 100644 index 0000000..7645f79 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/feed/FeedRepository.java @@ -0,0 +1,10 @@ +package ru.yandex.practicum.filmorate.repository.feed; + +import ru.yandex.practicum.filmorate.model.Event; +import java.util.List; + +public interface FeedRepository { + List findByUserId(long userId); + + Event save(Event event); +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java new file mode 100644 index 0000000..616e03b --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java @@ -0,0 +1,63 @@ +package ru.yandex.practicum.filmorate.repository.feed; + +import lombok.RequiredArgsConstructor; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; +import org.springframework.jdbc.support.GeneratedKeyHolder; +import org.springframework.stereotype.Repository; +import ru.yandex.practicum.filmorate.model.Event; +import ru.yandex.practicum.filmorate.model.EventType; +import ru.yandex.practicum.filmorate.model.Operation; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +@Repository +@RequiredArgsConstructor +public class JdbcFeedRepository implements FeedRepository { + private final NamedParameterJdbcOperations jdbc; + + @Override + public List findByUserId(long userId) { + String sql = "SELECT * FROM feed_events WHERE user_id = :user_id ORDER BY timestamp ASC, event_id ASC"; + return jdbc.query(sql, + new MapSqlParameterSource("user_id", userId), + new EventRowMapper()); + } + + @Override + public Event save(Event event) { + GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); + MapSqlParameterSource params = new MapSqlParameterSource() + .addValue("timestamp", event.getTimestamp()) + .addValue("user_id", event.getUserId()) + .addValue("event_type", event.getEventType().toString()) + .addValue("operation", event.getOperation().toString()) + .addValue("entity_id", event.getEntityId()); + + String sql = """ + INSERT INTO feed_events (timestamp, user_id, event_type, operation, entity_id) + VALUES (:timestamp, :user_id, :event_type, :operation, :entity_id) + """; + + jdbc.update(sql, params, keyHolder, new String[]{"event_id"}); + event.setEventId(keyHolder.getKeyAs(Long.class)); + return event; + } + + private static class EventRowMapper implements RowMapper { + @Override + public Event mapRow(ResultSet rs, int rowNum) throws SQLException { + return Event.builder() + .eventId(rs.getLong("event_id")) + .timestamp(rs.getLong("timestamp")) + .userId(rs.getLong("user_id")) + .eventType(EventType.valueOf(rs.getString("event_type"))) + .operation(Operation.valueOf(rs.getString("operation"))) + .entityId(rs.getLong("entity_id")) + .build(); + } + } +} \ No newline at end of file From 42d5f70177f7a0f757dd9b5d7cf7c6a44bb73807 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:02:14 +0300 Subject: [PATCH 06/34] Add files via upload --- .../filmorate/service/feed/FeedService.java | 10 ++++++ .../service/feed/FeedServiceImpl.java | 36 +++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java create mode 100644 src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java new file mode 100644 index 0000000..d35eb91 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java @@ -0,0 +1,10 @@ +package ru.yandex.practicum.filmorate.service.feed; + +import ru.yandex.practicum.filmorate.model.Event; +import java.util.List; + +public interface FeedService { + List getUserFeed(long userId); + + void addEvent(Event event); +} \ No newline at end of file diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java new file mode 100644 index 0000000..daa6e33 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java @@ -0,0 +1,36 @@ +package ru.yandex.practicum.filmorate.service.feed; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; +import ru.yandex.practicum.filmorate.exception.NotFoundException; +import ru.yandex.practicum.filmorate.model.Event; +import ru.yandex.practicum.filmorate.repository.feed.FeedRepository; +import ru.yandex.practicum.filmorate.repository.user.UserRepository; + +import java.util.List; + +@Service +@Slf4j +@RequiredArgsConstructor +public class FeedServiceImpl implements FeedService { + private final FeedRepository feedRepository; + private final UserRepository userRepository; + + @Override + public List getUserFeed(long userId) { + userRepository.findById(userId) + .orElseThrow(NotFoundException.supplier("User with id %d not found", userId)); + + List events = feedRepository.findByUserId(userId); + log.info("Retrieved {} events for user {}", events.size(), userId); + return events; + } + + @Override + public void addEvent(Event event) { + feedRepository.save(event); + log.debug("Event saved: type={}, operation={}, userId={}, entityId={}", + event.getEventType(), event.getOperation(), event.getUserId(), event.getEntityId()); + } +} \ No newline at end of file From 22147fd92d1d9516dec5daa91c95a0b7fc44c48e Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:02:47 +0300 Subject: [PATCH 07/34] Update UserServiceImpl.java --- .../service/user/UserServiceImpl.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java index ac7ae26..1d01c6b 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java @@ -8,9 +8,13 @@ import ru.yandex.practicum.filmorate.dto.user.UserDto; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.mapper.UserMapper; +import ru.yandex.practicum.filmorate.model.Event; +import ru.yandex.practicum.filmorate.model.EventType; +import ru.yandex.practicum.filmorate.model.Operation; import ru.yandex.practicum.filmorate.model.User; import ru.yandex.practicum.filmorate.repository.friendship.FriendshipsRepository; import ru.yandex.practicum.filmorate.repository.user.UserRepository; +import ru.yandex.practicum.filmorate.service.feed.FeedService; import java.util.Collection; @@ -20,6 +24,7 @@ public class UserServiceImpl implements UserService { private final UserRepository userRepository; private final FriendshipsRepository friendshipsRepository; + private final FeedService feedService; @Override public Collection findAll() { @@ -68,8 +73,15 @@ public void deleteById(long id) { public void addFriend(long userId, long friendId) { throwIfUserNotFound(userId); throwIfUserNotFound(friendId); - friendshipsRepository.addFriendship(userId, friendId); + Event event = Event.builder() + .timestamp(System.currentTimeMillis()) + .userId(userId) + .eventType(EventType.FRIEND) + .operation(Operation.ADD) + .entityId(friendId) + .build(); + feedService.addEvent(event); log.info("User with id {} added user with id {} as friend", userId, friendId); } @@ -78,6 +90,14 @@ public void removeFriend(long userId, long friendId) { throwIfUserNotFound(userId); throwIfUserNotFound(friendId); friendshipsRepository.removeFriendship(userId, friendId); + Event event = Event.builder() + .timestamp(System.currentTimeMillis()) + .userId(userId) + .eventType(EventType.FRIEND) + .operation(Operation.REMOVE) + .entityId(friendId) + .build(); + feedService.addEvent(event); log.info("User with id {} removed user with id {} from friends", userId, friendId); } From 89a60d063a1597606277843a3f0dc394987042cc Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:03:07 +0300 Subject: [PATCH 08/34] Update ReviewServiceImpl.java --- .../service/review/ReviewServiceImpl.java | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java index ba5c5a6..6cf9fc8 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java @@ -3,13 +3,19 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; -import ru.yandex.practicum.filmorate.dto.review.*; +import ru.yandex.practicum.filmorate.dto.review.NewReviewRequest; +import ru.yandex.practicum.filmorate.dto.review.ReviewDto; +import ru.yandex.practicum.filmorate.dto.review.UpdateReviewRequest; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.mapper.ReviewMapper; +import ru.yandex.practicum.filmorate.model.Event; +import ru.yandex.practicum.filmorate.model.EventType; +import ru.yandex.practicum.filmorate.model.Operation; import ru.yandex.practicum.filmorate.model.Review; import ru.yandex.practicum.filmorate.repository.film.FilmRepository; import ru.yandex.practicum.filmorate.repository.review.ReviewRepository; import ru.yandex.practicum.filmorate.repository.user.UserRepository; +import ru.yandex.practicum.filmorate.service.feed.FeedService; import java.util.Collection; @@ -20,6 +26,7 @@ public class ReviewServiceImpl implements ReviewService { private final ReviewRepository reviewRepository; private final UserRepository userRepository; private final FilmRepository filmRepository; + private final FeedService feedService; @Override public ReviewDto create(NewReviewRequest request) { @@ -27,6 +34,15 @@ public ReviewDto create(NewReviewRequest request) { throwIfFilmNotFound(request.getFilmId()); Review review = ReviewMapper.toReview(request); review = reviewRepository.save(review); + Event event = Event.builder() + .timestamp(System.currentTimeMillis()) + .userId(request.getUserId()) + .eventType(EventType.REVIEW) + .operation(Operation.ADD) + .entityId(review.getId()) + .build(); + feedService.addEvent(event); + log.info("Review with reviewId {} has been created", review.getId()); return ReviewMapper.toDto(review); } @@ -35,6 +51,14 @@ public ReviewDto create(NewReviewRequest request) { public ReviewDto update(UpdateReviewRequest request) { Review review = getReviewOrThrow(request.getReviewId()); review = ReviewMapper.updateReviewFields(review, request); + Event event = Event.builder() + .timestamp(System.currentTimeMillis()) + .userId(review.getUserId()) + .eventType(EventType.REVIEW) + .operation(Operation.UPDATE) + .entityId(review.getId()) + .build(); + feedService.addEvent(event); log.info("Review with reviewId {} has been updated", review.getId()); reviewRepository.update(review); return ReviewMapper.toDto(review); @@ -42,7 +66,15 @@ public ReviewDto update(UpdateReviewRequest request) { @Override public void delete(long id) { - getReviewOrThrow(id); + Review review = getReviewOrThrow(id); + Event event = Event.builder() + .timestamp(System.currentTimeMillis()) + .userId(review.getUserId()) + .eventType(EventType.REVIEW) + .operation(Operation.REMOVE) + .entityId(id) + .build(); + feedService.addEvent(event); log.info("Review with reviewId {} has been deleted", id); reviewRepository.delete(id); } From ff37a8402c47aeb8a31716a5c97b9449d6952a2f Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:03:28 +0300 Subject: [PATCH 09/34] Update FilmServiceImpl.java --- .../service/film/FilmServiceImpl.java | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java index c4397da..4011b50 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java @@ -14,14 +14,18 @@ import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.mapper.FilmMapper; import ru.yandex.practicum.filmorate.model.Director; +import ru.yandex.practicum.filmorate.model.Event; +import ru.yandex.practicum.filmorate.model.EventType; import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.model.Genre; +import ru.yandex.practicum.filmorate.model.Operation; import ru.yandex.practicum.filmorate.repository.director.DirectorRepository; import ru.yandex.practicum.filmorate.repository.film.FilmRepository; import ru.yandex.practicum.filmorate.repository.genre.GenreRepository; import ru.yandex.practicum.filmorate.repository.like.LikesRepository; import ru.yandex.practicum.filmorate.repository.mparating.MPARatingRepository; import ru.yandex.practicum.filmorate.repository.user.UserRepository; +import ru.yandex.practicum.filmorate.service.feed.FeedService; import java.util.Collection; import java.util.List; @@ -37,6 +41,7 @@ public class FilmServiceImpl implements FilmService { GenreRepository genreRepository; MPARatingRepository mpaRepository; DirectorRepository directorRepository; + FeedService feedService; @Override public Collection findAll() { @@ -137,6 +142,17 @@ public void addLike(long filmId, long userId) { throwIfFilmNotFound(filmId); throwIfUserNotFound(userId); likesRepository.addLike(userId, filmId); + + // Добавляем событие в ленту + Event event = Event.builder() + .timestamp(System.currentTimeMillis()) + .userId(userId) + .eventType(EventType.LIKE) + .operation(Operation.ADD) + .entityId(filmId) + .build(); + feedService.addEvent(event); + log.info("Like to film with id {} has been added by user {}", filmId, userId); } @@ -145,6 +161,17 @@ public void removeLike(long filmId, long userId) { throwIfFilmNotFound(filmId); throwIfUserNotFound(userId); likesRepository.removeLike(userId, filmId); + + // Добавляем событие в ленту + Event event = Event.builder() + .timestamp(System.currentTimeMillis()) + .userId(userId) + .eventType(EventType.LIKE) + .operation(Operation.REMOVE) + .entityId(filmId) + .build(); + feedService.addEvent(event); + log.info("Like to film with id {} has been removed by user {}", filmId, userId); } From 2035b367226ae804c9d90ed6ecb08003d9a5d157 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:08:00 +0300 Subject: [PATCH 10/34] Update schema.sql --- src/main/resources/schema.sql | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql index 0b7b1a0..40ecaab 100644 --- a/src/main/resources/schema.sql +++ b/src/main/resources/schema.sql @@ -101,4 +101,14 @@ CREATE TABLE IF NOT EXISTS review_likes PRIMARY KEY (review_id, user_id), FOREIGN KEY (review_id) REFERENCES reviews (review_id) ON DELETE CASCADE, FOREIGN KEY (user_id) REFERENCES users (user_id) ON DELETE CASCADE -); \ No newline at end of file +); + +CREATE TABLE IF NOT EXISTS feed_events ( + event_id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, + timestamp BIGINT NOT NULL, + user_id BIGINT NOT NULL, + event_type ENUM('LIKE', 'REVIEW', 'FRIEND') NOT NULL, + operation ENUM('REMOVE', 'ADD', 'UPDATE') NOT NULL, + entity_id BIGINT NOT NULL, + FOREIGN KEY (user_id) REFERENCES users (user_id) ON DELETE CASCADE +); From 9f8957b14281c0f30d635cb7e8a869bbf4670adc Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:33:13 +0300 Subject: [PATCH 11/34] Update Event.java --- .../yandex/practicum/filmorate/model/Event.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/model/Event.java b/src/main/java/ru/yandex/practicum/filmorate/model/Event.java index 86cdd7a..29dad68 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/model/Event.java +++ b/src/main/java/ru/yandex/practicum/filmorate/model/Event.java @@ -1,15 +1,18 @@ package ru.yandex.practicum.filmorate.model; +import lombok.AccessLevel; import lombok.Builder; import lombok.Data; +import lombok.experimental.FieldDefaults; @Data @Builder +@FieldDefaults(level = AccessLevel.PRIVATE) public class Event { - private Long eventId; - private Long timestamp; - private Long userId; - private EventType eventType; - private Operation operation; - private Long entityId; -} \ No newline at end of file + Long eventId; + Long timestamp; + Long userId; + EventType eventType; + Operation operation; + Long entityId; +} From 0095ef06042457906e8187a48b67061ddca924c8 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:34:26 +0300 Subject: [PATCH 12/34] Add files via upload --- .../filmorate/mapper/EventRowMapper.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/mapper/EventRowMapper.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/mapper/EventRowMapper.java b/src/main/java/ru/yandex/practicum/filmorate/mapper/EventRowMapper.java new file mode 100644 index 0000000..de91215 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/mapper/EventRowMapper.java @@ -0,0 +1,25 @@ +package ru.yandex.practicum.filmorate.repository.feed; + +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.filmorate.model.Event; +import ru.yandex.practicum.filmorate.model.EventType; +import ru.yandex.practicum.filmorate.model.Operation; + +import java.sql.ResultSet; +import java.sql.SQLException; + +@Component +public class EventRowMapper implements RowMapper { + @Override + public Event mapRow(ResultSet rs, int rowNum) throws SQLException { + return Event.builder() + .eventId(rs.getLong("event_id")) + .timestamp(rs.getLong("timestamp")) + .userId(rs.getLong("user_id")) + .eventType(EventType.valueOf(rs.getString("event_type"))) + .operation(Operation.valueOf(rs.getString("operation"))) + .entityId(rs.getLong("entity_id")) + .build(); + } +} \ No newline at end of file From dcff02f77dfff5745e4d813db1f013f43fe74af9 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:36:39 +0300 Subject: [PATCH 13/34] Add files via upload --- .../filmorate/mapper/EventMapper.java | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java b/src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java new file mode 100644 index 0000000..aaf663c --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java @@ -0,0 +1,20 @@ +package ru.yandex.practicum.filmorate.mapper; + +import org.springframework.stereotype.Component; +import ru.yandex.practicum.filmorate.dto.event.EventDto; +import ru.yandex.practicum.filmorate.model.Event; + +@Component +public class EventMapper { + + public static EventDto toEventDto(Event event) { + return EventDto.builder() + .timestamp(event.getTimestamp()) + .userId(event.getUserId()) + .eventType(event.getEventType()) + .operation(event.getOperation()) + .eventId(event.getEventId()) + .entityId(event.getEntityId()) + .build(); + } +} \ No newline at end of file From ec8bd2591506ba07d2efa957d8417d07f0abf27f Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:37:43 +0300 Subject: [PATCH 14/34] Add files via upload --- .../practicum/filmorate/dto/event/EventDto.java | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/dto/event/EventDto.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/dto/event/EventDto.java b/src/main/java/ru/yandex/practicum/filmorate/dto/event/EventDto.java new file mode 100644 index 0000000..b507f92 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/dto/event/EventDto.java @@ -0,0 +1,17 @@ +package ru.yandex.practicum.filmorate.mapper.event; + +import lombok.Builder; +import lombok.Data; +import ru.yandex.practicum.filmorate.model.EventType; +import ru.yandex.practicum.filmorate.model.Operation; + +@Data +@Builder +public class EventDto { + private Long timestamp; + private Long userId; + private EventType eventType; + private Operation operation; + private Long eventId; + private Long entityId; +} \ No newline at end of file From c6676802e9d2df6c10129d85bc584945f36188dd Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:38:49 +0300 Subject: [PATCH 15/34] Update FeedService.java --- .../filmorate/service/feed/FeedService.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java index d35eb91..b616225 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java @@ -1,10 +1,13 @@ package ru.yandex.practicum.filmorate.service.feed; -import ru.yandex.practicum.filmorate.model.Event; +import ru.yandex.practicum.filmorate.dto.event.EventDto; +import ru.yandex.practicum.filmorate.model.EventType; +import ru.yandex.practicum.filmorate.model.Operation; + import java.util.List; public interface FeedService { - List getUserFeed(long userId); - - void addEvent(Event event); -} \ No newline at end of file + List getUserFeed(long userId); + + void addEvent(EventType eventType, Operation operation, long userId, long entityId); +} From 1ee81dd6d33a4980b8e875c13a1e44580c247c02 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:39:09 +0300 Subject: [PATCH 16/34] Update FeedServiceImpl.java --- .../service/feed/FeedServiceImpl.java | 27 ++++++++++++++----- 1 file changed, 21 insertions(+), 6 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java index daa6e33..4593bb0 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java @@ -3,8 +3,12 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import ru.yandex.practicum.filmorate.dto.event.EventDto; import ru.yandex.practicum.filmorate.exception.NotFoundException; +import ru.yandex.practicum.filmorate.mapper.EventMapper; import ru.yandex.practicum.filmorate.model.Event; +import ru.yandex.practicum.filmorate.model.EventType; +import ru.yandex.practicum.filmorate.model.Operation; import ru.yandex.practicum.filmorate.repository.feed.FeedRepository; import ru.yandex.practicum.filmorate.repository.user.UserRepository; @@ -18,19 +22,30 @@ public class FeedServiceImpl implements FeedService { private final UserRepository userRepository; @Override - public List getUserFeed(long userId) { + public List getUserFeed(long userId) { userRepository.findById(userId) .orElseThrow(NotFoundException.supplier("User with id %d not found", userId)); List events = feedRepository.findByUserId(userId); log.info("Retrieved {} events for user {}", events.size(), userId); - return events; + + return events.stream() + .map(EventMapper::toEventDto) + .toList(); } @Override - public void addEvent(Event event) { + public void addEvent(EventType eventType, Operation operation, long userId, long entityId) { + Event event = Event.builder() + .timestamp(System.currentTimeMillis()) + .userId(userId) + .eventType(eventType) + .operation(operation) + .entityId(entityId) + .build(); + feedRepository.save(event); - log.debug("Event saved: type={}, operation={}, userId={}, entityId={}", - event.getEventType(), event.getOperation(), event.getUserId(), event.getEntityId()); + log.debug("Event saved: type={}, operation={}, userId={}, entityId={}", + eventType, operation, userId, entityId); } -} \ No newline at end of file +} From 4e3da990a3ba5266e6ac3c470c4d007f20910fd2 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:39:33 +0300 Subject: [PATCH 17/34] Update FeedController.java --- .../practicum/filmorate/controller/FeedController.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java index b65b5c8..1dc479f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; -import ru.yandex.practicum.filmorate.model.Event; +import ru.yandex.practicum.filmorate.dto.event.EventDto; import ru.yandex.practicum.filmorate.service.feed.FeedService; import java.util.List; @@ -14,10 +14,10 @@ @RequiredArgsConstructor public class FeedController { private final FeedService feedService; - + @GetMapping("/{id}/feed") - public List getUserFeed(@PathVariable long id) { + public List getUserFeed(@PathVariable long id) { log.info("GET /users/{}/feed", id); return feedService.getUserFeed(id); } -} \ No newline at end of file +} From cf4b20f6aefcf45b138a3297cf3bfd077d6eae53 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:40:42 +0300 Subject: [PATCH 18/34] Update UserServiceImpl.java --- .../service/user/UserServiceImpl.java | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java index 1d01c6b..12824ca 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java @@ -74,14 +74,7 @@ public void addFriend(long userId, long friendId) { throwIfUserNotFound(userId); throwIfUserNotFound(friendId); friendshipsRepository.addFriendship(userId, friendId); - Event event = Event.builder() - .timestamp(System.currentTimeMillis()) - .userId(userId) - .eventType(EventType.FRIEND) - .operation(Operation.ADD) - .entityId(friendId) - .build(); - feedService.addEvent(event); + feedService.addEvent(EventType.FRIEND, Operation.ADD, userId, friendId); log.info("User with id {} added user with id {} as friend", userId, friendId); } @@ -90,14 +83,7 @@ public void removeFriend(long userId, long friendId) { throwIfUserNotFound(userId); throwIfUserNotFound(friendId); friendshipsRepository.removeFriendship(userId, friendId); - Event event = Event.builder() - .timestamp(System.currentTimeMillis()) - .userId(userId) - .eventType(EventType.FRIEND) - .operation(Operation.REMOVE) - .entityId(friendId) - .build(); - feedService.addEvent(event); + feedService.addEvent(EventType.FRIEND, Operation.REMOVE, userId, friendId); log.info("User with id {} removed user with id {} from friends", userId, friendId); } From e92266c4f4ce58ecdd719ed579da1a5e99d35d2e Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:41:35 +0300 Subject: [PATCH 19/34] Update FilmServiceImpl.java --- .../service/film/FilmServiceImpl.java | 24 ++----------------- 1 file changed, 2 insertions(+), 22 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java index 4011b50..9315850 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java @@ -142,17 +142,7 @@ public void addLike(long filmId, long userId) { throwIfFilmNotFound(filmId); throwIfUserNotFound(userId); likesRepository.addLike(userId, filmId); - - // Добавляем событие в ленту - Event event = Event.builder() - .timestamp(System.currentTimeMillis()) - .userId(userId) - .eventType(EventType.LIKE) - .operation(Operation.ADD) - .entityId(filmId) - .build(); - feedService.addEvent(event); - + feedService.addEvent(EventType.LIKE, Operation.ADD, userId, filmId); log.info("Like to film with id {} has been added by user {}", filmId, userId); } @@ -161,17 +151,7 @@ public void removeLike(long filmId, long userId) { throwIfFilmNotFound(filmId); throwIfUserNotFound(userId); likesRepository.removeLike(userId, filmId); - - // Добавляем событие в ленту - Event event = Event.builder() - .timestamp(System.currentTimeMillis()) - .userId(userId) - .eventType(EventType.LIKE) - .operation(Operation.REMOVE) - .entityId(filmId) - .build(); - feedService.addEvent(event); - + feedService.addEvent(EventType.LIKE, Operation.REMOVE, userId, filmId); log.info("Like to film with id {} has been removed by user {}", filmId, userId); } From 074777c286a052a1adff1b71492549dbdcb7d1f4 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:42:48 +0300 Subject: [PATCH 20/34] Update ReviewServiceImpl.java --- .../service/review/ReviewServiceImpl.java | 28 ++----------------- 1 file changed, 3 insertions(+), 25 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java index 6cf9fc8..e9463ef 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java @@ -34,15 +34,7 @@ public ReviewDto create(NewReviewRequest request) { throwIfFilmNotFound(request.getFilmId()); Review review = ReviewMapper.toReview(request); review = reviewRepository.save(review); - Event event = Event.builder() - .timestamp(System.currentTimeMillis()) - .userId(request.getUserId()) - .eventType(EventType.REVIEW) - .operation(Operation.ADD) - .entityId(review.getId()) - .build(); - feedService.addEvent(event); - + feedService.addEvent(EventType.REVIEW, Operation.ADD, request.getUserId(), review.getId()); log.info("Review with reviewId {} has been created", review.getId()); return ReviewMapper.toDto(review); } @@ -51,14 +43,7 @@ public ReviewDto create(NewReviewRequest request) { public ReviewDto update(UpdateReviewRequest request) { Review review = getReviewOrThrow(request.getReviewId()); review = ReviewMapper.updateReviewFields(review, request); - Event event = Event.builder() - .timestamp(System.currentTimeMillis()) - .userId(review.getUserId()) - .eventType(EventType.REVIEW) - .operation(Operation.UPDATE) - .entityId(review.getId()) - .build(); - feedService.addEvent(event); + feedService.addEvent(EventType.REVIEW, Operation.UPDATE, review.getUserId(), review.getId()); log.info("Review with reviewId {} has been updated", review.getId()); reviewRepository.update(review); return ReviewMapper.toDto(review); @@ -67,14 +52,7 @@ public ReviewDto update(UpdateReviewRequest request) { @Override public void delete(long id) { Review review = getReviewOrThrow(id); - Event event = Event.builder() - .timestamp(System.currentTimeMillis()) - .userId(review.getUserId()) - .eventType(EventType.REVIEW) - .operation(Operation.REMOVE) - .entityId(id) - .build(); - feedService.addEvent(event); + feedService.addEvent(EventType.REVIEW, Operation.REMOVE, review.getUserId(), id); log.info("Review with reviewId {} has been deleted", id); reviewRepository.delete(id); } From 7cebfebdc4ceff2cefa32eecd6ec8ffbafbe6cce Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:43:20 +0300 Subject: [PATCH 21/34] Update JdbcFeedRepository.java --- .../repository/feed/JdbcFeedRepository.java | 44 ++++++------------- 1 file changed, 13 insertions(+), 31 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java index 616e03b..63386e2 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java @@ -1,63 +1,45 @@ package ru.yandex.practicum.filmorate.repository.feed; import lombok.RequiredArgsConstructor; -import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcOperations; import org.springframework.jdbc.support.GeneratedKeyHolder; import org.springframework.stereotype.Repository; import ru.yandex.practicum.filmorate.model.Event; -import ru.yandex.practicum.filmorate.model.EventType; -import ru.yandex.practicum.filmorate.model.Operation; -import java.sql.ResultSet; -import java.sql.SQLException; import java.util.List; @Repository @RequiredArgsConstructor public class JdbcFeedRepository implements FeedRepository { private final NamedParameterJdbcOperations jdbc; + private final EventRowMapper eventRowMapper; @Override public List findByUserId(long userId) { - String sql = "SELECT * FROM feed_events WHERE user_id = :user_id ORDER BY timestamp ASC, event_id ASC"; - return jdbc.query(sql, - new MapSqlParameterSource("user_id", userId), - new EventRowMapper()); + String sql = "SELECT * FROM feed_events WHERE user_id = :user_id ORDER BY timestamp ASC"; + return jdbc.query(sql, + new MapSqlParameterSource("user_id", userId), + eventRowMapper); } @Override public Event save(Event event) { GeneratedKeyHolder keyHolder = new GeneratedKeyHolder(); MapSqlParameterSource params = new MapSqlParameterSource() - .addValue("timestamp", event.getTimestamp()) - .addValue("user_id", event.getUserId()) - .addValue("event_type", event.getEventType().toString()) - .addValue("operation", event.getOperation().toString()) - .addValue("entity_id", event.getEntityId()); - + .addValue("timestamp", event.getTimestamp()) + .addValue("user_id", event.getUserId()) + .addValue("event_type", event.getEventType().toString()) + .addValue("operation", event.getOperation().toString()) + .addValue("entity_id", event.getEntityId()); + String sql = """ INSERT INTO feed_events (timestamp, user_id, event_type, operation, entity_id) VALUES (:timestamp, :user_id, :event_type, :operation, :entity_id) """; - + jdbc.update(sql, params, keyHolder, new String[]{"event_id"}); event.setEventId(keyHolder.getKeyAs(Long.class)); return event; } - - private static class EventRowMapper implements RowMapper { - @Override - public Event mapRow(ResultSet rs, int rowNum) throws SQLException { - return Event.builder() - .eventId(rs.getLong("event_id")) - .timestamp(rs.getLong("timestamp")) - .userId(rs.getLong("user_id")) - .eventType(EventType.valueOf(rs.getString("event_type"))) - .operation(Operation.valueOf(rs.getString("operation"))) - .entityId(rs.getLong("entity_id")) - .build(); - } - } -} \ No newline at end of file +} From 37c6fb24c170e0542ce24157573057f5bd4b9ff4 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:44:33 +0300 Subject: [PATCH 22/34] Delete src/main/java/ru/yandex/practicum/filmorate/mapper/EventRowMapper.java --- .../filmorate/mapper/EventRowMapper.java | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 src/main/java/ru/yandex/practicum/filmorate/mapper/EventRowMapper.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/mapper/EventRowMapper.java b/src/main/java/ru/yandex/practicum/filmorate/mapper/EventRowMapper.java deleted file mode 100644 index de91215..0000000 --- a/src/main/java/ru/yandex/practicum/filmorate/mapper/EventRowMapper.java +++ /dev/null @@ -1,25 +0,0 @@ -package ru.yandex.practicum.filmorate.repository.feed; - -import org.springframework.jdbc.core.RowMapper; -import org.springframework.stereotype.Component; -import ru.yandex.practicum.filmorate.model.Event; -import ru.yandex.practicum.filmorate.model.EventType; -import ru.yandex.practicum.filmorate.model.Operation; - -import java.sql.ResultSet; -import java.sql.SQLException; - -@Component -public class EventRowMapper implements RowMapper { - @Override - public Event mapRow(ResultSet rs, int rowNum) throws SQLException { - return Event.builder() - .eventId(rs.getLong("event_id")) - .timestamp(rs.getLong("timestamp")) - .userId(rs.getLong("user_id")) - .eventType(EventType.valueOf(rs.getString("event_type"))) - .operation(Operation.valueOf(rs.getString("operation"))) - .entityId(rs.getLong("entity_id")) - .build(); - } -} \ No newline at end of file From d7d22cbc84bef5111a395e974b6cb5f03589e3c3 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:45:05 +0300 Subject: [PATCH 23/34] Add files via upload --- .../repository/feed/EventRowMapper.java | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 src/main/java/ru/yandex/practicum/filmorate/repository/feed/EventRowMapper.java diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/feed/EventRowMapper.java b/src/main/java/ru/yandex/practicum/filmorate/repository/feed/EventRowMapper.java new file mode 100644 index 0000000..de91215 --- /dev/null +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/feed/EventRowMapper.java @@ -0,0 +1,25 @@ +package ru.yandex.practicum.filmorate.repository.feed; + +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Component; +import ru.yandex.practicum.filmorate.model.Event; +import ru.yandex.practicum.filmorate.model.EventType; +import ru.yandex.practicum.filmorate.model.Operation; + +import java.sql.ResultSet; +import java.sql.SQLException; + +@Component +public class EventRowMapper implements RowMapper { + @Override + public Event mapRow(ResultSet rs, int rowNum) throws SQLException { + return Event.builder() + .eventId(rs.getLong("event_id")) + .timestamp(rs.getLong("timestamp")) + .userId(rs.getLong("user_id")) + .eventType(EventType.valueOf(rs.getString("event_type"))) + .operation(Operation.valueOf(rs.getString("operation"))) + .entityId(rs.getLong("entity_id")) + .build(); + } +} \ No newline at end of file From aafea6f9296fff0b38ab6ea84d46dcfdf9d377d7 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:45:59 +0300 Subject: [PATCH 24/34] Update FeedController.java --- .../ru/yandex/practicum/filmorate/controller/FeedController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java index 1dc479f..a42371b 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java @@ -14,7 +14,6 @@ @RequiredArgsConstructor public class FeedController { private final FeedService feedService; - @GetMapping("/{id}/feed") public List getUserFeed(@PathVariable long id) { log.info("GET /users/{}/feed", id); From 5d7a589ed89d0a3ef42220ed644ee5922fc977af Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:46:49 +0300 Subject: [PATCH 25/34] Update FeedController.java --- .../ru/yandex/practicum/filmorate/controller/FeedController.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java b/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java index a42371b..b5fad4b 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java +++ b/src/main/java/ru/yandex/practicum/filmorate/controller/FeedController.java @@ -14,6 +14,7 @@ @RequiredArgsConstructor public class FeedController { private final FeedService feedService; + @GetMapping("/{id}/feed") public List getUserFeed(@PathVariable long id) { log.info("GET /users/{}/feed", id); From 78ecfca77eb12201d6339ab9120825b153c25948 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:48:08 +0300 Subject: [PATCH 26/34] Update JdbcFeedRepository.java --- .../filmorate/repository/feed/JdbcFeedRepository.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java b/src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java index 63386e2..c2b17c2 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java +++ b/src/main/java/ru/yandex/practicum/filmorate/repository/feed/JdbcFeedRepository.java @@ -18,8 +18,8 @@ public class JdbcFeedRepository implements FeedRepository { @Override public List findByUserId(long userId) { String sql = "SELECT * FROM feed_events WHERE user_id = :user_id ORDER BY timestamp ASC"; - return jdbc.query(sql, - new MapSqlParameterSource("user_id", userId), + return jdbc.query(sql, + new MapSqlParameterSource("user_id", userId), eventRowMapper); } @@ -32,12 +32,10 @@ public Event save(Event event) { .addValue("event_type", event.getEventType().toString()) .addValue("operation", event.getOperation().toString()) .addValue("entity_id", event.getEntityId()); - String sql = """ INSERT INTO feed_events (timestamp, user_id, event_type, operation, entity_id) VALUES (:timestamp, :user_id, :event_type, :operation, :entity_id) """; - jdbc.update(sql, params, keyHolder, new String[]{"event_id"}); event.setEventId(keyHolder.getKeyAs(Long.class)); return event; From b980a1cc6af10b40b4c56ab5123d1c40e5d8456b Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:49:34 +0300 Subject: [PATCH 27/34] Update FeedService.java --- .../ru/yandex/practicum/filmorate/service/feed/FeedService.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java index b616225..d9f9df3 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedService.java @@ -8,6 +8,6 @@ public interface FeedService { List getUserFeed(long userId); - + void addEvent(EventType eventType, Operation operation, long userId, long entityId); } From a6d82669676ab98aa4b044aad7e3315d849165f3 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:51:49 +0300 Subject: [PATCH 28/34] Update FeedServiceImpl.java --- .../practicum/filmorate/service/feed/FeedServiceImpl.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java index 4593bb0..f941602 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/feed/FeedServiceImpl.java @@ -28,7 +28,6 @@ public List getUserFeed(long userId) { List events = feedRepository.findByUserId(userId); log.info("Retrieved {} events for user {}", events.size(), userId); - return events.stream() .map(EventMapper::toEventDto) .toList(); @@ -43,9 +42,8 @@ public void addEvent(EventType eventType, Operation operation, long userId, long .operation(operation) .entityId(entityId) .build(); - feedRepository.save(event); - log.debug("Event saved: type={}, operation={}, userId={}, entityId={}", + log.debug("Event saved: type={}, operation={}, userId={}, entityId={}", eventType, operation, userId, entityId); } } From b97b7773bc12920b828d4b29c4a3fcf7e42cc702 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:53:20 +0300 Subject: [PATCH 29/34] Update FilmServiceImpl.java --- .../yandex/practicum/filmorate/service/film/FilmServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java index 9315850..c21a947 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/film/FilmServiceImpl.java @@ -14,7 +14,6 @@ import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.mapper.FilmMapper; import ru.yandex.practicum.filmorate.model.Director; -import ru.yandex.practicum.filmorate.model.Event; import ru.yandex.practicum.filmorate.model.EventType; import ru.yandex.practicum.filmorate.model.Film; import ru.yandex.practicum.filmorate.model.Genre; From 07643131f23551a1828d2766e056bfc1465ba5e6 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:54:43 +0300 Subject: [PATCH 30/34] Update UserServiceImpl.java --- .../yandex/practicum/filmorate/service/user/UserServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java index 12824ca..f199adf 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/user/UserServiceImpl.java @@ -8,7 +8,6 @@ import ru.yandex.practicum.filmorate.dto.user.UserDto; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.mapper.UserMapper; -import ru.yandex.practicum.filmorate.model.Event; import ru.yandex.practicum.filmorate.model.EventType; import ru.yandex.practicum.filmorate.model.Operation; import ru.yandex.practicum.filmorate.model.User; From 45183d258bab0dda0c53e48fb1029d54cce38d9d Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:55:12 +0300 Subject: [PATCH 31/34] Update ReviewServiceImpl.java --- .../practicum/filmorate/service/review/ReviewServiceImpl.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java b/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java index e9463ef..d6e29b1 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java +++ b/src/main/java/ru/yandex/practicum/filmorate/service/review/ReviewServiceImpl.java @@ -8,7 +8,6 @@ import ru.yandex.practicum.filmorate.dto.review.UpdateReviewRequest; import ru.yandex.practicum.filmorate.exception.NotFoundException; import ru.yandex.practicum.filmorate.mapper.ReviewMapper; -import ru.yandex.practicum.filmorate.model.Event; import ru.yandex.practicum.filmorate.model.EventType; import ru.yandex.practicum.filmorate.model.Operation; import ru.yandex.practicum.filmorate.model.Review; From 7915367e059131fcd1501f3a73c0557cbf15ef38 Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 20:59:47 +0300 Subject: [PATCH 32/34] Update EventDto.java --- .../ru/yandex/practicum/filmorate/dto/event/EventDto.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/dto/event/EventDto.java b/src/main/java/ru/yandex/practicum/filmorate/dto/event/EventDto.java index b507f92..bcd9a40 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/dto/event/EventDto.java +++ b/src/main/java/ru/yandex/practicum/filmorate/dto/event/EventDto.java @@ -1,4 +1,4 @@ -package ru.yandex.practicum.filmorate.mapper.event; +package ru.yandex.practicum.filmorate.dto.event; import lombok.Builder; import lombok.Data; @@ -14,4 +14,5 @@ public class EventDto { private Operation operation; private Long eventId; private Long entityId; -} \ No newline at end of file + +} From 8862cf64e001c03ea2302f0802fc8cac6f6264ac Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 21:22:00 +0300 Subject: [PATCH 33/34] Update EventMapper.java --- .../yandex/practicum/filmorate/mapper/EventMapper.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java b/src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java index aaf663c..a1bafd4 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java +++ b/src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java @@ -1,13 +1,13 @@ package ru.yandex.practicum.filmorate.mapper; -import org.springframework.stereotype.Component; +import lombok.experimental.UtilityClass; import ru.yandex.practicum.filmorate.dto.event.EventDto; import ru.yandex.practicum.filmorate.model.Event; -@Component +@UtilityClass public class EventMapper { - - public static EventDto toEventDto(Event event) { + + public EventDto toEventDto(Event event) { return EventDto.builder() .timestamp(event.getTimestamp()) .userId(event.getUserId()) @@ -17,4 +17,4 @@ public static EventDto toEventDto(Event event) { .entityId(event.getEntityId()) .build(); } -} \ No newline at end of file +} From 8d525c925c54f640f698c7526a50ec9dae59091a Mon Sep 17 00:00:00 2001 From: n20va <99407852+n20va@users.noreply.github.com> Date: Sat, 18 Oct 2025 21:23:15 +0300 Subject: [PATCH 34/34] Update EventMapper.java --- .../java/ru/yandex/practicum/filmorate/mapper/EventMapper.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java b/src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java index a1bafd4..9ac3f6f 100644 --- a/src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java +++ b/src/main/java/ru/yandex/practicum/filmorate/mapper/EventMapper.java @@ -6,7 +6,7 @@ @UtilityClass public class EventMapper { - + public EventDto toEventDto(Event event) { return EventDto.builder() .timestamp(event.getTimestamp()) @@ -18,3 +18,4 @@ public EventDto toEventDto(Event event) { .build(); } } +