feat(creator): 채널 홈 오디오 주문 상태를 조회한다
This commit is contained in:
@@ -9,6 +9,8 @@ import kr.co.vividnext.sodalive.can.use.QUseCan.useCan
|
||||
import kr.co.vividnext.sodalive.chat.character.QChatCharacter.chatCharacter
|
||||
import kr.co.vividnext.sodalive.content.ContentType
|
||||
import kr.co.vividnext.sodalive.content.QAudioContent.audioContent
|
||||
import kr.co.vividnext.sodalive.content.order.OrderType
|
||||
import kr.co.vividnext.sodalive.content.order.QOrder.order
|
||||
import kr.co.vividnext.sodalive.creator.admin.content.series.QSeries.series
|
||||
import kr.co.vividnext.sodalive.creator.admin.content.series.QSeriesContent.seriesContent
|
||||
import kr.co.vividnext.sodalive.explorer.profile.QCreatorCheers.creatorCheers
|
||||
@@ -159,9 +161,11 @@ class DefaultCreatorChannelHomeQueryRepository(
|
||||
viewerId: Long?
|
||||
): CreatorChannelAudioContentRecord? {
|
||||
val row = findAudioContentRows(creatorId, now, null, canViewAdultContent, 1).firstOrNull() ?: return null
|
||||
val contentId = itAudioId(row)
|
||||
return row.toAudioRecord(
|
||||
firstContentId = firstAudioContentId(creatorId, now, canViewAdultContent),
|
||||
seriesByContentId = audioSeriesByContentIds(listOf(itAudioId(row)))
|
||||
seriesByContentId = audioSeriesByContentIds(listOf(contentId)),
|
||||
orderStatesByContentId = orderStatesByContentIds(viewerId, listOf(contentId), now)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -356,9 +360,11 @@ class DefaultCreatorChannelHomeQueryRepository(
|
||||
limit: Int
|
||||
): List<CreatorChannelAudioContentRecord> {
|
||||
val rows = findAudioContentRows(creatorId, now, latestAudioContentId, canViewAdultContent, limit)
|
||||
val contentIds = rows.map { itAudioId(it) }
|
||||
val firstContentId = firstAudioContentId(creatorId, now, canViewAdultContent)
|
||||
val seriesByContentId = audioSeriesByContentIds(rows.map { itAudioId(it) })
|
||||
return rows.map { it.toAudioRecord(firstContentId, seriesByContentId) }
|
||||
val seriesByContentId = audioSeriesByContentIds(contentIds)
|
||||
val orderStatesByContentId = orderStatesByContentIds(viewerId, contentIds, now)
|
||||
return rows.map { it.toAudioRecord(firstContentId, seriesByContentId, orderStatesByContentId) }
|
||||
}
|
||||
|
||||
override fun findSeries(
|
||||
@@ -551,10 +557,12 @@ class DefaultCreatorChannelHomeQueryRepository(
|
||||
|
||||
private fun com.querydsl.core.Tuple.toAudioRecord(
|
||||
firstContentId: Long?,
|
||||
seriesByContentId: Map<Long, AudioSeriesSummary>
|
||||
seriesByContentId: Map<Long, AudioSeriesSummary>,
|
||||
orderStatesByContentId: Map<Long, AudioOrderState>
|
||||
): CreatorChannelAudioContentRecord {
|
||||
val audioContentId = get(audioContent.id)!!
|
||||
val seriesSummary = seriesByContentId[audioContentId]
|
||||
val orderState = orderStatesByContentId[audioContentId]
|
||||
return CreatorChannelAudioContentRecord(
|
||||
audioContentId = audioContentId,
|
||||
title = get(audioContent.title)!!,
|
||||
@@ -567,11 +575,38 @@ class DefaultCreatorChannelHomeQueryRepository(
|
||||
publishedAt = get(audioContent.releaseDate)!!,
|
||||
seriesName = seriesSummary?.title,
|
||||
isOriginalSeries = seriesSummary?.isOriginal,
|
||||
isOwned = false,
|
||||
isRented = false
|
||||
isOwned = orderState?.isOwned ?: false,
|
||||
isRented = orderState?.isRented ?: false
|
||||
)
|
||||
}
|
||||
|
||||
private fun orderStatesByContentIds(
|
||||
viewerId: Long?,
|
||||
contentIds: List<Long>,
|
||||
now: LocalDateTime
|
||||
): Map<Long, AudioOrderState> {
|
||||
if (viewerId == null || contentIds.isEmpty()) return emptyMap()
|
||||
return queryFactory
|
||||
.select(order.audioContent.id, order.type)
|
||||
.from(order)
|
||||
.where(
|
||||
order.member.id.eq(viewerId),
|
||||
order.audioContent.id.`in`(contentIds),
|
||||
order.isActive.isTrue,
|
||||
order.type.eq(OrderType.KEEP)
|
||||
.or(order.type.eq(OrderType.RENTAL).and(order.endDate.after(now)))
|
||||
)
|
||||
.fetch()
|
||||
.groupBy { it.get(order.audioContent.id)!! }
|
||||
.mapValues { (_, rows) ->
|
||||
val types = rows.map { it.get(order.type)!! }.toSet()
|
||||
AudioOrderState(
|
||||
isOwned = OrderType.KEEP in types,
|
||||
isRented = OrderType.RENTAL in types
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
private fun audioSeriesByContentIds(contentIds: List<Long>): Map<Long, AudioSeriesSummary> {
|
||||
if (contentIds.isEmpty()) return emptyMap()
|
||||
return queryFactory
|
||||
@@ -912,6 +947,11 @@ class DefaultCreatorChannelHomeQueryRepository(
|
||||
val isOriginal: Boolean
|
||||
)
|
||||
|
||||
private data class AudioOrderState(
|
||||
val isOwned: Boolean,
|
||||
val isRented: Boolean
|
||||
)
|
||||
|
||||
private data class SeriesContentStats(
|
||||
val contentCount: Int,
|
||||
val latestPublishedAt: LocalDateTime
|
||||
|
||||
Reference in New Issue
Block a user