From 36052f034ace4e8e2fc3afbf6a9a21b13c31b3a8 Mon Sep 17 00:00:00 2001 From: Klaus Date: Wed, 18 Dec 2024 06:18:36 +0900 Subject: [PATCH] =?UTF-8?q?=EC=9E=AC=EC=83=9D=EB=AA=A9=EB=A1=9D=20?= =?UTF-8?q?=EB=93=B1=EB=A1=9D/=EC=88=98=EC=A0=95=20-=20=EB=93=B1=EB=A1=9D/?= =?UTF-8?q?=EC=88=98=EC=A0=95=EC=8B=9C=20=EB=A7=8C=EB=A3=8C=20=EB=82=A0?= =?UTF-8?q?=EC=A7=9C=20=EC=8B=9C=EA=B0=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sodalive/content/order/OrderRepository.kt | 22 +++++++++- .../playlist/AudioContentPlaylistService.kt | 41 ++++++++++++++----- .../playlist/ContentIdAndEndDateData.kt | 9 ++++ .../playlist/PlaylistContentIdAndOrder.kt | 5 ++- 4 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/ContentIdAndEndDateData.kt 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 6b31b77..e900de8 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 @@ -6,6 +6,8 @@ import kr.co.vividnext.sodalive.content.QAudioContent.audioContent 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.data.jpa.repository.JpaRepository import org.springframework.stereotype.Repository @@ -37,6 +39,7 @@ interface OrderQueryRepository { ): List fun findOrderedContent(contentIdList: List, memberId: Long): List + fun findEndDateByContentId(contentIdList: List, memberId: Long): List } @Repository @@ -229,9 +232,24 @@ class OrderQueryRepositoryImpl(private val queryFactory: JPAQueryFactory) : Orde .innerJoin(order.audioContent, audioContent) .where( order.isActive.isTrue, - order.endDate.isNull, member.id.eq(memberId), - audioContent.id.`in`(contentIdList) + audioContent.id.`in`(contentIdList), + order.endDate.isNull.or(order.endDate.after(LocalDateTime.now())) + ) + .fetch() + } + + override fun findEndDateByContentId(contentIdList: List, memberId: Long): List { + return queryFactory + .select(QContentIdAndEndDateData(audioContent.id, order.endDate)) + .from(order) + .innerJoin(order.member, member) + .innerJoin(order.audioContent, audioContent) + .where( + order.isActive.isTrue, + member.id.eq(memberId), + audioContent.id.`in`(contentIdList), + order.endDate.isNull.or(order.endDate.after(LocalDateTime.now())) ) .fetch() } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/AudioContentPlaylistService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/AudioContentPlaylistService.kt index 46ccf02..3b23c67 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/AudioContentPlaylistService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/AudioContentPlaylistService.kt @@ -27,10 +27,9 @@ class AudioContentPlaylistService( throw SodaException("플레이 리스트는 최대 10개까지 생성할 수 있습니다.") } - // 콘텐츠 유효성 검사 (소장으로 구매한 콘텐츠 인가?) - validateContent( - contentIdList = request.contentIdAndOrderList.map { it.contentId }, - memberId = member.id!! + val contentIdAndOrderList = validateAndGetContentIdAndOrderList( + contentIdAndOrderList = request.contentIdAndOrderList, + member ) val playlist = AudioContentPlaylist( @@ -38,12 +37,34 @@ class AudioContentPlaylistService( memberId = member.id!!, title = request.title, desc = request.desc, - contentIdAndOrderList = request.contentIdAndOrderList + contentIdAndOrderList = contentIdAndOrderList ) redisRepository.save(playlist) } + private fun validateAndGetContentIdAndOrderList( + contentIdAndOrderList: List, + member: Member + ): List { + validateContent( + contentIdList = contentIdAndOrderList.map { it.contentId }, + memberId = member.id!! + ) + + val contentIdAndEndDate = orderRepository.findEndDateByContentId( + contentIdList = contentIdAndOrderList.map { it.contentId }, + memberId = member.id!! + ) + + val contentIdAndEndDateMap = contentIdAndEndDate.associate { it.contentId to it.endDate } + + return contentIdAndOrderList.map { + it.endDate = contentIdAndEndDateMap[it.contentId] + it + } + } + private fun validateContent(contentIdList: List, memberId: Long) { if (contentIdList.isEmpty()) { throw SodaException("콘텐츠를 1개 이상 추가하세요") @@ -61,7 +82,7 @@ class AudioContentPlaylistService( val notOrderedContentList = orderedContentMap.filterValues { !it }.keys if (notOrderedContentList.isNotEmpty()) { - throw SodaException("소장하지 않은 콘텐츠는 재생목록에 추가할 수 없습니다.") + throw SodaException("대여/소장하지 않은 콘텐츠는 재생목록에 추가할 수 없습니다.") } } @@ -77,15 +98,15 @@ class AudioContentPlaylistService( throw SodaException("잘못된 요청입니다.") } - checkOrderedContent( - contentIdList = request.contentIdAndOrderList.map { it.contentId }, - memberId = member.id!! + val contentIdAndOrderList = validateAndGetContentIdAndOrderList( + contentIdAndOrderList = request.contentIdAndOrderList, + member ) val updatePlaylist = playlist.copy( title = request.title ?: playlist.title, desc = request.desc ?: playlist.desc, - contentIdAndOrderList = request.contentIdAndOrderList + contentIdAndOrderList = contentIdAndOrderList ) redisRepository.save(updatePlaylist) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/ContentIdAndEndDateData.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/ContentIdAndEndDateData.kt new file mode 100644 index 0000000..5d89a49 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/ContentIdAndEndDateData.kt @@ -0,0 +1,9 @@ +package kr.co.vividnext.sodalive.content.playlist + +import com.querydsl.core.annotations.QueryProjection +import java.time.LocalDateTime + +data class ContentIdAndEndDateData @QueryProjection constructor( + val contentId: Long, + val endDate: LocalDateTime? +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/PlaylistContentIdAndOrder.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/PlaylistContentIdAndOrder.kt index 2e0d558..dbc8196 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/PlaylistContentIdAndOrder.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/PlaylistContentIdAndOrder.kt @@ -1,6 +1,9 @@ package kr.co.vividnext.sodalive.content.playlist +import java.time.LocalDateTime + data class PlaylistContentIdAndOrder( val contentId: Long, - val order: Int + val order: Int, + var endDate: LocalDateTime? = null )