test #426

Merged
klaus merged 415 commits from test into main 2026-06-27 00:35:30 +00:00
5 changed files with 58 additions and 14 deletions
Showing only changes of commit d387030a38 - Show all commits

View File

@@ -0,0 +1,24 @@
package kr.co.vividnext.sodalive.v2.api.common.dto
import kr.co.vividnext.sodalive.event.EventItem
import kr.co.vividnext.sodalive.v2.common.domain.RecommendationBanner
data class RecommendationBannerResponse(
val imageUrl: String,
val eventItem: EventItem?,
val creatorId: Long?,
val seriesId: Long?,
val link: String?
) {
companion object {
fun from(banner: RecommendationBanner): RecommendationBannerResponse {
return RecommendationBannerResponse(
imageUrl = banner.imageUrl,
eventItem = banner.eventItem,
creatorId = banner.creatorId,
seriesId = banner.seriesId,
link = banner.link
)
}
}
}

View File

@@ -4,9 +4,9 @@ import kr.co.vividnext.sodalive.event.EventItem
import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.Member
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.api.common.dto.RecommendationBannerResponse
import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeActiveCreatorItem import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeActiveCreatorItem
import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeAiCharacterItem import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeAiCharacterItem
import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeBannerItem
import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeCreatorItem import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeCreatorItem
import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeFirstAudioContentItem import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeFirstAudioContentItem
import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeGenreCreatorGroupItem import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeGenreCreatorGroupItem
@@ -17,6 +17,7 @@ import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.HomeRecommendatio
import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.imageUrl import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.imageUrl
import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.profileImageUrl import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.profileImageUrl
import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.toUtcIso import kr.co.vividnext.sodalive.v2.api.home.dto.recommendation.toUtcIso
import kr.co.vividnext.sodalive.v2.common.domain.RecommendationBanner
import kr.co.vividnext.sodalive.v2.recommendation.application.HomeRecommendationQueryService import kr.co.vividnext.sodalive.v2.recommendation.application.HomeRecommendationQueryService
import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeAiCharacterRecommendationRecord import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeAiCharacterRecommendationRecord
import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeBannerRecommendationRecord import kr.co.vividnext.sodalive.v2.recommendation.port.out.HomeBannerRecommendationRecord
@@ -53,7 +54,8 @@ class HomeRecommendationFacade(
memberId = member?.id, memberId = member?.id,
includeAdultLives = includeAdult includeAdultLives = includeAdult
).map { it.toItem() }, ).map { it.toItem() },
banners = queryService.findHomeBanners(HOME_BANNER_LIMIT, member?.id).map { it.toItem() }, banners = queryService.findHomeBanners(HOME_BANNER_LIMIT, member?.id)
.map { RecommendationBannerResponse.from(it.toBanner()) },
recentlyActiveCreators = queryService.findRecentlyActiveCreators( recentlyActiveCreators = queryService.findRecentlyActiveCreators(
HOME_ACTIVE_CREATOR_LIMIT, HOME_ACTIVE_CREATOR_LIMIT,
member?.id, member?.id,
@@ -235,7 +237,7 @@ class HomeRecommendationFacade(
creatorProfileImage = profileImageUrl(cloudFrontHost, creatorProfileImage) creatorProfileImage = profileImageUrl(cloudFrontHost, creatorProfileImage)
) )
private fun HomeBannerRecommendationRecord.toItem() = HomeBannerItem( private fun HomeBannerRecommendationRecord.toBanner() = RecommendationBanner(
imageUrl = imageUrl(cloudFrontHost, thumbnailImage) ?: "", imageUrl = imageUrl(cloudFrontHost, thumbnailImage) ?: "",
eventItem = eventItem(), eventItem = eventItem(),
creatorId = creatorId, creatorId = creatorId,

View File

@@ -1,7 +1,7 @@
package kr.co.vividnext.sodalive.v2.api.home.dto.recommendation package kr.co.vividnext.sodalive.v2.api.home.dto.recommendation
import com.fasterxml.jackson.annotation.JsonProperty import com.fasterxml.jackson.annotation.JsonProperty
import kr.co.vividnext.sodalive.event.EventItem import kr.co.vividnext.sodalive.v2.api.common.dto.RecommendationBannerResponse
import java.time.LocalDateTime import java.time.LocalDateTime
import java.time.ZoneOffset import java.time.ZoneOffset
@@ -19,7 +19,7 @@ internal fun profileImageUrl(cloudFrontHost: String, path: String?): String {
data class HomeRecommendationResponse( data class HomeRecommendationResponse(
val lives: List<HomeLiveItem>, val lives: List<HomeLiveItem>,
val banners: List<HomeBannerItem>, val banners: List<RecommendationBannerResponse>,
val recentlyActiveCreators: List<HomeActiveCreatorItem>, val recentlyActiveCreators: List<HomeActiveCreatorItem>,
val recentDebutCreators: List<HomeCreatorItem>, val recentDebutCreators: List<HomeCreatorItem>,
val firstAudioContents: List<HomeFirstAudioContentItem>, val firstAudioContents: List<HomeFirstAudioContentItem>,
@@ -35,14 +35,6 @@ data class HomeLiveItem(
val creatorProfileImage: String val creatorProfileImage: String
) )
data class HomeBannerItem(
val imageUrl: String,
val eventItem: EventItem?,
val creatorId: Long?,
val seriesId: Long?,
val link: String?
)
data class HomeActiveCreatorItem( data class HomeActiveCreatorItem(
val creatorNickname: String, val creatorNickname: String,
val creatorProfileImage: String, val creatorProfileImage: String,

View File

@@ -0,0 +1,11 @@
package kr.co.vividnext.sodalive.v2.common.domain
import kr.co.vividnext.sodalive.event.EventItem
data class RecommendationBanner(
val imageUrl: String,
val eventItem: EventItem?,
val creatorId: Long?,
val seriesId: Long?,
val link: String?
)

View File

@@ -1,6 +1,7 @@
package kr.co.vividnext.sodalive.v2.api.home.dto.recommendation package kr.co.vividnext.sodalive.v2.api.home.dto.recommendation
import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper import com.fasterxml.jackson.module.kotlin.jacksonObjectMapper
import kr.co.vividnext.sodalive.v2.api.common.dto.RecommendationBannerResponse
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.assertFalse
import org.junit.jupiter.api.Test import org.junit.jupiter.api.Test
@@ -12,7 +13,15 @@ class HomeRecommendationResponseTest {
fun shouldSerializeNewHomeRecommendationFields() { fun shouldSerializeNewHomeRecommendationFields() {
val response = HomeRecommendationResponse( val response = HomeRecommendationResponse(
lives = emptyList(), lives = emptyList(),
banners = emptyList(), banners = listOf(
RecommendationBannerResponse(
imageUrl = "https://cdn.test/banner.png",
eventItem = null,
creatorId = 11L,
seriesId = 12L,
link = "https://banner.test"
)
),
recentlyActiveCreators = emptyList(), recentlyActiveCreators = emptyList(),
recentDebutCreators = emptyList(), recentDebutCreators = emptyList(),
firstAudioContents = listOf( firstAudioContents = listOf(
@@ -83,6 +92,12 @@ class HomeRecommendationResponseTest {
val json = objectMapper.readTree(objectMapper.writeValueAsString(response)) val json = objectMapper.readTree(objectMapper.writeValueAsString(response))
assertEquals("https://cdn.test/banner.png", json["banners"][0]["imageUrl"].asText())
assertEquals(true, json["banners"][0]["eventItem"].isNull)
assertEquals(11L, json["banners"][0]["creatorId"].asLong())
assertEquals(12L, json["banners"][0]["seriesId"].asLong())
assertEquals("https://banner.test", json["banners"][0]["link"].asText())
assertEquals(5, json["banners"][0].size())
assertEquals(9, json["firstAudioContents"][0]["price"].asInt()) assertEquals(9, json["firstAudioContents"][0]["price"].asInt())
assertEquals(true, json["firstAudioContents"][0]["isPointAvailable"].asBoolean()) assertEquals(true, json["firstAudioContents"][0]["isPointAvailable"].asBoolean())
assertFalse(json["firstAudioContents"][0].has("pointAvailable")) assertFalse(json["firstAudioContents"][0].has("pointAvailable"))