feat(creator-channel): 오디오 목록 제목 번역을 적용한다

This commit is contained in:
2026-09-09 23:16:33 +09:00
parent feb987dac9
commit 6688bd7117
2 changed files with 87 additions and 2 deletions
@@ -12,6 +12,7 @@ import kr.co.vividnext.sodalive.content.order.QOrder.order
import kr.co.vividnext.sodalive.content.series.translation.QSeriesTranslation
import kr.co.vividnext.sodalive.content.theme.QAudioContentTheme.audioContentTheme
import kr.co.vividnext.sodalive.content.theme.translation.QContentThemeTranslation
import kr.co.vividnext.sodalive.content.translation.QContentTranslation
import kr.co.vividnext.sodalive.creator.admin.content.series.QSeries.series
import kr.co.vividnext.sodalive.creator.admin.content.series.QSeriesContent.seriesContent
import kr.co.vividnext.sodalive.member.QMember.member
@@ -173,10 +174,11 @@ class DefaultCreatorChannelAudioQueryRepository(
val rows = findAudioContentRows(creatorId, viewerId, themeId, now, canViewAdultContent, sort, offset, limit)
val contentIds = rows.map { itAudioId(it) }
val firstContentId = firstAudioContentId(creatorId, now, canViewAdultContent)
val titlesByContentId = audioTitlesByContentIds(contentIds, locale)
val seriesByContentId = audioSeriesByContentIds(contentIds, locale)
val orderStatesByContentId = orderStatesByContentIds(viewerId, contentIds, now)
return rows.map { it.toAudioRecord(firstContentId, seriesByContentId, orderStatesByContentId) }
return rows.map { it.toAudioRecord(firstContentId, titlesByContentId, seriesByContentId, orderStatesByContentId) }
}
private fun findAudioContentRows(
@@ -307,6 +309,7 @@ class DefaultCreatorChannelAudioQueryRepository(
private fun Tuple.toAudioRecord(
firstContentId: Long?,
titlesByContentId: Map<Long, String>,
seriesByContentId: Map<Long, AudioSeriesSummary>,
orderStatesByContentId: Map<Long, AudioOrderState>
): CreatorChannelAudioContentRecord {
@@ -315,7 +318,7 @@ class DefaultCreatorChannelAudioQueryRepository(
val orderState = orderStatesByContentId[audioContentId]
return CreatorChannelAudioContentRecord(
audioContentId = audioContentId,
title = get(audioContent.title)!!,
title = titlesByContentId[audioContentId] ?: get(audioContent.title)!!,
duration = get(audioContent.duration),
imagePath = get(audioContent.coverImage),
price = get(audioContent.price)!!,
@@ -329,6 +332,24 @@ class DefaultCreatorChannelAudioQueryRepository(
)
}
private fun audioTitlesByContentIds(contentIds: List<Long>, locale: String): Map<Long, String> {
if (contentIds.isEmpty()) return emptyMap()
val contentTranslation = QContentTranslation("audioContentTranslation")
return queryFactory
.select(contentTranslation.contentId, contentTranslation.renderedPayload)
.from(contentTranslation)
.where(
contentTranslation.contentId.`in`(contentIds),
contentTranslation.locale.eq(locale)
)
.fetch()
.mapNotNull {
val title = it.get(contentTranslation.renderedPayload)?.title.takeUnless(String?::isNullOrBlank)
title?.let { translatedTitle -> it.get(contentTranslation.contentId)!! to translatedTitle }
}
.toMap()
}
private fun firstAudioContentId(
creatorId: Long,
now: LocalDateTime,