test #426

Merged
klaus merged 415 commits from test into main 2026-06-27 00:35:30 +00:00
20 changed files with 74 additions and 170 deletions
Showing only changes of commit f743d090c3 - Show all commits

View File

@@ -0,0 +1,44 @@
package kr.co.vividnext.sodalive.v2.api.creator.channel.common.dto
import com.fasterxml.jackson.annotation.JsonProperty
import kr.co.vividnext.sodalive.v2.creator.channel.common.domain.CreatorChannelAudioContent
data class CreatorChannelAudioContentResponse(
val audioContentId: Long,
val title: String,
val duration: String?,
val imageUrl: String?,
val price: Int,
@JsonProperty("isAdult")
val isAdult: Boolean,
@JsonProperty("isPointAvailable")
val isPointAvailable: Boolean,
@JsonProperty("isFirstContent")
val isFirstContent: Boolean,
val seriesName: String?,
@JsonProperty("isOriginalSeries")
val isOriginalSeries: Boolean?,
@JsonProperty("isOwned")
val isOwned: Boolean,
@JsonProperty("isRented")
val isRented: Boolean
) {
companion object {
fun from(audioContent: CreatorChannelAudioContent): CreatorChannelAudioContentResponse {
return CreatorChannelAudioContentResponse(
audioContentId = audioContent.audioContentId,
title = audioContent.title,
duration = audioContent.duration,
imageUrl = audioContent.imageUrl,
price = audioContent.price,
isAdult = audioContent.isAdult,
isPointAvailable = audioContent.isPointAvailable,
isFirstContent = audioContent.isFirstContent,
seriesName = audioContent.seriesName,
isOriginalSeries = audioContent.isOriginalSeries,
isOwned = audioContent.isOwned,
isRented = audioContent.isRented
)
}
}
}

View File

