diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/application/AudioRecommendationQueryService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/application/AudioRecommendationQueryService.kt index bac000d5..2cf8a09a 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/application/AudioRecommendationQueryService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/application/AudioRecommendationQueryService.kt @@ -1,6 +1,7 @@ package kr.co.vividnext.sodalive.v2.content.recommendation.application import kr.co.vividnext.sodalive.i18n.Lang +import kr.co.vividnext.sodalive.i18n.LangContext 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 @@ -17,7 +18,8 @@ import java.time.ZoneId class AudioRecommendationQueryService( private val queryPort: AudioRecommendationQueryPort, private val memberContentPreferenceService: MemberContentPreferenceService, - private val snapshotFallbackService: AudioRecommendationSnapshotFallbackService + private val snapshotFallbackService: AudioRecommendationSnapshotFallbackService, + private val langContext: LangContext ) { fun getRecommendations(member: Member?): AudioRecommendations { val now = LocalDateTime.now() @@ -25,6 +27,7 @@ class AudioRecommendationQueryService( val canViewAdultContent = canViewAdultContent(member) val visibility = if (canViewAdultContent) AudioRecommendationVisibility.ALL else AudioRecommendationVisibility.SAFE val memberId = member?.id + val locale = langContext.lang.code val bannerLang = if (memberContentPreferenceService.resolveCountryCode(member) == "JP") Lang.JA else Lang.KO val newAndHotSectionType = newAndHotSectionType(visibility) val mostCommentedSectionType = mostCommentedSectionType(visibility) @@ -48,25 +51,28 @@ class AudioRecommendationQueryService( return AudioRecommendations( 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), + latestAudios = queryPort.findLatestAudios(LATEST_AUDIO_LIMIT, memberId, canViewAdultContent, now, locale), newAndHotAudios = queryPort.findAudioCardsByIds( newAndHotSnapshots.map { it.targetId }, memberId, canViewAdultContent, - now + now, + locale ), - freeAudios = queryPort.findFreeAudios(FREE_AUDIO_LIMIT, memberId, canViewAdultContent, now), - pointAudios = queryPort.findPointAudios(POINT_AUDIO_LIMIT, memberId, canViewAdultContent, now), + freeAudios = queryPort.findFreeAudios(FREE_AUDIO_LIMIT, memberId, canViewAdultContent, now, locale), + pointAudios = queryPort.findPointAudios(POINT_AUDIO_LIMIT, memberId, canViewAdultContent, now, locale), mostCommentedAudios = queryPort.findCommentedAudiosByIds( mostCommentedSnapshots.map { it.targetId }, memberId, - canViewAdultContent + canViewAdultContent, + locale ), recommendedAudios = queryPort.findAudioCardsByIds( recommendedSnapshots.map { it.targetId }, memberId, canViewAdultContent, - now + now, + locale ) ) } @@ -83,7 +89,8 @@ class AudioRecommendationQueryService( snapshots.map { it.targetId }, member.id, canViewAdultContent, - now + now, + langContext.lang.code ) } diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/port/out/AudioRecommendationQueryPort.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/port/out/AudioRecommendationQueryPort.kt index 5d181dd0..18ceeda2 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/port/out/AudioRecommendationQueryPort.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/port/out/AudioRecommendationQueryPort.kt @@ -17,16 +17,40 @@ interface AudioRecommendationQueryPort { lang: Lang = Lang.KO ): List fun findOriginalSeries(limit: Int, memberId: Long?, canViewAdultContent: Boolean, now: LocalDateTime): List - fun findLatestAudios(limit: Int, memberId: Long?, canViewAdultContent: Boolean, now: LocalDateTime): List - fun findFreeAudios(limit: Int, memberId: Long?, canViewAdultContent: Boolean, now: LocalDateTime): List - fun findPointAudios(limit: Int, memberId: Long?, canViewAdultContent: Boolean, now: LocalDateTime): List + fun findLatestAudios( + limit: Int, + memberId: Long?, + canViewAdultContent: Boolean, + now: LocalDateTime, + locale: String + ): List + fun findFreeAudios( + limit: Int, + memberId: Long?, + canViewAdultContent: Boolean, + now: LocalDateTime, + locale: String + ): List + fun findPointAudios( + limit: Int, + memberId: Long?, + canViewAdultContent: Boolean, + now: LocalDateTime, + locale: String + ): List fun findAudioCardsByIds( contentIds: List, memberId: Long?, canViewAdultContent: Boolean, - now: LocalDateTime + now: LocalDateTime, + locale: String ): List - fun findCommentedAudiosByIds(contentIds: List, memberId: Long?, canViewAdultContent: Boolean): List + fun findCommentedAudiosByIds( + contentIds: List, + memberId: Long?, + canViewAdultContent: Boolean, + locale: String + ): List fun findNewAndHotSnapshots( windowStart: LocalDateTime, snapshotAt: LocalDateTime, diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/application/AudioRecommendationQueryServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/application/AudioRecommendationQueryServiceTest.kt index af6a3610..e333b67d 100644 --- a/src/test/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/application/AudioRecommendationQueryServiceTest.kt +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/content/recommendation/application/AudioRecommendationQueryServiceTest.kt @@ -1,6 +1,7 @@ package kr.co.vividnext.sodalive.v2.content.recommendation.application import kr.co.vividnext.sodalive.i18n.Lang +import kr.co.vividnext.sodalive.i18n.LangContext import kr.co.vividnext.sodalive.member.Member import kr.co.vividnext.sodalive.member.MemberRole import kr.co.vividnext.sodalive.member.contentpreference.MemberContentPreferenceService @@ -19,10 +20,12 @@ class AudioRecommendationQueryServiceTest { private val queryPort = Mockito.mock(AudioRecommendationQueryPort::class.java) private val preferenceService = Mockito.mock(MemberContentPreferenceService::class.java) private val fallbackService = Mockito.mock(AudioRecommendationSnapshotFallbackService::class.java) + private val langContext = LangContext().apply { setLang(Lang.EN) } private val service = AudioRecommendationQueryService( queryPort, preferenceService, - fallbackService + fallbackService, + langContext ) @Test @@ -83,25 +86,29 @@ class AudioRecommendationQueryServiceTest { eqValue(AudioRecommendationQueryService.LATEST_AUDIO_LIMIT), Mockito.isNull(), eqValue(false), - anyLocalDateTime() + anyLocalDateTime(), + eqValue(Lang.EN.code) ) Mockito.verify(queryPort).findFreeAudios( eqValue(AudioRecommendationQueryService.FREE_AUDIO_LIMIT), Mockito.isNull(), eqValue(false), - anyLocalDateTime() + anyLocalDateTime(), + eqValue(Lang.EN.code) ) Mockito.verify(queryPort).findPointAudios( eqValue(AudioRecommendationQueryService.POINT_AUDIO_LIMIT), Mockito.isNull(), eqValue(false), - anyLocalDateTime() + anyLocalDateTime(), + eqValue(Lang.EN.code) ) Mockito.verify(queryPort).findAudioCardsByIds( eqValue(listOf(1L)), Mockito.isNull(), eqValue(false), - anyLocalDateTime() + anyLocalDateTime(), + eqValue(Lang.EN.code) ) } @@ -198,7 +205,8 @@ class AudioRecommendationQueryServiceTest { eqValue(listOf(3L, 4L, 5L)), eqValue(member.id), eqValue(true), - anyLocalDateTime() + anyLocalDateTime(), + eqValue(Lang.EN.code) ) val result = service.findNewAndHotAudios(member, offset = 20L, limit = 21)