diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/AudioContentPlaylist.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/AudioContentPlaylist.kt index aac2ee7..d9dd2ec 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/AudioContentPlaylist.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/AudioContentPlaylist.kt @@ -15,7 +15,7 @@ data class AudioContentPlaylist( val memberId: Long, var title: String, var desc: String? = null, - var contentIdList: List<Long>, + var contentIdAndOrderList: List<PlaylistContentIdAndOrder>, // ISO 8601 형식의 String private val _createdAt: String = LocalDateTime.now().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME) 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 550e366..4bc76ce 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 @@ -18,7 +18,7 @@ class AudioContentPlaylistService( private val redisRepository: AudioContentPlaylistRedisRepository ) { fun createPlaylist(request: CreatePlaylistRequest, member: Member) { - if (request.contentIdList.size >= 30) { + if (request.contentIdAndOrderList.size >= 30) { throw SodaException("플레이 리스트에는 최대 30개의 콘텐츠를 저장할 수 있습니다.") } @@ -29,7 +29,7 @@ class AudioContentPlaylistService( // 콘텐츠 유효성 검사 (소장으로 구매한 콘텐츠 인가?) checkOrderedContent( - contentIdList = request.contentIdList, + contentIdList = request.contentIdAndOrderList.map { it.contentId }, memberId = member.id!! ) @@ -38,7 +38,7 @@ class AudioContentPlaylistService( memberId = member.id!!, title = request.title, desc = request.desc, - contentIdList = request.contentIdList + contentIdAndOrderList = request.contentIdAndOrderList ) redisRepository.save(playlist) @@ -55,7 +55,7 @@ class AudioContentPlaylistService( } fun updatePlaylist(playlistId: Long, request: UpdatePlaylistRequest, member: Member) { - if (request.contentIdList.size >= 30) { + if (request.contentIdAndOrderList.size >= 30) { throw SodaException("플레이 리스트에는 최대 30개의 콘텐츠를 저장할 수 있습니다.") } @@ -67,14 +67,14 @@ class AudioContentPlaylistService( } checkOrderedContent( - contentIdList = request.contentIdList, + contentIdList = request.contentIdAndOrderList.map { it.contentId }, memberId = member.id!! ) val updatePlaylist = playlist.copy( title = request.title ?: playlist.title, desc = request.desc ?: playlist.desc, - contentIdList = request.contentIdList + contentIdAndOrderList = request.contentIdAndOrderList ) redisRepository.save(updatePlaylist) @@ -86,9 +86,9 @@ class AudioContentPlaylistService( return GetPlaylistsResponse( totalCount = playlists.size, items = playlists.map { - val contentCount = it.contentIdList.size + val contentCount = it.contentIdAndOrderList.size val coverImageUrl = if (contentCount > 0) { - audioContentRepository.getCoverImageById(id = it.contentIdList[0]) + audioContentRepository.getCoverImageById(id = it.contentIdAndOrderList[0].contentId) ?: "" } else { "" @@ -129,16 +129,24 @@ class AudioContentPlaylistService( .withZoneSameInstant(ZoneId.of("Asia/Seoul")) .format(dateTimeFormatter) - val contentList = audioContentRepository.fetchContentForPlaylist(contentIdList = playlist.contentIdList) + val contentList = audioContentRepository.fetchContentForPlaylist( + contentIdList = playlist.contentIdAndOrderList.map { it.contentId } + ) + + val orderMap = playlist.contentIdAndOrderList.sortedBy { it.order } + .mapIndexed { index, item -> item.contentId to index } + .toMap() + + val sortedContentList = contentList.sortedBy { orderMap[it.id] } return GetPlaylistDetailResponse( playlistId = playlist.id, title = playlist.title, desc = playlist.desc ?: "", createdDate = createdDate, - contentCount = contentList.size, - playlistCoverImageList = contentList.take(4).map { it.coverUrl }, - contentList = contentList + contentCount = sortedContentList.size, + playlistCoverImageList = sortedContentList.take(4).map { it.coverUrl }, + contentList = sortedContentList ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/CreatePlaylistRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/CreatePlaylistRequest.kt index 914cb90..1cdc09e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/CreatePlaylistRequest.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/CreatePlaylistRequest.kt @@ -3,5 +3,5 @@ package kr.co.vividnext.sodalive.content.playlist data class CreatePlaylistRequest( val title: String, val desc: String? = null, - val contentIdList: List<Long> = emptyList() + val contentIdAndOrderList: List<PlaylistContentIdAndOrder> = emptyList() ) 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 new file mode 100644 index 0000000..2e0d558 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/PlaylistContentIdAndOrder.kt @@ -0,0 +1,6 @@ +package kr.co.vividnext.sodalive.content.playlist + +data class PlaylistContentIdAndOrder( + val contentId: Long, + val order: Int +) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/UpdatePlaylistRequest.kt b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/UpdatePlaylistRequest.kt index 2fd2300..2c739c1 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/UpdatePlaylistRequest.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/content/playlist/UpdatePlaylistRequest.kt @@ -3,5 +3,5 @@ package kr.co.vividnext.sodalive.content.playlist data class UpdatePlaylistRequest( val title: String? = null, val desc: String? = null, - val contentIdList: List<Long> = emptyList() + val contentIdAndOrderList: List<PlaylistContentIdAndOrder> = emptyList() )