diff --git a/src/main/java/org/websoso/WSSServer/controller/NovelController.java b/src/main/java/org/websoso/WSSServer/controller/NovelController.java index 7e078ac4..ce44c506 100644 --- a/src/main/java/org/websoso/WSSServer/controller/NovelController.java +++ b/src/main/java/org/websoso/WSSServer/controller/NovelController.java @@ -114,10 +114,12 @@ public ResponseEntity unregisterAsInterest(Principal principal, @GetMapping("/popular") public ResponseEntity getTodayPopularNovels(Principal principal) { - //TODO 차단 관계에 있는 유저의 피드글 처리 + User user = principal == null + ? null + : userService.getUserOrException(Long.valueOf(principal.getName())); return ResponseEntity .status(OK) - .body(novelService.getTodayPopularNovels()); + .body(novelService.getTodayPopularNovels(user)); } @GetMapping("/taste") diff --git a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java index 8e510001..6202a91d 100644 --- a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java +++ b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepository.java @@ -1,12 +1,13 @@ package org.websoso.WSSServer.repository; import java.util.List; +import java.util.Map; import org.websoso.WSSServer.domain.Feed; import org.websoso.WSSServer.domain.User; public interface FeedCustomRepository { - List findPopularFeedsByNovelIds(List novelIds); + Map findPopularFeedsByNovelIds(User user, List novelIds); List findFeedsByNoOffsetPagination(User owner, Long lastFeedId, int size); } diff --git a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java index 03752bd5..08874155 100644 --- a/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java +++ b/src/main/java/org/websoso/WSSServer/repository/FeedCustomRepositoryImpl.java @@ -1,13 +1,16 @@ package org.websoso.WSSServer.repository; - +import static org.websoso.WSSServer.domain.QBlock.block; import static org.websoso.WSSServer.domain.QFeed.feed; import static org.websoso.WSSServer.domain.QLike.like; +import com.querydsl.core.Tuple; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.Collections; import java.util.List; -import java.util.Objects; +import java.util.Map; +import java.util.function.Function; import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Repository; @@ -21,17 +24,31 @@ public class FeedCustomRepositoryImpl implements FeedCustomRepository { private final JPAQueryFactory jpaQueryFactory; @Override - public List findPopularFeedsByNovelIds(List novelIds) { - return novelIds.stream() - .map(novelId -> jpaQueryFactory - .selectFrom(feed) - .leftJoin(feed.likes, like) - .where(feed.novelId.eq(novelId)) - .groupBy(feed.feedId) - .orderBy(like.count().desc()) - .fetchFirst()) - .filter(Objects::nonNull) - .collect(Collectors.toList()); + public Map findPopularFeedsByNovelIds(User user, List novelIds) { + if (novelIds.isEmpty()) { + return Collections.emptyMap(); + } + + List blockedUserIds = (user != null) ? jpaQueryFactory.select(block.blockedId).from(block) + .where(block.blockingId.eq(user.getUserId())).fetch() : Collections.emptyList(); + + List results = jpaQueryFactory + .select(feed, like.count()) + .from(feed) + .leftJoin(feed.likes, like) + .where(feed.novelId.in(novelIds).and(feed.user.userId.notIn(blockedUserIds))) + .groupBy(feed.feedId) + .orderBy(like.count().desc()) + .fetch(); + + return results + .stream() + .map(tuple -> tuple.get(feed)) + .collect(Collectors.toMap( + Feed::getNovelId, + Function.identity(), + (existing, replacement) -> existing + )); } @Override diff --git a/src/main/java/org/websoso/WSSServer/service/NovelService.java b/src/main/java/org/websoso/WSSServer/service/NovelService.java index 3d4e1de7..0e53ddca 100644 --- a/src/main/java/org/websoso/WSSServer/service/NovelService.java +++ b/src/main/java/org/websoso/WSSServer/service/NovelService.java @@ -352,13 +352,11 @@ private NovelGetResponsePreview convertToDTO(Novel novel) { } @Transactional(readOnly = true) - public PopularNovelsGetResponse getTodayPopularNovels() { + public PopularNovelsGetResponse getTodayPopularNovels(User user) { List novelIdsFromPopularNovel = getNovelIdsFromPopularNovel(); List selectedNovelIdsFromPopularNovel = getSelectedNovelIdsFromPopularNovel(novelIdsFromPopularNovel); List popularNovels = getSelectedPopularNovels(selectedNovelIdsFromPopularNovel); - List popularFeedsFromPopularNovels = getPopularFeedsFromPopularNovels(selectedNovelIdsFromPopularNovel); - - Map feedMap = createFeedMap(popularFeedsFromPopularNovels); + Map feedMap = getPopularFeedsFromPopularNovels(user, selectedNovelIdsFromPopularNovel); Map avatarMap = createAvatarMap(feedMap); return createPopularNovelsGetResponse(popularNovels, feedMap, avatarMap); @@ -382,13 +380,8 @@ private List getSelectedPopularNovels(List selectedPopularNovelIds) return novelRepository.findAllById(selectedPopularNovelIds); } - private List getPopularFeedsFromPopularNovels(List selectedPopularNovelIds) { - return feedRepository.findPopularFeedsByNovelIds(selectedPopularNovelIds); - } - - private static Map createFeedMap(List popularFeedsFromPopularNovels) { - return popularFeedsFromPopularNovels.stream() - .collect(Collectors.toMap(Feed::getNovelId, feed -> feed)); + private Map getPopularFeedsFromPopularNovels(User user, List selectedPopularNovelIds) { + return feedRepository.findPopularFeedsByNovelIds(user, selectedPopularNovelIds); } private Map createAvatarMap(Map feedMap) {