@@ -1,9 +1,9 @@
package kr.co.vividnext.sodalive.v2.api.creator.channel.home.dto package kr.co.vividnext.sodalive.v2.api.creator.channel.home.dto
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import kr.co.vividnext.sodalive.v2.api.creator.channel.common.dto.CreatorChannelAudioContentResponse
import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelActivity import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelActivity
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCommunityPost import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCommunityPost
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCreator import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCreator
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelDonation import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelDonation
@@ -108,46 +108,6 @@ data class CreatorChannelLiveResponse(
} }
} }
data class CreatorChannelAudioContentResponse(
val audioContentId: Long,
val title: String,
val duration: String?,
val imageUrl: String?,
val price: Int,
@JsonProperty("isAdult")
val isAdult: Boolean,
@JsonProperty("isPointAvailable")
val isPointAvailable: Boolean,
@JsonProperty("isFirstContent")
val isFirstContent: Boolean,
val seriesName: String?,
@JsonProperty("isOriginalSeries")
val isOriginalSeries: Boolean?,
@JsonProperty("isOwned")
val isOwned: Boolean,
@JsonProperty("isRented")
val isRented: Boolean
) {
companion object {
fun from(audioContent: CreatorChannelAudioContent): CreatorChannelAudioContentResponse {
return CreatorChannelAudioContentResponse(
audioContentId = audioContent.audioContentId,
title = audioContent.title,
duration = audioContent.duration,
imageUrl = audioContent.imageUrl,
price = audioContent.price,
isAdult = audioContent.isAdult,
isPointAvailable = audioContent.isPointAvailable,
isFirstContent = audioContent.isFirstContent,
seriesName = audioContent.seriesName,
isOriginalSeries = audioContent.isOriginalSeries,
isOwned = audioContent.isOwned,
isRented = audioContent.isRented
)
}
}
}
data class CreatorChannelDonationResponse( data class CreatorChannelDonationResponse(
val nickname: String, val nickname: String,
val profileImageUrl: String, val profileImageUrl: String,

View File

@@ -1,8 +1,8 @@
package kr.co.vividnext.sodalive.v2.api.creator.channel.live.dto package kr.co.vividnext.sodalive.v2.api.creator.channel.live.dto
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import kr.co.vividnext.sodalive.v2.api.creator.channel.common.dto.CreatorChannelAudioContentResponse
import kr.co.vividnext.sodalive.v2.common.domain.ContentSort import kr.co.vividnext.sodalive.v2.common.domain.ContentSort
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLive import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLive
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLiveTab import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLiveTab
import java.time.LocalDateTime import java.time.LocalDateTime
@@ -33,46 +33,6 @@ data class CreatorChannelLiveTabResponse(
} }
} }
data class CreatorChannelAudioContentResponse(
val audioContentId: Long,
val title: String,
val duration: String?,
val imageUrl: String?,
val price: Int,
@JsonProperty("isAdult")
val isAdult: Boolean,
@JsonProperty("isPointAvailable")
val isPointAvailable: Boolean,
@JsonProperty("isFirstContent")
val isFirstContent: Boolean,
val seriesName: String?,
@JsonProperty("isOriginalSeries")
val isOriginalSeries: Boolean?,
@JsonProperty("isOwned")
val isOwned: Boolean,
@JsonProperty("isRented")
val isRented: Boolean
) {
companion object {
fun from(content: CreatorChannelAudioContent): CreatorChannelAudioContentResponse {
return CreatorChannelAudioContentResponse(
audioContentId = content.audioContentId,
title = content.title,
duration = content.duration,
imageUrl = content.imageUrl,
price = content.price,
isAdult = content.isAdult,
isPointAvailable = content.isPointAvailable,
isFirstContent = content.isFirstContent,
seriesName = content.seriesName,
isOriginalSeries = content.isOriginalSeries,
isOwned = content.isOwned,
isRented = content.isRented
)
}
}
}
data class CreatorChannelLiveResponse( data class CreatorChannelLiveResponse(
val liveId: Long, val liveId: Long,
val title: String, val title: String,

View File

@@ -0,0 +1,16 @@
package kr.co.vividnext.sodalive.v2.creator.channel.common.domain
data class CreatorChannelAudioContent(
val audioContentId: Long,
val title: String,
val duration: String?,
val imageUrl: String?,
val price: Int,
val isAdult: Boolean,
val isPointAvailable: Boolean,
val isFirstContent: Boolean,
val seriesName: String?,
val isOriginalSeries: Boolean?,
val isOwned: Boolean,
val isRented: Boolean
)

View File

@@ -572,7 +572,6 @@ class DefaultCreatorChannelHomeQueryRepository(
isAdult = get(audioContent.isAdult)!!, isAdult = get(audioContent.isAdult)!!,
isPointAvailable = get(audioContent.isPointAvailable)!!, isPointAvailable = get(audioContent.isPointAvailable)!!,
isFirstContent = firstContentId == audioContentId, isFirstContent = firstContentId == audioContentId,
publishedAt = get(audioContent.releaseDate)!!,
seriesName = seriesSummary?.title, seriesName = seriesSummary?.title,
isOriginalSeries = seriesSummary?.isOriginal, isOriginalSeries = seriesSummary?.isOriginal,
isOwned = orderState?.isOwned ?: false, isOwned = orderState?.isOwned ?: false,

View File

@@ -8,8 +8,8 @@ import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
import kr.co.vividnext.sodalive.member.contentpreference.isAdultVisibleByPolicy import kr.co.vividnext.sodalive.member.contentpreference.isAdultVisibleByPolicy
import kr.co.vividnext.sodalive.v2.creator.channel.common.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelActivity import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelActivity
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCommunityPost import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCommunityPost
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCreator import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCreator
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelDonation import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelDonation
@@ -178,7 +178,6 @@ class CreatorChannelHomeQueryService(
isAdult = isAdult, isAdult = isAdult,
isPointAvailable = isPointAvailable, isPointAvailable = isPointAvailable,
isFirstContent = isFirstContent, isFirstContent = isFirstContent,
publishedAt = publishedAt,
seriesName = seriesName, seriesName = seriesName,
isOriginalSeries = isOriginalSeries, isOriginalSeries = isOriginalSeries,
isOwned = isOwned, isOwned = isOwned,

View File

@@ -1,6 +1,7 @@
package kr.co.vividnext.sodalive.v2.creator.channel.home.domain package kr.co.vividnext.sodalive.v2.creator.channel.home.domain
import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import kr.co.vividnext.sodalive.v2.creator.channel.common.domain.CreatorChannelAudioContent
import java.time.LocalDateTime import java.time.LocalDateTime
data class CreatorChannelHome( data class CreatorChannelHome(
@@ -40,22 +41,6 @@ data class CreatorChannelLive(
val isAdult: Boolean val isAdult: Boolean
) )
data class CreatorChannelAudioContent(
val audioContentId: Long,
val title: String,
val duration: String?,
val imageUrl: String?,
val price: Int,
val isAdult: Boolean,
val isPointAvailable: Boolean,
val isFirstContent: Boolean,
val publishedAt: LocalDateTime,
val seriesName: String?,
val isOriginalSeries: Boolean?,
val isOwned: Boolean,
val isRented: Boolean
)
data class CreatorChannelDonation( data class CreatorChannelDonation(
val nickname: String, val nickname: String,
val profileImageUrl: String, val profileImageUrl: String,

View File

@@ -1,6 +1,7 @@
package kr.co.vividnext.sodalive.v2.creator.channel.home.domain package kr.co.vividnext.sodalive.v2.creator.channel.home.domain
import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import kr.co.vividnext.sodalive.v2.creator.channel.common.domain.CreatorChannelAudioContent
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import java.time.LocalDateTime import java.time.LocalDateTime
@@ -25,16 +26,6 @@ class CreatorChannelHomeQueryPolicy {
return audioContents.filter { it.audioContentId != latestAudioContentId } return audioContents.filter { it.audioContentId != latestAudioContentId }
} }
fun markFirstAudioContent(audioContents: List<CreatorChannelAudioContent>): List<CreatorChannelAudioContent> {
val firstAudioContentId = audioContents
.minWithOrNull(compareBy<CreatorChannelAudioContent> { it.publishedAt }.thenBy { it.audioContentId })
?.audioContentId
return audioContents.map { audioContent ->
audioContent.copy(isFirstContent = audioContent.audioContentId == firstAudioContentId)
}
}
private fun CreatorActivityType.scheduleOrder(): Int { private fun CreatorActivityType.scheduleOrder(): Int {
return if (this == CreatorActivityType.LIVE) 0 else 1 return if (this == CreatorActivityType.LIVE) 0 else 1
} }

View File

@@ -109,7 +109,6 @@ data class CreatorChannelAudioContentRecord(
val isAdult: Boolean, val isAdult: Boolean,
val isPointAvailable: Boolean, val isPointAvailable: Boolean,
val isFirstContent: Boolean, val isFirstContent: Boolean,
val publishedAt: LocalDateTime,
val seriesName: String?, val seriesName: String?,
val isOriginalSeries: Boolean?, val isOriginalSeries: Boolean?,
val isOwned: Boolean, val isOwned: Boolean,

View File

@@ -261,7 +261,6 @@ class DefaultCreatorChannelLiveQueryRepository(
isAdult = get(audioContent.isAdult)!!, isAdult = get(audioContent.isAdult)!!,
isPointAvailable = get(audioContent.isPointAvailable)!!, isPointAvailable = get(audioContent.isPointAvailable)!!,
isFirstContent = firstContentId == audioContentId, isFirstContent = firstContentId == audioContentId,
publishedAt = get(audioContent.releaseDate)!!,
seriesName = seriesSummary?.title, seriesName = seriesSummary?.title,
isOriginalSeries = seriesSummary?.isOriginal, isOriginalSeries = seriesSummary?.isOriginal,
isOwned = orderState?.isOwned ?: false, isOwned = orderState?.isOwned ?: false,

View File

@@ -9,7 +9,7 @@ import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
import kr.co.vividnext.sodalive.member.contentpreference.isAdultVisibleByPolicy import kr.co.vividnext.sodalive.member.contentpreference.isAdultVisibleByPolicy
import kr.co.vividnext.sodalive.v2.common.domain.ContentSort import kr.co.vividnext.sodalive.v2.common.domain.ContentSort
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelAudioContent import kr.co.vividnext.sodalive.v2.creator.channel.common.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLive import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLive
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLiveReplayQueryPolicy import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLiveReplayQueryPolicy
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLiveTab import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLiveTab
@@ -122,7 +122,6 @@ class CreatorChannelLiveQueryService(
isAdult = isAdult, isAdult = isAdult,
isPointAvailable = isPointAvailable, isPointAvailable = isPointAvailable,
isFirstContent = isFirstContent, isFirstContent = isFirstContent,
publishedAt = publishedAt,
seriesName = seriesName, seriesName = seriesName,
isOriginalSeries = isOriginalSeries, isOriginalSeries = isOriginalSeries,
isOwned = isOwned, isOwned = isOwned,

View File

@@ -1,6 +1,7 @@
package kr.co.vividnext.sodalive.v2.creator.channel.live.domain package kr.co.vividnext.sodalive.v2.creator.channel.live.domain
import kr.co.vividnext.sodalive.v2.common.domain.ContentSort import kr.co.vividnext.sodalive.v2.common.domain.ContentSort
import kr.co.vividnext.sodalive.v2.creator.channel.common.domain.CreatorChannelAudioContent
import java.time.LocalDateTime import java.time.LocalDateTime
data class CreatorChannelLiveTab( data class CreatorChannelLiveTab(
@@ -20,19 +21,3 @@ data class CreatorChannelLive(
val price: Int, val price: Int,
val isAdult: Boolean val isAdult: Boolean
) )
data class CreatorChannelAudioContent(
val audioContentId: Long,
val title: String,
val duration: String?,
val imageUrl: String?,
val price: Int,
val isAdult: Boolean,
val isPointAvailable: Boolean,
val isFirstContent: Boolean,
val publishedAt: LocalDateTime,
val seriesName: String?,
val isOriginalSeries: Boolean?,
val isOwned: Boolean,
val isRented: Boolean
)

View File

@@ -60,7 +60,6 @@ data class CreatorChannelAudioContentRecord(
val isAdult: Boolean, val isAdult: Boolean,
val isPointAvailable: Boolean, val isPointAvailable: Boolean,
val isFirstContent: Boolean, val isFirstContent: Boolean,
val publishedAt: LocalDateTime,
val seriesName: String?, val seriesName: String?,
val isOriginalSeries: Boolean?, val isOriginalSeries: Boolean?,
val isOwned: Boolean, val isOwned: Boolean,

View File

@@ -9,8 +9,8 @@ import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.v2.api.creator.channel.home.application.CreatorChannelHomeFacade import kr.co.vividnext.sodalive.v2.api.creator.channel.home.application.CreatorChannelHomeFacade
import kr.co.vividnext.sodalive.v2.api.creator.channel.home.dto.CreatorChannelHomeResponse import kr.co.vividnext.sodalive.v2.api.creator.channel.home.dto.CreatorChannelHomeResponse
import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import kr.co.vividnext.sodalive.v2.creator.channel.common.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelActivity import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelActivity
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCommunityPost import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCommunityPost
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCreator import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCreator
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelDonation import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelDonation
@@ -198,7 +198,6 @@ class CreatorChannelHomeControllerTest @Autowired constructor(
isAdult = true, isAdult = true,
isPointAvailable = true, isPointAvailable = true,
isFirstContent = true, isFirstContent = true,
publishedAt = LocalDateTime.of(2026, 6, 11, 1, 0),
seriesName = "series", seriesName = "series",
isOriginalSeries = true, isOriginalSeries = true,
isOwned = true, isOwned = true,
@@ -233,7 +232,6 @@ class CreatorChannelHomeControllerTest @Autowired constructor(
isAdult = false, isAdult = false,
isPointAvailable = false, isPointAvailable = false,
isFirstContent = false, isFirstContent = false,
publishedAt = LocalDateTime.of(2026, 6, 10, 1, 0),
seriesName = null, seriesName = null,
isOriginalSeries = null, isOriginalSeries = null,
isOwned = false, isOwned = false,

View File

@@ -3,9 +3,9 @@ package kr.co.vividnext.sodalive.v2.api.creator.channel.home.application
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import kr.co.vividnext.sodalive.v2.creator.channel.common.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.home.application.CreatorChannelHomeQueryService import kr.co.vividnext.sodalive.v2.creator.channel.home.application.CreatorChannelHomeQueryService
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelActivity import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelActivity
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCommunityPost import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCommunityPost
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCreator import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCreator
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelDonation import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelDonation
@@ -128,7 +128,6 @@ class CreatorChannelHomeFacadeTest {
isAdult = true, isAdult = true,
isPointAvailable = true, isPointAvailable = true,
isFirstContent = true, isFirstContent = true,
publishedAt = LocalDateTime.of(2026, 6, 11, 1, 0),
seriesName = "series", seriesName = "series",
isOriginalSeries = true, isOriginalSeries = true,
isOwned = true, isOwned = true,
@@ -163,7 +162,6 @@ class CreatorChannelHomeFacadeTest {
isAdult = false, isAdult = false,
isPointAvailable = false, isPointAvailable = false,
isFirstContent = false, isFirstContent = false,
publishedAt = LocalDateTime.of(2026, 6, 10, 1, 0),
seriesName = null, seriesName = null,
isOriginalSeries = null, isOriginalSeries = null,
isOwned = false, isOwned = false,

View File

@@ -6,8 +6,8 @@ import kr.co.vividnext.sodalive.i18n.SodaMessageSource
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberAdapter import kr.co.vividnext.sodalive.member.MemberAdapter
import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.v2.api.creator.channel.common.dto.CreatorChannelAudioContentResponse
import kr.co.vividnext.sodalive.v2.api.creator.channel.live.application.CreatorChannelLiveFacade import kr.co.vividnext.sodalive.v2.api.creator.channel.live.application.CreatorChannelLiveFacade
import kr.co.vividnext.sodalive.v2.api.creator.channel.live.dto.CreatorChannelAudioContentResponse
import kr.co.vividnext.sodalive.v2.api.creator.channel.live.dto.CreatorChannelLiveResponse import kr.co.vividnext.sodalive.v2.api.creator.channel.live.dto.CreatorChannelLiveResponse
import kr.co.vividnext.sodalive.v2.api.creator.channel.live.dto.CreatorChannelLiveTabResponse import kr.co.vividnext.sodalive.v2.api.creator.channel.live.dto.CreatorChannelLiveTabResponse
import kr.co.vividnext.sodalive.v2.common.domain.ContentSort import kr.co.vividnext.sodalive.v2.common.domain.ContentSort

View File

@@ -3,8 +3,8 @@ package kr.co.vividnext.sodalive.v2.api.creator.channel.live.application
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.MemberRole
import kr.co.vividnext.sodalive.v2.common.domain.ContentSort import kr.co.vividnext.sodalive.v2.common.domain.ContentSort
import kr.co.vividnext.sodalive.v2.creator.channel.common.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.live.application.CreatorChannelLiveQueryService import kr.co.vividnext.sodalive.v2.creator.channel.live.application.CreatorChannelLiveQueryService
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLive import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLive
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLiveTab import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelLiveTab
import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelPage import kr.co.vividnext.sodalive.v2.creator.channel.live.domain.CreatorChannelPage
@@ -86,7 +86,6 @@ class CreatorChannelLiveFacadeTest {
isAdult = false, isAdult = false,
isPointAvailable = true, isPointAvailable = true,
isFirstContent = true, isFirstContent = true,
publishedAt = LocalDateTime.of(2026, 6, 16, 1, 0),
seriesName = "series", seriesName = "series",
isOriginalSeries = true, isOriginalSeries = true,
isOwned = true, isOwned = true,

View File

@@ -15,8 +15,8 @@ import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreference
import kr.co.vividnext.sodalive.member.contentpreference.ViewerContentPreference import kr.co.vividnext.sodalive.member.contentpreference.ViewerContentPreference
import kr.co.vividnext.sodalive.v2.api.creator.channel.home.dto.CreatorChannelHomeResponse import kr.co.vividnext.sodalive.v2.api.creator.channel.home.dto.CreatorChannelHomeResponse
import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import kr.co.vividnext.sodalive.v2.creator.channel.common.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelActivity import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelActivity
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelAudioContent
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCommunityPost import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCommunityPost
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCreator import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelCreator
import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelDonation import kr.co.vividnext.sodalive.v2.creator.channel.home.domain.CreatorChannelDonation
@@ -307,7 +307,6 @@ class CreatorChannelHomeQueryServiceTest {
isAdult = true, isAdult = true,
isPointAvailable = true, isPointAvailable = true,
isFirstContent = true, isFirstContent = true,
publishedAt = LocalDateTime.of(2026, 6, 11, 1, 0),
seriesName = "series", seriesName = "series",
isOriginalSeries = true, isOriginalSeries = true,
isOwned = true, isOwned = true,
@@ -342,7 +341,6 @@ class CreatorChannelHomeQueryServiceTest {
isAdult = false, isAdult = false,
isPointAvailable = false, isPointAvailable = false,
isFirstContent = false, isFirstContent = false,
publishedAt = LocalDateTime.of(2026, 6, 10, 1, 0),
seriesName = null, seriesName = null,
isOriginalSeries = null, isOriginalSeries = null,
isOwned = false, isOwned = false,
@@ -646,7 +644,6 @@ private class FakeCreatorChannelHomeQueryPort : CreatorChannelHomeQueryPort {
isAdult = false, isAdult = false,
isPointAvailable = true, isPointAvailable = true,
isFirstContent = false, isFirstContent = false,
publishedAt = LocalDateTime.of(2026, 6, 10, 0, audioContentId.toInt() % 60),
seriesName = null, seriesName = null,
isOriginalSeries = null, isOriginalSeries = null,
isOwned = audioContentId == 201L || audioContentId == 202L, isOwned = audioContentId == 201L || audioContentId == 202L,

View File

@@ -1,9 +1,8 @@
package kr.co.vividnext.sodalive.v2.creator.channel.home.domain package kr.co.vividnext.sodalive.v2.creator.channel.home.domain
import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
import kr.co.vividnext.sodalive.v2.creator.channel.common.domain.CreatorChannelAudioContent
import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.Assertions.assertEquals
import org.junit.jupiter.api.Assertions.assertFalse
import org.junit.jupiter.api.Assertions.assertTrue
import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.DisplayName
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
import java.time.LocalDateTime import java.time.LocalDateTime
@@ -80,23 +79,6 @@ class CreatorChannelHomeQueryPolicyTest {
assertEquals(listOf(1L, 3L), filtered.map { it.audioContentId }) assertEquals(listOf(1L, 3L), filtered.map { it.audioContentId })
} }
@Test
@DisplayName("오디오 콘텐츠의 첫 공개 콘텐츠 여부는 공개 시각 오름차순, 동일 시각이면 id 오름차순으로 판정한다")
fun shouldMarkFirstAudioContentByPublishedAtAndId() {
val publishedAt = LocalDateTime.of(2026, 6, 12, 10, 0)
val audioContents = listOf(
audioContent(3L, publishedAt = publishedAt.plusDays(1)),
audioContent(2L, publishedAt = publishedAt),
audioContent(1L, publishedAt = publishedAt)
)
val marked = policy.markFirstAudioContent(audioContents)
assertTrue(marked.first { it.audioContentId == 1L }.isFirstContent)
assertFalse(marked.first { it.audioContentId == 2L }.isFirstContent)
assertFalse(marked.first { it.audioContentId == 3L }.isFirstContent)
}
private fun schedule( private fun schedule(
targetId: Long, targetId: Long,
scheduledAt: LocalDateTime, scheduledAt: LocalDateTime,
@@ -112,10 +94,7 @@ class CreatorChannelHomeQueryPolicyTest {
) )
} }
private fun audioContent( private fun audioContent(audioContentId: Long): CreatorChannelAudioContent {
audioContentId: Long,
publishedAt: LocalDateTime = LocalDateTime.of(2026, 6, 12, 10, 0)
): CreatorChannelAudioContent {
return CreatorChannelAudioContent( return CreatorChannelAudioContent(
audioContentId = audioContentId, audioContentId = audioContentId,
title = "audio-$audioContentId", title = "audio-$audioContentId",
@@ -125,7 +104,6 @@ class CreatorChannelHomeQueryPolicyTest {
isAdult = false, isAdult = false,
isPointAvailable = false, isPointAvailable = false,
isFirstContent = false, isFirstContent = false,
publishedAt = publishedAt,
seriesName = null, seriesName = null,
isOriginalSeries = null, isOriginalSeries = null,
isOwned = false, isOwned = false,

View File

@@ -388,7 +388,6 @@ private fun audioContentRecord(audioContentId: Long): CreatorChannelAudioContent
isAdult = false, isAdult = false,
isPointAvailable = true, isPointAvailable = true,
isFirstContent = audioContentId == 1L, isFirstContent = audioContentId == 1L,
publishedAt = LocalDateTime.of(2026, 6, 16, 10, 0),
seriesName = "series", seriesName = "series",
isOriginalSeries = true, isOriginalSeries = true,
isOwned = audioContentId == 1L, isOwned = audioContentId == 1L,