refactor(home-recommendation): 추천 배너 응답을 공통화한다
This commit is contained in:
@@ -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
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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,
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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?
|
||||||
|
)
|
||||||
@@ -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"))
|
||||||
|
|||||||
Reference in New Issue
Block a user