feat(content): 콘텐츠 전체보기 facade를 추가한다
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
package kr.co.vividnext.sodalive.v2.api.content.overview.application
|
||||
|
||||
import kr.co.vividnext.sodalive.member.Member
|
||||
import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
|
||||
import kr.co.vividnext.sodalive.v2.api.content.overview.dto.ContentOverviewItemResponse
|
||||
import kr.co.vividnext.sodalive.v2.api.content.overview.dto.ContentOverviewPageResponse
|
||||
import kr.co.vividnext.sodalive.v2.api.content.overview.dto.ContentOverviewType
|
||||
import kr.co.vividnext.sodalive.v2.common.domain.toCdnUrl
|
||||
import kr.co.vividnext.sodalive.v2.content.recommendation.application.AudioRecommendationQueryService
|
||||
import kr.co.vividnext.sodalive.v2.recommendation.application.HomeRecommendationQueryService
|
||||
import org.springframework.beans.factory.annotation.Value
|
||||
import org.springframework.stereotype.Component
|
||||
import java.time.LocalDateTime
|
||||
|
||||
@Component
|
||||
class ContentOverviewFacade(
|
||||
private val audioRecommendationQueryService: AudioRecommendationQueryService,
|
||||
private val homeRecommendationQueryService: HomeRecommendationQueryService,
|
||||
private val memberContentPreferenceService: MemberContentPreferenceService,
|
||||
@Value("\${cloud.aws.cloud-front.host}")
|
||||
private val cloudFrontHost: String,
|
||||
private val queryPolicy: ContentOverviewQueryPolicy = ContentOverviewQueryPolicy()
|
||||
) {
|
||||
fun getContents(type: String?, page: Int?, size: Int?, member: Member): ContentOverviewPageResponse {
|
||||
val resolvedType = queryPolicy.resolveType(type)
|
||||
val resolvedPage = queryPolicy.createPage(page, size)
|
||||
|
||||
return when (resolvedType) {
|
||||
ContentOverviewType.NEW_AND_HOT_AUDIO -> getNewAndHotContents(member, resolvedPage)
|
||||
ContentOverviewType.FIRST_AUDIO_CONTENT -> getFirstAudioContents(member, resolvedPage)
|
||||
}
|
||||
}
|
||||
|
||||
private fun getNewAndHotContents(member: Member, page: ContentOverviewPage): ContentOverviewPageResponse {
|
||||
val fetched = audioRecommendationQueryService.findNewAndHotAudios(
|
||||
member = member,
|
||||
offset = page.offset,
|
||||
limit = page.size + 1
|
||||
)
|
||||
return ContentOverviewPageResponse(
|
||||
type = ContentOverviewType.NEW_AND_HOT_AUDIO,
|
||||
items = queryPolicy.pageItems(fetched, page).map { ContentOverviewItemResponse.fromNewAndHot(it) },
|
||||
page = page.page,
|
||||
size = page.size,
|
||||
hasNext = queryPolicy.hasNext(fetched, page)
|
||||
)
|
||||
}
|
||||
|
||||
private fun getFirstAudioContents(member: Member, page: ContentOverviewPage): ContentOverviewPageResponse {
|
||||
val fetched = homeRecommendationQueryService.findFirstAudioContents(
|
||||
now = LocalDateTime.now(),
|
||||
offset = page.offset,
|
||||
limit = page.size + 1,
|
||||
memberId = member.id,
|
||||
includeAdultContents = memberContentPreferenceService.canViewAdultContent(member)
|
||||
)
|
||||
return ContentOverviewPageResponse(
|
||||
type = ContentOverviewType.FIRST_AUDIO_CONTENT,
|
||||
items = queryPolicy.pageItems(fetched, page).map {
|
||||
ContentOverviewItemResponse.fromFirstAudioContent(
|
||||
audio = it,
|
||||
coverImage = it.coverImage.toCdnUrl(cloudFrontHost),
|
||||
isAdult = it.isAdult,
|
||||
isOriginalSeries = it.isOriginalSeries
|
||||
)
|
||||
},
|
||||
page = page.page,
|
||||
size = page.size,
|
||||
hasNext = queryPolicy.hasNext(fetched, page)
|
||||
)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user