fix(block-member): 양방향 차단 관계의 댓글·응원·콘텐츠 노출을 차단한다

This commit is contained in:
2026-02-23 14:08:23 +09:00
parent 07fb6202a8
commit cc74628107
28 changed files with 528 additions and 155 deletions

View File

@@ -22,7 +22,7 @@ class LiveRecommendService(
return repository.getRecommendLive(
isBlocked = {
if (member != null) {
blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it)
isBlockedBetweenMembers(memberId = member.id!!, creatorId = it)
} else {
false
}
@@ -35,7 +35,7 @@ class LiveRecommendService(
val onAirChannelList = repository.getOnAirRecommendChannelList(
isBlocked = {
if (member != null) {
blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it)
isBlockedBetweenMembers(memberId = member.id!!, creatorId = it)
} else {
false
}
@@ -55,7 +55,7 @@ class LiveRecommendService(
limit = (20 - onAirChannelList.size).toLong(),
isBlocked = {
if (member != null) {
blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it)
isBlockedBetweenMembers(memberId = member.id!!, creatorId = it)
} else {
false
}
@@ -68,7 +68,7 @@ class LiveRecommendService(
fun getFollowingChannelList(member: Member): List<GetRecommendChannelResponse> {
val onAirFollowingChannelList = repository.getOnAirFollowingChannelList(
memberId = member.id!!,
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) },
isBlocked = { isBlockedBetweenMembers(memberId = member.id!!, creatorId = it) },
isCreator = member.role == MemberRole.CREATOR,
isAdult = member.auth != null
)
@@ -83,7 +83,7 @@ class LiveRecommendService(
memberId = member.id!!,
withOutCreatorList = onAirCreatorIdList,
limit = (20 - onAirCreatorIdList.size).toLong(),
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }
isBlocked = { isBlockedBetweenMembers(memberId = member.id!!, creatorId = it) }
)
return onAirFollowingChannelList + notOnAirFollowingChannelList
@@ -92,14 +92,14 @@ class LiveRecommendService(
fun getFollowingAllChannelList(member: Member, pageable: Pageable): GetCreatorFollowingAllListResponse {
val totalCount = repository.getCreatorFollowingAllListTotalCount(
memberId = member.id!!,
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }
isBlocked = { isBlockedBetweenMembers(memberId = member.id!!, creatorId = it) }
)
val items = repository.getCreatorFollowingAllList(
memberId = member.id!!,
offset = pageable.offset,
limit = pageable.pageSize.toLong(),
isBlocked = { blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it) }
isBlocked = { isBlockedBetweenMembers(memberId = member.id!!, creatorId = it) }
)
return GetCreatorFollowingAllListResponse(
@@ -107,4 +107,9 @@ class LiveRecommendService(
items = items
)
}
private fun isBlockedBetweenMembers(memberId: Long, creatorId: Long): Boolean {
return blockMemberRepository.isBlocked(blockedMemberId = memberId, memberId = creatorId) ||
blockMemberRepository.isBlocked(blockedMemberId = creatorId, memberId = memberId)
}
}

View File

@@ -121,9 +121,15 @@ class LiveRoomQueryRepositoryImpl(
.leftJoin(quarterLiveRankings).on(liveRoom.id.eq(quarterLiveRankings.roomId))
if (hasMemberId) {
val blockMemberCondition = blockMember.member.id.eq(member.id)
.and(blockMember.blockedMember.id.eq(memberId))
.and(blockMember.isActive.isTrue)
val blockMemberCondition = blockMember.isActive.isTrue
.and(
blockMember.member.id.eq(member.id)
.and(blockMember.blockedMember.id.eq(memberId))
.or(
blockMember.member.id.eq(memberId)
.and(blockMember.blockedMember.id.eq(member.id))
)
)
select = select.leftJoin(blockMember).on(blockMemberCondition)
where = where.and(blockMember.id.isNull)
@@ -190,9 +196,15 @@ class LiveRoomQueryRepositoryImpl(
.innerJoin(liveRoom.member, member)
if (memberId != null) {
val blockMemberCondition = blockMember.member.id.eq(member.id)
.and(blockMember.blockedMember.id.eq(memberId))
.and(blockMember.isActive.isTrue)
val blockMemberCondition = blockMember.isActive.isTrue
.and(
blockMember.member.id.eq(member.id)
.and(blockMember.blockedMember.id.eq(memberId))
.or(
blockMember.member.id.eq(memberId)
.and(blockMember.blockedMember.id.eq(member.id))
)
)
select = select.leftJoin(blockMember).on(blockMemberCondition)
where = where.and(blockMember.id.isNull)
@@ -269,9 +281,15 @@ class LiveRoomQueryRepositoryImpl(
.limit(10)
if (memberId != null) {
val blockMemberCondition = blockMember.member.id.eq(member.id)
.and(blockMember.blockedMember.id.eq(memberId))
.and(blockMember.isActive.isTrue)
val blockMemberCondition = blockMember.isActive.isTrue
.and(
blockMember.member.id.eq(member.id)
.and(blockMember.blockedMember.id.eq(memberId))
.or(
blockMember.member.id.eq(memberId)
.and(blockMember.blockedMember.id.eq(member.id))
)
)
select = select.leftJoin(blockMember).on(blockMemberCondition)
where = where.and(blockMember.id.isNull)

View File

@@ -500,6 +500,13 @@ class LiveRoomService(
val room = repository.getLiveRoom(id = roomId)
?: throw SodaException(messageKey = "live.room.already_ended")
val creatorId = room.member!!.id!!
val isBlockedByCreator = blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = creatorId)
val isBlockedByMember = blockMemberRepository.isBlocked(blockedMemberId = creatorId, memberId = member.id!!)
if (isBlockedByCreator || isBlockedByMember) {
throw SodaException(messageKey = "live.room.already_ended")
}
if (room.isAdult && member.auth == null) {
throw SodaException(messageKey = "live.room.adult_verification_required")
}
@@ -747,6 +754,14 @@ class LiveRoomService(
)
}
val isBlockedByMember = blockMemberRepository.isBlocked(
blockedMemberId = room.member!!.id!!,
memberId = member.id!!
)
if (isBlockedByMember) {
throw SodaException(messageKey = "live.room.not_found")
}
val kickOutCount = kickOutService.getKickOutCount(roomId = room.id!!, userId = member.id!!)
if (kickOutCount >= 2) {
throw SodaException(
@@ -910,6 +925,13 @@ class LiveRoomService(
val room = repository.findByIdOrNull(roomId)
?: throw SodaException(messageKey = "live.room.info_not_found")
val creatorId = room.member!!.id!!
val isBlockedByCreator = blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = creatorId)
val isBlockedByMember = blockMemberRepository.isBlocked(blockedMemberId = creatorId, memberId = member.id!!)
if (isBlockedByCreator || isBlockedByMember) {
throw SodaException(messageKey = "live.room.info_not_found")
}
val currentTimeStamp = Date().time
val expireTimestamp = (currentTimeStamp + (60 * 60 * 24 * 1000)) / 1000
@@ -1427,7 +1449,8 @@ class LiveRoomService(
return repository.getLatestFinishedLive()
.filter {
if (member?.id != null) {
!blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.memberId)
!blockMemberRepository.isBlocked(blockedMemberId = member.id!!, memberId = it.memberId) &&
!blockMemberRepository.isBlocked(blockedMemberId = it.memberId, memberId = member.id!!)
} else {
true
}