diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/ranking/adapter/out/persistence/DefaultCreatorRankingBlockRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/ranking/adapter/out/persistence/DefaultCreatorRankingBlockRepository.kt new file mode 100644 index 00000000..1f297a09 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/ranking/adapter/out/persistence/DefaultCreatorRankingBlockRepository.kt @@ -0,0 +1,40 @@ +package kr.co.vividnext.sodalive.v2.ranking.adapter.out.persistence + +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.member.block.QBlockMember +import kr.co.vividnext.sodalive.v2.ranking.port.out.CreatorRankingBlockPort +import org.springframework.stereotype.Repository + +@Repository +class DefaultCreatorRankingBlockRepository( + private val queryFactory: JPAQueryFactory +) : CreatorRankingBlockPort { + override fun findBlockedCreatorIds(memberId: Long, creatorIds: Collection): Set { + if (creatorIds.isEmpty()) { + return emptySet() + } + + val viewerBlock = QBlockMember("creatorRankingViewerBlock") + val creatorBlock = QBlockMember("creatorRankingCreatorBlock") + val blockedByViewer = queryFactory + .select(viewerBlock.blockedMember.id) + .from(viewerBlock) + .where( + viewerBlock.member.id.eq(memberId) + .and(viewerBlock.blockedMember.id.`in`(creatorIds)) + .and(viewerBlock.isActive.isTrue) + ) + .fetch() + val blockedByCreator = queryFactory + .select(creatorBlock.member.id) + .from(creatorBlock) + .where( + creatorBlock.member.id.`in`(creatorIds) + .and(creatorBlock.blockedMember.id.eq(memberId)) + .and(creatorBlock.isActive.isTrue) + ) + .fetch() + + return (blockedByViewer + blockedByCreator).toSet() + } +}