차단 사용자 제외를 조회 쿼리로 통합

홈, 추천 채널, 랭킹 조회에서 차단 사용자 제외를
애플리케이션 필터링 대신 DB 쿼리로 처리한다.
콘텐츠/랭킹/추천 조회 API에 memberId 인자를 전달한다.
This commit is contained in:
2026-02-12 16:01:53 +09:00
parent 7afbf1bff8
commit 232d97e37e
7 changed files with 110 additions and 75 deletions

View File

@@ -22,7 +22,6 @@ import kr.co.vividnext.sodalive.i18n.LangContext
import kr.co.vividnext.sodalive.live.room.LiveRoomService
import kr.co.vividnext.sodalive.live.room.LiveRoomStatus
import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberService
import kr.co.vividnext.sodalive.query.recommend.RecommendChannelQueryService
import kr.co.vividnext.sodalive.rank.ContentRankingSortType
import kr.co.vividnext.sodalive.rank.RankingRepository
@@ -37,7 +36,6 @@ import java.time.temporal.TemporalAdjusters
@Service
class HomeService(
private val memberService: MemberService,
private val liveRoomService: LiveRoomService,
private val auditionService: AuditionService,
private val seriesService: ContentSeriesService,
@@ -85,14 +83,7 @@ class HomeService(
)
val creatorRanking = rankingRepository
.getCreatorRankings()
.filter {
if (memberId != null) {
!memberService.isBlocked(blockedMemberId = memberId, memberId = it.id!!)
} else {
true
}
}
.getCreatorRankings(memberId = memberId)
.map {
val followerCount = explorerQueryRepository.getNotificationUserIds(it.id!!).size
val follow = if (memberId != null) {
@@ -111,17 +102,12 @@ class HomeService(
)
val latestContentList = contentService.getLatestContentByTheme(
memberId = memberId,
theme = latestContentThemeList,
contentType = contentType,
isFree = false,
isAdult = isAdult
).filter {
if (memberId != null) {
!memberService.isBlocked(blockedMemberId = memberId, memberId = it.creatorId)
} else {
true
}
}
)
val translatedLatestContentList = getTranslatedContentList(contentList = latestContentList)
@@ -237,6 +223,7 @@ class HomeService(
}
val freeContentList = contentService.getLatestContentByTheme(
memberId = memberId,
theme = contentThemeService.getActiveThemeOfContent(
isAdult = isAdult,
isFree = true,
@@ -246,31 +233,20 @@ class HomeService(
isFree = true,
isAdult = isAdult,
orderByRandom = true
).filter {
if (memberId != null) {
!memberService.isBlocked(blockedMemberId = memberId, memberId = it.creatorId)
} else {
true
}
}
)
val translatedFreeContentList = getTranslatedContentList(contentList = freeContentList)
// 포인트 사용가능 콘텐츠 리스트 - 랜덤으로 가져오기 (DB에서 isPointAvailable 조건 적용)
val pointAvailableContentList = contentService.getLatestContentByTheme(
memberId = memberId,
theme = emptyList(),
contentType = contentType,
isFree = false,
isAdult = isAdult,
orderByRandom = true,
isPointAvailableOnly = true
).filter {
if (memberId != null) {
!memberService.isBlocked(blockedMemberId = memberId, memberId = it.creatorId)
} else {
true
}
}
)
val translatedPointAvailableContentList = getTranslatedContentList(contentList = pointAvailableContentList)
@@ -326,17 +302,12 @@ class HomeService(
}
val contentList = contentService.getLatestContentByTheme(
memberId = memberId,
theme = themeList,
contentType = contentType,
isFree = false,
isAdult = isAdult
).filter {
if (memberId != null) {
!memberService.isBlocked(blockedMemberId = memberId, memberId = it.creatorId)
} else {
true
}
}
)
return getTranslatedContentList(contentList = contentList)
}
@@ -428,6 +399,7 @@ class HomeService(
while (attempt < RECOMMEND_MAX_ATTEMPTS && result.size < RECOMMEND_TARGET_SIZE) {
attempt += 1
val batch = contentService.getLatestContentByTheme(
memberId = memberId,
theme = emptyList(), // 특정 테마에 종속되지 않도록 전체에서 랜덤 조회
contentType = contentType,
offset = 0,
@@ -435,13 +407,7 @@ class HomeService(
isFree = false,
isAdult = isAdult,
orderByRandom = true
).filter {
if (memberId != null) {
!memberService.isBlocked(blockedMemberId = memberId, memberId = it.creatorId)
} else {
true
}
}
)
for (item in batch) {
if (result.size >= RECOMMEND_TARGET_SIZE) break