fix(series): 오리지널 시리즈 조회에 양방향 차단 필터를 적용한다

This commit is contained in:
2026-02-26 01:27:14 +09:00
parent d5db08faca
commit 389727cdb5
6 changed files with 80 additions and 4 deletions

View File

@@ -126,6 +126,7 @@ class HomeService(
)
val originalAudioDramaList = seriesService.getOriginalAudioDramaList(
memberId = memberId,
isAdult = isAdult,
contentType = contentType
)

View File

@@ -42,6 +42,7 @@ class AudioContentMainTabSeriesController(private val service: AudioContentMainT
ApiResponse.ok(
service.getOriginalAudioDramaList(
memberId = member.id!!,
isAdult = member.auth != null && (isAdultContentVisible ?: true),
contentType = contentType ?: ContentType.ALL,
offset = pageable.offset,

View File

@@ -41,6 +41,7 @@ class AudioContentMainTabSeriesService(
)
val originalAudioDrama = seriesService.getOriginalAudioDramaList(
memberId = memberId,
isAdult = isAdult,
contentType = contentType,
offset = 0,
@@ -157,13 +158,15 @@ class AudioContentMainTabSeriesService(
}
fun getOriginalAudioDramaList(
memberId: Long,
isAdult: Boolean,
contentType: ContentType,
offset: Long,
limit: Long
): GetSeriesListResponse {
val totalCount = seriesService.getOriginalAudioDramaTotalCount(isAdult, contentType)
val totalCount = seriesService.getOriginalAudioDramaTotalCount(memberId, isAdult, contentType)
val items = seriesService.getOriginalAudioDramaList(
memberId = memberId,
isAdult = isAdult,
contentType = contentType,
offset = offset,

View File

@@ -84,11 +84,12 @@ interface ContentSeriesQueryRepository {
isAdult: Boolean,
contentType: ContentType,
locale: String,
memberId: Long? = null,
offset: Long = 0,
limit: Long = 20
): List<GetSeriesListResponse.SeriesListItem>
fun getOriginalAudioDramaTotalCount(isAdult: Boolean, contentType: ContentType): Int
fun getOriginalAudioDramaTotalCount(isAdult: Boolean, contentType: ContentType, memberId: Long? = null): Int
fun getGenreList(isAdult: Boolean, memberId: Long, contentType: ContentType): List<GetSeriesGenreListResponse>
fun findByCurationIdV2(
imageHost: String,
@@ -715,6 +716,7 @@ class ContentSeriesQueryRepositoryImpl(
isAdult: Boolean,
contentType: ContentType,
locale: String,
memberId: Long?,
offset: Long,
limit: Long
): List<GetSeriesListResponse.SeriesListItem> {
@@ -744,6 +746,24 @@ class ContentSeriesQueryRepositoryImpl(
where = where.and(audioContent.isAdult.isFalse)
}
if (memberId != null) {
val blockedSubquery = queryFactory
.select(blockMember.id)
.from(blockMember)
.where(
blockMember.isActive.isTrue
.and(
blockMember.member.id.eq(series.member.id)
.and(blockMember.blockedMember.id.eq(memberId))
.or(
blockMember.member.id.eq(memberId)
.and(blockMember.blockedMember.id.eq(series.member.id))
)
)
)
where = where.and(blockedSubquery.exists().not())
}
val now = LocalDateTime.now()
val sevenDaysAgo = now.minusDays(7)
@@ -823,7 +843,7 @@ class ContentSeriesQueryRepositoryImpl(
}
}
override fun getOriginalAudioDramaTotalCount(isAdult: Boolean, contentType: ContentType): Int {
override fun getOriginalAudioDramaTotalCount(isAdult: Boolean, contentType: ContentType, memberId: Long?): Int {
var where = series.isOriginal.isTrue
.and(series.isActive.isTrue)
@@ -845,6 +865,24 @@ class ContentSeriesQueryRepositoryImpl(
}
}
if (memberId != null) {
val blockedSubquery = queryFactory
.select(blockMember.id)
.from(blockMember)
.where(
blockMember.isActive.isTrue
.and(
blockMember.member.id.eq(series.member.id)
.and(blockMember.blockedMember.id.eq(memberId))
.or(
blockMember.member.id.eq(memberId)
.and(blockMember.blockedMember.id.eq(series.member.id))
)
)
)
where = where.and(blockedSubquery.exists().not())
}
return queryFactory
.select(series.id)
.from(series)

View File

@@ -46,10 +46,27 @@ class ContentSeriesService(
private val coverImageHost: String
) {
fun getOriginalAudioDramaTotalCount(isAdult: Boolean, contentType: ContentType): Int {
return repository.getOriginalAudioDramaTotalCount(isAdult, contentType)
return repository.getOriginalAudioDramaTotalCount(
isAdult = isAdult,
contentType = contentType,
memberId = null
)
}
fun getOriginalAudioDramaTotalCount(
memberId: Long?,
isAdult: Boolean,
contentType: ContentType
): Int {
return repository.getOriginalAudioDramaTotalCount(
isAdult = isAdult,
contentType = contentType,
memberId = memberId
)
}
fun getOriginalAudioDramaList(
memberId: Long?,
isAdult: Boolean,
contentType: ContentType,
offset: Long = 0,
@@ -60,6 +77,7 @@ class ContentSeriesService(
isAdult = isAdult,
contentType = contentType,
locale = langContext.lang.code,
memberId = memberId,
offset = offset,
limit = limit
)