From 196b82dcc0812d403c6ddd20ffecaf6314d69509 Mon Sep 17 00:00:00 2001 From: SlimusMinus Date: Thu, 25 Jun 2026 00:07:02 +0300 Subject: [PATCH] added likes on post --- .../com/krylov/refound/dto/PostResponse.java | 1 + .../repository/FavoriteRepository.java | 19 +++-- .../krylov/refound/service/PostService.java | 80 +++++++++++++++++-- 3 files changed, 87 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/krylov/refound/dto/PostResponse.java b/src/main/java/com/krylov/refound/dto/PostResponse.java index 01a641f..f5c6a78 100644 --- a/src/main/java/com/krylov/refound/dto/PostResponse.java +++ b/src/main/java/com/krylov/refound/dto/PostResponse.java @@ -23,4 +23,5 @@ public class PostResponse { private List images; private boolean isFavorite; private Long userId; + private Long likeCount; } diff --git a/src/main/java/com/krylov/refound/repository/FavoriteRepository.java b/src/main/java/com/krylov/refound/repository/FavoriteRepository.java index 6217e17..741a70d 100644 --- a/src/main/java/com/krylov/refound/repository/FavoriteRepository.java +++ b/src/main/java/com/krylov/refound/repository/FavoriteRepository.java @@ -10,15 +10,22 @@ import org.springframework.data.jpa.repository.Query; public interface FavoriteRepository extends JpaRepository { boolean existsByUserAndPost(User user, Post post); - List findByUser(User user); - void deleteByUserAndPost(User user, Post post); @Query(""" - SELECT f.post.id FROM Favorite f - WHERE f.user.id = :userId - AND f.post.id IN :postIds - """) + SELECT f.post.id FROM Favorite f + WHERE f.user.id = :userId + AND f.post.id IN :postIds + """) List findFavoritePostIds(Long userId, List postIds); + + // ADD THIS METHOD: + @Query(""" + SELECT f.post.id, COUNT(f.id) + FROM Favorite f + WHERE f.post.id IN :postIds + GROUP BY f.post.id + """) + List countLikesByPostIds(List postIds); } diff --git a/src/main/java/com/krylov/refound/service/PostService.java b/src/main/java/com/krylov/refound/service/PostService.java index 80b48a8..61bbd73 100644 --- a/src/main/java/com/krylov/refound/service/PostService.java +++ b/src/main/java/com/krylov/refound/service/PostService.java @@ -4,11 +4,13 @@ import com.krylov.refound.dto.PostRequest; import com.krylov.refound.dto.PostResponse; import com.krylov.refound.entity.Image; import com.krylov.refound.entity.Post; +import com.krylov.refound.entity.User; import com.krylov.refound.enums.ErrorCode; import com.krylov.refound.enums.PostCategory; import com.krylov.refound.enums.PostStatus; import com.krylov.refound.exception.ApiException; import com.krylov.refound.mapper.PostMapper; +import com.krylov.refound.repository.FavoriteRepository; import com.krylov.refound.repository.ImageRepository; import com.krylov.refound.repository.PostRepository; import java.io.IOException; @@ -16,8 +18,12 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.time.LocalDateTime; +import java.util.HashSet; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.UUID; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.cache.annotation.CacheEvict; @@ -36,6 +42,7 @@ public class PostService { private final ImageRepository imageRepository; private final NominatimService nominatimService; private final UserService userService; + private final FavoriteRepository favoriteRepository; public PostRequest create(PostRequest request, MultipartFile image) { @@ -66,17 +73,76 @@ public class PostService { } public List getFeed() { - return repository.findAll().stream() - .map(post -> { - PostResponse response = mapper.toResponse(post); - log.info("Post {}: images = {}, phone = {}", post.getId(), response.getImages()); // ← сюда - return response; - }).toList(); + List posts = repository.findAll(); + + // Get all post IDs + List postIds = posts.stream() + .map(Post::getId) + .toList(); + + // Count likes for each post + Map likeCounts = favoriteRepository.countLikesByPostIds(postIds).stream() + .collect(Collectors.toMap( + row -> (Long) row[0], // post ID + row -> (Long) row[1] // like count + )); + + // Get current user's favorites if authenticated + Set userFavoriteIds = new HashSet<>(); + try { + User currentUser = userService.getCurrentUser(); + userFavoriteIds = new HashSet<>( + favoriteRepository.findFavoritePostIds(currentUser.getId(), postIds) + ); + } catch (Exception e) { + // User not authenticated - that's OK + } + + // Set like counts and favorite status + final Set finalUserFavoriteIds = userFavoriteIds; + return posts.stream() + .map(post -> { + PostResponse response = mapper.toResponse(post); + response.setLikeCount(likeCounts.getOrDefault(post.getId(), 0L)); + response.setFavorite(finalUserFavoriteIds.contains(post.getId())); + return response; + }) + .toList(); } public List getById(Long id) { - return repository.findByUserId(id).stream().map(mapper::toResponse).toList(); + List posts = repository.findByUserId(id); + + List postIds = posts.stream() + .map(Post::getId) + .toList(); + + Map likeCounts = favoriteRepository.countLikesByPostIds(postIds).stream() + .collect(Collectors.toMap( + row -> (Long) row[0], + row -> (Long) row[1] + )); + + Set userFavoriteIds = new HashSet<>(); + try { + User currentUser = userService.getCurrentUser(); + userFavoriteIds = new HashSet<>( + favoriteRepository.findFavoritePostIds(currentUser.getId(), postIds) + ); + } catch (Exception e) { + // User not authenticated + } + + final Set finalUserFavoriteIds = userFavoriteIds; + return posts.stream() + .map(post -> { + PostResponse response = mapper.toResponse(post); + response.setLikeCount(likeCounts.getOrDefault(post.getId(), 0L)); + response.setFavorite(finalUserFavoriteIds.contains(post.getId())); + return response; + }) + .toList(); } public PostResponse update(Long id, PostRequest request, MultipartFile image) {