From 198ecddc89b72d557f6d59d66eee17a8277eea78 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 1 Apr 2025 16:21:32 +0900 Subject: [PATCH] =?UTF-8?q?=EC=BD=98=ED=85=90=EC=B8=A0=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20-=20=EC=9D=B4=EC=A0=84=ED=99=94/=EB=8B=A4=EC=9D=8C?= =?UTF-8?q?=ED=99=94=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../content/AudioContentRepository.kt | 37 +++++++++++++++++++ .../sodalive/content/AudioContentService.kt | 7 +++- .../content/GetAudioContentDetailResponse.kt | 4 +- 3 files changed, 46 insertions(+), 2 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 47a96d4..f904232 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentRepository.kt @@ -22,6 +22,7 @@ import kr.co.vividnext.sodalive.content.pin.QPinContent.pinContent import kr.co.vividnext.sodalive.content.playlist.AudioContentPlaylistContent import kr.co.vividnext.sodalive.content.playlist.QAudioContentPlaylistContent import kr.co.vividnext.sodalive.content.theme.QAudioContentTheme.audioContentTheme +import kr.co.vividnext.sodalive.creator.admin.content.series.QSeriesContent.seriesContent import kr.co.vividnext.sodalive.event.QEvent.event import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.QMember.member @@ -163,6 +164,8 @@ interface AudioContentQueryRepository { fun fetchContentForPlaylist(contentIdList: List): List fun getCoverImageById(id: Long): String? + fun findPreviousContent(title: String): OtherContentResponse? + fun findNextContent(title: String): OtherContentResponse? } @Repository @@ -1152,4 +1155,38 @@ class AudioContentQueryRepositoryImpl( .where(audioContent.id.eq(id)) .fetchFirst() } + + override fun findPreviousContent(title: String): OtherContentResponse? { + return queryFactory + .select( + QOtherContentResponse( + audioContent.id, + audioContent.title, + audioContent.coverImage.prepend("$imageHost/") + ) + ) + .from(seriesContent) + .innerJoin(seriesContent.content, audioContent) + .where(audioContent.title.lt(title)) + .orderBy(audioContent.title.asc()) + .limit(1) + .fetchFirst() + } + + override fun findNextContent(title: String): OtherContentResponse? { + return queryFactory + .select( + QOtherContentResponse( + audioContent.id, + audioContent.title, + audioContent.coverImage.prepend("$imageHost/") + ) + ) + .from(seriesContent) + .innerJoin(seriesContent.content, audioContent) + .where(audioContent.title.gt(title)) + .orderBy(audioContent.title.asc()) + .limit(1) + .fetchFirst() + } } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt index 53e86d9..6aaabb8 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -473,6 +473,9 @@ class AudioContentService( null } + val previousContent = repository.findPreviousContent(title = audioContent.title) + val nextContent = repository.findNextContent(title = audioContent.title) + if ( !isExistsAudioContent && !audioContent.isActive && @@ -666,7 +669,9 @@ class AudioContentService( isFollowing = creatorFollowing?.isFollow ?: false, isFollow = creatorFollowing?.isFollow ?: false, isNotify = creatorFollowing?.isNotify ?: false - ) + ), + previousContent = previousContent, + nextContent = nextContent ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt index d7346ef..67dd32b 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt @@ -35,7 +35,9 @@ data class GetAudioContentDetailResponse( val commentCount: Int, val isPin: Boolean, val isAvailablePin: Boolean, - val creator: AudioContentCreator + val creator: AudioContentCreator, + val previousContent: OtherContentResponse?, + val nextContent: OtherContentResponse? ) data class OtherContentResponse @QueryProjection constructor(