From 6c2c8a03865df407a1b8e9267e8e1a5995057a36 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 30 Jun 2026 01:08:06 +0900 Subject: [PATCH] =?UTF-8?q?feat(recommendation):=20=EC=9D=B8=EA=B8=B0=20?= =?UTF-8?q?=EC=BB=A4=EB=AE=A4=EB=8B=88=ED=8B=B0=20=EC=A2=8B=EC=95=84?= =?UTF-8?q?=EC=9A=94=20=EC=A1=B0=ED=9A=8C=EB=A5=BC=20=EC=B6=94=EA=B0=80?= =?UTF-8?q?=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../DefaultHomeRecommendationQueryRepository.kt | 16 +++++++++++++++- .../port/out/HomeRecommendationQueryPort.kt | 3 ++- ...faultHomeRecommendationQueryRepositoryTest.kt | 5 +++++ 3 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/adapter/out/persistence/DefaultHomeRecommendationQueryRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/adapter/out/persistence/DefaultHomeRecommendationQueryRepository.kt index 8b358c7e..f4bd9e22 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/adapter/out/persistence/DefaultHomeRecommendationQueryRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/adapter/out/persistence/DefaultHomeRecommendationQueryRepository.kt @@ -792,7 +792,8 @@ class DefaultHomeRecommendationQueryRepository( creatorCommunity.createdAt, creatorCommunityLike.id.countDistinct(), creatorCommunityComment.id.countDistinct(), - orderedCommunityPostCondition(memberId) + orderedCommunityPostCondition(memberId), + likedCommunityPostCondition(memberId) ) ) .from(creatorCommunity) @@ -1229,6 +1230,19 @@ class DefaultHomeRecommendationQueryRepository( .exists() } + private fun likedCommunityPostCondition(memberId: Long?): BooleanExpression { + if (memberId == null) return Expressions.FALSE + return JPAExpressions + .selectOne() + .from(creatorCommunityLike) + .where( + creatorCommunityLike.creatorCommunity.id.eq(creatorCommunity.id), + creatorCommunityLike.member.id.eq(memberId), + creatorCommunityLike.isActive.isTrue + ) + .exists() + } + private fun notBlockedCreatorSql(creatorIdExpression: String): String { return """ not exists ( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/port/out/HomeRecommendationQueryPort.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/port/out/HomeRecommendationQueryPort.kt index 735ad379..16b3e094 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/port/out/HomeRecommendationQueryPort.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommendation/port/out/HomeRecommendationQueryPort.kt @@ -152,7 +152,8 @@ data class HomePopularCommunityRecommendationRecord( val createdAt: LocalDateTime, val likeCount: Long, val commentCount: Long, - val existOrdered: Boolean + val existOrdered: Boolean, + val isLiked: Boolean ) data class HomeGenreCreatorRecommendationGroup( diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/recommendation/adapter/out/persistence/DefaultHomeRecommendationQueryRepositoryTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/recommendation/adapter/out/persistence/DefaultHomeRecommendationQueryRepositoryTest.kt index 0f627358..67e887f1 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/recommendation/adapter/out/persistence/DefaultHomeRecommendationQueryRepositoryTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/recommendation/adapter/out/persistence/DefaultHomeRecommendationQueryRepositoryTest.kt @@ -1389,6 +1389,7 @@ class DefaultHomeRecommendationQueryRepositoryTest @Autowired constructor( val creator = saveMember("community-detail-creator", MemberRole.CREATOR) val inactiveCreator = saveMember("community-detail-inactive-creator", MemberRole.CREATOR, isActive = false) val member = saveMember("community-detail-member", MemberRole.USER) + val otherMember = saveMember("community-detail-other-member", MemberRole.USER) val eligible = saveCommunity( creator, isCommentAvailable = true, @@ -1403,6 +1404,7 @@ class DefaultHomeRecommendationQueryRepositoryTest @Autowired constructor( val like1 = saveCommunityLike(member, eligible, isActive = true) val like2 = saveCommunityLike(member, eligible, isActive = true) saveCommunityLike(member, eligible, isActive = false) + saveCommunityLike(otherMember, paid, isActive = true) val comment1 = saveCommunityComment(member, eligible, isActive = true) saveCommunityComment(member, eligible, isActive = false) updateCreatedAt("CreatorCommunity", eligible.id!!, LocalDateTime.of(2026, 5, 29, 1, 0)) @@ -1430,6 +1432,8 @@ class DefaultHomeRecommendationQueryRepositoryTest @Autowired constructor( assertEquals(1L, detailById[eligible.id]!!.commentCount) assertEquals(false, detailById[eligible.id]!!.existOrdered) assertEquals(true, detailById[paid.id]!!.existOrdered) + assertEquals(true, detailById[eligible.id]!!.isLiked) + assertEquals(false, detailById[paid.id]!!.isLiked) assertEquals(creator.id, detailById[eligible.id]!!.creatorId) assertEquals("community-detail-creator", detailById[eligible.id]!!.creatorNickname) } @@ -1449,6 +1453,7 @@ class DefaultHomeRecommendationQueryRepositoryTest @Autowired constructor( assertEquals(listOf(paid.id), details.map { it.communityId }) assertEquals(listOf(false), details.map { it.existOrdered }) + assertEquals(listOf(false), details.map { it.isLiked }) } @Test