feat(recommendation): 추천 배너 언어 필터를 적용한다
This commit is contained in:
+2
-2
@@ -5,8 +5,8 @@ import kr.co.vividnext.sodalive.member.Member
|
||||
private val FORCED_KR_MEMBER_IDS = setOf(16L, 17L, 17958L, 44144L)
|
||||
private val FORCED_JP_MEMBER_IDS = setOf(2L, 29721L, 32050L, 37543L, 40850L)
|
||||
|
||||
fun resolveCountryCodeWithForcedMapping(member: Member, requestCountryCode: String?): String {
|
||||
val memberId = member.id
|
||||
fun resolveCountryCodeWithForcedMapping(member: Member?, requestCountryCode: String?): String {
|
||||
val memberId = member?.id
|
||||
if (memberId != null && FORCED_KR_MEMBER_IDS.contains(memberId)) {
|
||||
return "KR"
|
||||
}
|
||||
|
||||
+2
-2
@@ -157,8 +157,8 @@ class MemberContentPreferenceService(
|
||||
return getStoredPreference(member).isAdult
|
||||
}
|
||||
|
||||
fun resolveCountryCode(member: Member): String {
|
||||
requireMemberId(member)
|
||||
fun resolveCountryCode(member: Member?): String {
|
||||
if (member != null) requireMemberId(member)
|
||||
return resolveCountryCodeWithForcedMapping(member, countryContext.countryCode)
|
||||
}
|
||||
|
||||
|
||||
+4
-1
@@ -1,6 +1,7 @@
|
||||
package kr.co.vividnext.sodalive.v2.api.home.application
|
||||
|
||||
import kr.co.vividnext.sodalive.event.EventItem
|
||||
import kr.co.vividnext.sodalive.i18n.Lang
|
||||
import kr.co.vividnext.sodalive.member.Member
|
||||
import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
|
||||
import kr.co.vividnext.sodalive.v2.api.common.dto.RecommendationBannerResponse
|
||||
@@ -46,6 +47,7 @@ class HomeRecommendationFacade(
|
||||
return runCatching {
|
||||
val now = LocalDateTime.now()
|
||||
val includeAdult = resolveAdultVisibility(member)
|
||||
val bannerLang = if (memberContentPreferenceService.resolveCountryCode(member) == "JP") Lang.JA else Lang.KO
|
||||
|
||||
HomeRecommendationResponse(
|
||||
lives = queryService.findLiveRecommendations(
|
||||
@@ -56,7 +58,8 @@ class HomeRecommendationFacade(
|
||||
banners = queryService.findHomeBanners(
|
||||
limit = HOME_BANNER_LIMIT,
|
||||
memberId = member?.id,
|
||||
includeAdultBanners = includeAdult
|
||||
includeAdultBanners = includeAdult,
|
||||
lang = bannerLang
|
||||
)
|
||||
.map { RecommendationBannerResponse.from(it.toBanner()) },
|
||||
recentlyActiveCreators = queryService.findRecentlyActiveCreators(
|
||||
|
||||
+8
-1
@@ -15,6 +15,7 @@ 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.event.EventItem
|
||||
import kr.co.vividnext.sodalive.event.QEvent.event
|
||||
import kr.co.vividnext.sodalive.i18n.Lang
|
||||
import kr.co.vividnext.sodalive.member.QMember
|
||||
import kr.co.vividnext.sodalive.member.QMember.member
|
||||
import kr.co.vividnext.sodalive.member.block.QBlockMember
|
||||
@@ -40,7 +41,12 @@ class DefaultAudioRecommendationQueryRepository(
|
||||
@Value("\${cloud.aws.cloud-front.host}")
|
||||
private val cloudFrontHost: String
|
||||
) : AudioRecommendationQueryRepository {
|
||||
override fun findBanners(limit: Int, memberId: Long?, canViewAdultContent: Boolean): List<RecommendationBanner> {
|
||||
override fun findBanners(
|
||||
limit: Int,
|
||||
memberId: Long?,
|
||||
canViewAdultContent: Boolean,
|
||||
lang: Lang
|
||||
): List<RecommendationBanner> {
|
||||
val bannerCreator = QMember("audioRecommendationBannerCreator")
|
||||
val seriesOwner = QMember("audioRecommendationSeriesOwner")
|
||||
val randomTieBreaker = Expressions.numberTemplate(Double::class.java, "function('rand')")
|
||||
@@ -64,6 +70,7 @@ class DefaultAudioRecommendationQueryRepository(
|
||||
.where(
|
||||
audioContentBanner.isActive.isTrue,
|
||||
audioContentBanner.tab.id.eq(2L),
|
||||
audioContentBanner.lang.eq(lang),
|
||||
adultBannerCondition(canViewAdultContent),
|
||||
activeBannerTargetCondition(memberId, bannerCreator, seriesOwner)
|
||||
)
|
||||
|
||||
+3
-1
@@ -1,5 +1,6 @@
|
||||
package kr.co.vividnext.sodalive.v2.content.recommendation.application
|
||||
|
||||
import kr.co.vividnext.sodalive.i18n.Lang
|
||||
import kr.co.vividnext.sodalive.member.Member
|
||||
import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService
|
||||
import kr.co.vividnext.sodalive.v2.content.recommendation.domain.AudioCard
|
||||
@@ -24,6 +25,7 @@ class AudioRecommendationQueryService(
|
||||
val canViewAdultContent = canViewAdultContent(member)
|
||||
val visibility = if (canViewAdultContent) AudioRecommendationVisibility.ALL else AudioRecommendationVisibility.SAFE
|
||||
val memberId = member?.id
|
||||
val bannerLang = if (memberContentPreferenceService.resolveCountryCode(member) == "JP") Lang.JA else Lang.KO
|
||||
val newAndHotSectionType = newAndHotSectionType(visibility)
|
||||
val mostCommentedSectionType = mostCommentedSectionType(visibility)
|
||||
val recommendedAudioSectionType = recommendedAudioSectionType(visibility)
|
||||
@@ -44,7 +46,7 @@ class AudioRecommendationQueryService(
|
||||
)
|
||||
|
||||
return AudioRecommendations(
|
||||
banners = queryPort.findBanners(BANNER_LIMIT, memberId, canViewAdultContent),
|
||||
banners = queryPort.findBanners(BANNER_LIMIT, memberId, canViewAdultContent, bannerLang),
|
||||
originalSeries = queryPort.findOriginalSeries(ORIGINAL_SERIES_LIMIT, memberId, canViewAdultContent, now),
|
||||
latestAudios = queryPort.findLatestAudios(LATEST_AUDIO_LIMIT, memberId, canViewAdultContent, now),
|
||||
newAndHotAudios = queryPort.findAudioCardsByIds(
|
||||
|
||||
+7
-1
@@ -1,5 +1,6 @@
|
||||
package kr.co.vividnext.sodalive.v2.content.recommendation.port.out
|
||||
|
||||
import kr.co.vividnext.sodalive.i18n.Lang
|
||||
import kr.co.vividnext.sodalive.v2.common.domain.RecommendationBanner
|
||||
import kr.co.vividnext.sodalive.v2.content.recommendation.domain.AudioCard
|
||||
import kr.co.vividnext.sodalive.v2.content.recommendation.domain.AudioRecommendationVisibility
|
||||
@@ -9,7 +10,12 @@ import kr.co.vividnext.sodalive.v2.recommendation.port.out.RecommendationSnapsho
|
||||
import java.time.LocalDateTime
|
||||
|
||||
interface AudioRecommendationQueryPort {
|
||||
fun findBanners(limit: Int, memberId: Long?, canViewAdultContent: Boolean): List<RecommendationBanner>
|
||||
fun findBanners(
|
||||
limit: Int,
|
||||
memberId: Long?,
|
||||
canViewAdultContent: Boolean,
|
||||
lang: Lang = Lang.KO
|
||||
): List<RecommendationBanner>
|
||||
fun findOriginalSeries(limit: Int, memberId: Long?, canViewAdultContent: Boolean, now: LocalDateTime): List<OriginalSeries>
|
||||
fun findLatestAudios(limit: Int, memberId: Long?, canViewAdultContent: Boolean, now: LocalDateTime): List<AudioCard>
|
||||
fun findFreeAudios(limit: Int, memberId: Long?, canViewAdultContent: Boolean, now: LocalDateTime): List<AudioCard>
|
||||
|
||||
+4
-1
@@ -20,6 +20,7 @@ import kr.co.vividnext.sodalive.event.QEvent.event
|
||||
import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.QCreatorCommunity.creatorCommunity
|
||||
import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.comment.QCreatorCommunityComment.creatorCommunityComment
|
||||
import kr.co.vividnext.sodalive.explorer.profile.creatorCommunity.like.QCreatorCommunityLike.creatorCommunityLike
|
||||
import kr.co.vividnext.sodalive.i18n.Lang
|
||||
import kr.co.vividnext.sodalive.live.room.QLiveRoom.liveRoom
|
||||
import kr.co.vividnext.sodalive.member.MemberKind
|
||||
import kr.co.vividnext.sodalive.member.MemberRole
|
||||
@@ -88,7 +89,8 @@ class DefaultHomeRecommendationQueryRepository(
|
||||
override fun findHomeBanners(
|
||||
limit: Int,
|
||||
memberId: Long?,
|
||||
includeAdultBanners: Boolean
|
||||
includeAdultBanners: Boolean,
|
||||
lang: Lang
|
||||
): List<HomeBannerRecommendationRecord> {
|
||||
val bannerCreator = QMember("bannerCreator")
|
||||
val seriesOwner = QMember("seriesOwner")
|
||||
@@ -116,6 +118,7 @@ class DefaultHomeRecommendationQueryRepository(
|
||||
.where(
|
||||
audioContentBanner.isActive.isTrue,
|
||||
audioContentBanner.tab.isNull,
|
||||
audioContentBanner.lang.eq(lang),
|
||||
includeAdultBannerCondition(includeAdultBanners),
|
||||
activeBannerTargetCondition(memberId, bannerCreator, seriesOwner)
|
||||
)
|
||||
|
||||
+4
-2
@@ -1,5 +1,6 @@
|
||||
package kr.co.vividnext.sodalive.v2.recommendation.application
|
||||
|
||||
import kr.co.vividnext.sodalive.i18n.Lang
|
||||
import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
|
||||
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendationSnapshotWindowPolicy
|
||||
import kr.co.vividnext.sodalive.v2.recommendation.domain.RecommendedSectionType
|
||||
@@ -44,9 +45,10 @@ class HomeRecommendationQueryService(
|
||||
fun findHomeBanners(
|
||||
limit: Int = DEFAULT_BANNER_LIMIT,
|
||||
memberId: Long? = null,
|
||||
includeAdultBanners: Boolean = false
|
||||
includeAdultBanners: Boolean = false,
|
||||
lang: Lang = Lang.KO
|
||||
): List<HomeBannerRecommendationRecord> {
|
||||
return queryPort.findHomeBanners(limit, memberId, includeAdultBanners)
|
||||
return queryPort.findHomeBanners(limit, memberId, includeAdultBanners, lang)
|
||||
}
|
||||
|
||||
fun findRecentlyActiveCreators(
|
||||
|
||||
+3
-1
@@ -1,5 +1,6 @@
|
||||
package kr.co.vividnext.sodalive.v2.recommendation.port.out
|
||||
|
||||
import kr.co.vividnext.sodalive.i18n.Lang
|
||||
import kr.co.vividnext.sodalive.v2.common.domain.CreatorActivityType
|
||||
import java.time.LocalDateTime
|
||||
|
||||
@@ -14,7 +15,8 @@ interface HomeRecommendationQueryPort {
|
||||
fun findHomeBanners(
|
||||
limit: Int,
|
||||
memberId: Long? = null,
|
||||
includeAdultBanners: Boolean = false
|
||||
includeAdultBanners: Boolean = false,
|
||||
lang: Lang = Lang.KO
|
||||
): List<HomeBannerRecommendationRecord>
|
||||
|
||||
fun findRecentlyActiveCreators(
|
||||
|
||||
Reference in New Issue
Block a user