From 5759a51017b513dfae56e6b8d758e4461a309b0e Mon Sep 17 00:00:00 2001 From: Klaus Date: Fri, 11 Apr 2025 21:39:39 +0900 Subject: [PATCH] =?UTF-8?q?=ED=95=9C=EC=A0=95=ED=8C=90=20=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0=20-=20=ED=95=B4=EB=8B=B9=20=EC=BD=98?= =?UTF-8?q?=ED=85=90=EC=B8=A0=20=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=EC=9D=B8=20=EA=B2=BD=EC=9A=B0=20=EC=BD=98=ED=85=90?= =?UTF-8?q?=EC=B8=A0=20=EA=B5=AC=EB=A7=A4=EC=9E=90=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/content/AudioContentService.kt | 13 ++++++++- .../content/GetAudioContentDetailResponse.kt | 8 ++++- .../sodalive/content/order/OrderRepository.kt | 29 ++++++++++++++++++- 3 files changed, 47 insertions(+), 3 deletions(-) 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 2082361..7717c1e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/AudioContentService.kt @@ -652,6 +652,16 @@ class AudioContentService( audioContent.detail } + val buyerList = if ( + audioContent.member?.id == member.id && + audioContent.limited != null && + audioContent.remaining != null + ) { + orderRepository.findBuyerListByContentId(id) + } else { + listOf() + } + return GetAudioContentDetailResponse( contentId = audioContent.id!!, title = audioContent.title, @@ -696,7 +706,8 @@ class AudioContentService( isNotify = creatorFollowing?.isNotify ?: false ), previousContent = previousContent, - nextContent = nextContent + nextContent = nextContent, + buyerList = buyerList ) } 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 67dd32b..4eba473 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/GetAudioContentDetailResponse.kt @@ -37,7 +37,8 @@ data class GetAudioContentDetailResponse( val isAvailablePin: Boolean, val creator: AudioContentCreator, val previousContent: OtherContentResponse?, - val nextContent: OtherContentResponse? + val nextContent: OtherContentResponse?, + val buyerList: List ) data class OtherContentResponse @QueryProjection constructor( @@ -54,3 +55,8 @@ data class AudioContentCreator( val isFollow: Boolean, val isNotify: Boolean ) + +data class ContentBuyer @QueryProjection constructor( + val nickname: String, + val profileImageUrl: String +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderRepository.kt index e900de8..566cc27 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/order/OrderRepository.kt @@ -2,13 +2,16 @@ package kr.co.vividnext.sodalive.content.order import com.querydsl.core.types.dsl.Expressions import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.content.ContentBuyer import kr.co.vividnext.sodalive.content.QAudioContent.audioContent +import kr.co.vividnext.sodalive.content.QContentBuyer import kr.co.vividnext.sodalive.content.main.GetAudioContentMainItem import kr.co.vividnext.sodalive.content.main.QGetAudioContentMainItem import kr.co.vividnext.sodalive.content.order.QOrder.order import kr.co.vividnext.sodalive.content.playlist.ContentIdAndEndDateData import kr.co.vividnext.sodalive.content.playlist.QContentIdAndEndDateData import kr.co.vividnext.sodalive.member.QMember.member +import org.springframework.beans.factory.annotation.Value import org.springframework.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository import java.time.Duration @@ -40,10 +43,16 @@ interface OrderQueryRepository { fun findOrderedContent(contentIdList: List, memberId: Long): List fun findEndDateByContentId(contentIdList: List, memberId: Long): List + fun findBuyerListByContentId(contentId: Long): List } @Repository -class OrderQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : OrderQueryRepository { +class OrderQueryRepositoryImpl( + private val queryFactory: JPAQueryFactory, + + @Value("\${cloud.aws.cloud-front.host}") + private val imageHost: String +) : OrderQueryRepository { override fun isExistOrdered(memberId: Long, contentId: Long): Boolean { return queryFactory .select(order.id) @@ -253,4 +262,22 @@ class OrderQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : Orde ) .fetch() } + + override fun findBuyerListByContentId(contentId: Long): List { + return queryFactory + .select( + QContentBuyer( + member.nickname, + member.profileImage.prepend("/").prepend(imageHost) + ) + ) + .from(order) + .innerJoin(order.member, member) + .where( + order.isActive.isTrue, + order.audioContent.id.eq(contentId), + member.isActive.isTrue + ) + .fetch() + } }