diff --git a/src/main/kotlin/zip/cafe/repository/MemberFollowRepository.kt b/src/main/kotlin/zip/cafe/repository/MemberFollowRepository.kt index f378557..620f21a 100644 --- a/src/main/kotlin/zip/cafe/repository/MemberFollowRepository.kt +++ b/src/main/kotlin/zip/cafe/repository/MemberFollowRepository.kt @@ -9,6 +9,9 @@ interface MemberFollowRepository : JpaRepository { @Query("select mf.to.id from MemberFollow mf where mf.from.id = :fromMemberId") fun getFolloweeIds(@Param("fromMemberId") fromMemberId: Long): List + @Query("select mf.to.id from MemberFollow mf group by mf.to.id order by count(mf.to.id) desc") + fun getPopularMemberIds(limit: Int): List + @Query("select (count(m) > 0) from MemberFollow m where m.from.id = :fromMemberId and m.to.id = :toMemberId") fun checkForFollowing(fromMemberId: Long, toMemberId: Long): Boolean } diff --git a/src/main/kotlin/zip/cafe/service/FeedService.kt b/src/main/kotlin/zip/cafe/service/FeedService.kt index 270a2a6..2cef122 100644 --- a/src/main/kotlin/zip/cafe/service/FeedService.kt +++ b/src/main/kotlin/zip/cafe/service/FeedService.kt @@ -5,6 +5,9 @@ import org.springframework.transaction.annotation.Transactional import zip.cafe.api.dto.* import zip.cafe.repository.MemberFollowRepository import zip.cafe.repository.ReviewRepository +import kotlin.math.max + +private const val MIN_FOLLOWEE_SIZE = 3 @Transactional(readOnly = true) @Service @@ -14,7 +17,15 @@ class FeedService( ) { fun getReviewFeeds(loginMemberId: Long, minReviewIdInFeed: Long?, limit: Long): FeedWithPagination { - val followeeIds = memberFollowRepository.getFolloweeIds(loginMemberId) + val followeeIds :MutableList = memberFollowRepository.getFolloweeIds(loginMemberId).toMutableList() + if (followeeIds.size < MIN_FOLLOWEE_SIZE) { + val popularMemberIds = memberFollowRepository.getPopularMemberIds(max(MIN_FOLLOWEE_SIZE, followeeIds.size)) + for (popularMemberId in popularMemberIds) { + if (popularMemberId !in followeeIds) { + followeeIds += popularMemberId + } + } + } val footprints = reviewRepository.findByAuthorIdIn(followeeIds + loginMemberId, minReviewIdInFeed, limit) val isLastPage = minReviewIdInFeed?.let { reviewRepository.isLastPageByAuthorIds(followeeIds, minReviewIdInFeed, limit) } ?: false val reviewAndLikes = reviewRepository.findReviewsAndLikesOnThoseReviews(loginMemberId, footprints.mapNotNull { it.review?.id })