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 )