From 88612b34794d140172cd0b275a4081949dd10afb Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 13 Feb 2026 16:37:13 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B2=88=EC=97=AD=20=EC=A0=9C=EB=AA=A9=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20=EB=B0=A9=EC=8B=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/AudioContentRepository.kt | 107 +++++++++++++----- 1 file changed, 80 insertions(+), 27 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt index 05bd96ec..aa1ae861 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -1385,40 +1385,73 @@ class AudioContentQueryRepositoryImpl( where = where.and(audioContent.id.notIn(excludeContentIds)) } - val titleExpression = if (locale != null) { - val translatedTitle = Expressions.stringTemplate( - "JSON_EXTRACT({0}, '$.title')", - contentTranslation.renderedPayload - ) - val coalesceTitle = Expressions.stringTemplate( - "COALESCE(NULLIF({0}, ''), {1})", - translatedTitle, - audioContent.title - ) - coalesceTitle - } else { - audioContent.title + if (locale == null) { + var select = queryFactory + .select( + QAudioContentMainItem( + audioContent.id, + member.id, + audioContent.title, + audioContent.coverImage.prepend("/").prepend(imageHost), + member.nickname, + audioContent.isPointAvailable + ) + ) + .from(audioContent) + .innerJoin(audioContent.member, member) + .innerJoin(audioContent.theme, audioContentTheme) + + if (memberId != null) { + where = where.and(blockMember.id.isNull) + select = select.leftJoin(blockMember).on(blockMemberCondition) + } + + val orderBy = if (orderByRandom) { + Expressions.numberTemplate(Double::class.java, "function('rand')").asc() + } else { + when (sortType) { + SortType.NEWEST -> audioContent.releaseDate.desc() + SortType.PRICE_HIGH -> if (isFree) { + audioContent.releaseDate.desc() + } else { + audioContent.price.desc() + } + + SortType.PRICE_LOW -> if (isFree) { + audioContent.releaseDate.asc() + } else { + audioContent.price.desc() + } + + SortType.POPULARITY -> audioContent.playCount.desc() + } + } + + return select + .where(where) + .offset(offset) + .limit(limit) + .orderBy(orderBy) + .fetch() } + val coverImageUrl = audioContent.coverImage.prepend("/").prepend(imageHost) + var select = queryFactory .select( - QAudioContentMainItem( - audioContent.id, - member.id, - titleExpression, - audioContent.coverImage.prepend("/").prepend(imageHost), - member.nickname, - audioContent.isPointAvailable - ) + audioContent.id, + member.id, + audioContent.title, + contentTranslation.renderedPayload, + coverImageUrl, + member.nickname, + audioContent.isPointAvailable ) .from(audioContent) .innerJoin(audioContent.member, member) .innerJoin(audioContent.theme, audioContentTheme) - - if (locale != null) { - select = select.leftJoin(contentTranslation) - .on(contentTranslation.contentId.eq(audioContent.id).and(contentTranslation.locale.eq(locale))) - } + .leftJoin(contentTranslation) + .on(contentTranslation.contentId.eq(audioContent.id).and(contentTranslation.locale.eq(locale))) if (memberId != null) { where = where.and(blockMember.id.isNull) @@ -1446,12 +1479,32 @@ class AudioContentQueryRepositoryImpl( } } - return select + val results = select .where(where) .offset(offset) .limit(limit) .orderBy(orderBy) .fetch() + + return results.map { row -> + val contentId = row.get(audioContent.id)!! + val creatorId = row.get(member.id)!! + val originTitle = row.get(audioContent.title)!! + val payload = row.get(contentTranslation.renderedPayload) + val translatedTitle = payload?.title + val imageUrl = row.get(coverImageUrl)!! + val creatorNickname = row.get(member.nickname)!! + val isPointAvailableValue = row.get(audioContent.isPointAvailable) ?: false + + AudioContentMainItem( + contentId = contentId, + creatorId = creatorId, + title = if (translatedTitle.isNullOrBlank()) originTitle else translatedTitle, + coverImageUrl = imageUrl, + creatorNickname = creatorNickname, + isPointAvailable = isPointAvailableValue + ) + } } override fun findContentByCurationId(