From 1d1e062e1ece05f3512e25561bc25c20ab4d398b Mon Sep 17 00:00:00 2001 From: Klaus Date: Sat, 30 May 2026 17:45:30 +0900 Subject: [PATCH] =?UTF-8?q?feat(recommend):=20=EC=B6=94=EC=B2=9C=20?= =?UTF-8?q?=ED=99=9C=EB=8F=99=20=EA=B3=B5=ED=86=B5=20=EB=AA=A8=EB=8D=B8?= =?UTF-8?q?=EC=9D=84=20=EC=B6=94=EA=B0=80=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../HomeRecommendationQueryService.kt | 17 +++++++ .../domain/RecommendedActivityType.kt | 8 +++ .../domain/RecommendedSectionType.kt | 13 +++++ .../HomeRecommendationQueryServiceTest.kt | 50 +++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/application/HomeRecommendationQueryService.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/domain/RecommendedActivityType.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/domain/RecommendedSectionType.kt create mode 100644 src/test/kotlin/kr/co/vividnext/sodalive/v2/recommend/application/HomeRecommendationQueryServiceTest.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/application/HomeRecommendationQueryService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/application/HomeRecommendationQueryService.kt new file mode 100644 index 00000000..20cdd47d --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/application/HomeRecommendationQueryService.kt @@ -0,0 +1,17 @@ +package kr.co.vividnext.sodalive.v2.recommend.application + +import kr.co.vividnext.sodalive.v2.recommend.domain.RecommendedActivityType + +class HomeRecommendationQueryService { + fun resolveAudioContentActivityType(theme: String): RecommendedActivityType { + return if (theme == LIVE_REPLAY_THEME) { + RecommendedActivityType.LIVE_REPLAY + } else { + RecommendedActivityType.AUDIO + } + } + + companion object { + private const val LIVE_REPLAY_THEME = "다시듣기" + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/domain/RecommendedActivityType.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/domain/RecommendedActivityType.kt new file mode 100644 index 00000000..e20a31ce --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/domain/RecommendedActivityType.kt @@ -0,0 +1,8 @@ +package kr.co.vividnext.sodalive.v2.recommend.domain + +enum class RecommendedActivityType(val code: String) { + LIVE("LIVE"), + AUDIO("AUDIO"), + COMMUNITY("COMMUNITY"), + LIVE_REPLAY("LIVE_REPLAY") +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/domain/RecommendedSectionType.kt b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/domain/RecommendedSectionType.kt new file mode 100644 index 00000000..8e529185 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/v2/recommend/domain/RecommendedSectionType.kt @@ -0,0 +1,13 @@ +package kr.co.vividnext.sodalive.v2.recommend.domain + +enum class RecommendedSectionType(val code: String) { + LIVE("LIVE"), + BANNER("BANNER"), + ACTIVE_CREATOR("ACTIVE_CREATOR"), + DEBUT_CREATOR("DEBUT_CREATOR"), + FIRST_AUDIO_CONTENT("FIRST_AUDIO_CONTENT"), + AI_CHARACTER("AI_CHARACTER"), + GENRE_CREATOR("GENRE_CREATOR"), + CHEER_CREATOR("CHEER_CREATOR"), + POPULAR_COMMUNITY("POPULAR_COMMUNITY") +} diff --git a/src/test/kotlin/kr/co/vividnext/sodalive/v2/recommend/application/HomeRecommendationQueryServiceTest.kt b/src/test/kotlin/kr/co/vividnext/sodalive/v2/recommend/application/HomeRecommendationQueryServiceTest.kt new file mode 100644 index 00000000..a8ebd10b --- /dev/null +++ b/src/test/kotlin/kr/co/vividnext/sodalive/v2/recommend/application/HomeRecommendationQueryServiceTest.kt @@ -0,0 +1,50 @@ +package kr.co.vividnext.sodalive.v2.recommend.application + +import kr.co.vividnext.sodalive.v2.recommend.domain.RecommendedActivityType +import kr.co.vividnext.sodalive.v2.recommend.domain.RecommendedSectionType +import org.junit.jupiter.api.Assertions.assertEquals +import org.junit.jupiter.api.DisplayName +import org.junit.jupiter.api.Test + +class HomeRecommendationQueryServiceTest { + private val service = HomeRecommendationQueryService() + + @Test + @DisplayName("다시듣기 테마 콘텐츠는 AUDIO가 아니라 LIVE_REPLAY 활동으로 분류한다") + fun shouldClassifyLiveReplayThemeContentAsLiveReplay() { + val activityType = service.resolveAudioContentActivityType(theme = "다시듣기") + + assertEquals(RecommendedActivityType.LIVE_REPLAY, activityType) + } + + @Test + @DisplayName("다시듣기가 아닌 테마 콘텐츠는 AUDIO 활동으로 분류한다") + fun shouldClassifyNonLiveReplayThemeContentAsAudio() { + val activityType = service.resolveAudioContentActivityType(theme = "수면") + + assertEquals(RecommendedActivityType.AUDIO, activityType) + } + + @Test + @DisplayName("활동 타입 enum code는 앱 다국어 처리를 위해 영문 값과 동일하게 유지한다") + fun shouldKeepRecommendedActivityTypeCodeAsEnglishName() { + assertEquals("LIVE", RecommendedActivityType.LIVE.code) + assertEquals("AUDIO", RecommendedActivityType.AUDIO.code) + assertEquals("COMMUNITY", RecommendedActivityType.COMMUNITY.code) + assertEquals("LIVE_REPLAY", RecommendedActivityType.LIVE_REPLAY.code) + } + + @Test + @DisplayName("섹션 타입 enum code는 앱 다국어 처리를 위해 영문 값과 동일하게 유지한다") + fun shouldKeepRecommendedSectionTypeCodeAsEnglishName() { + assertEquals("LIVE", RecommendedSectionType.LIVE.code) + assertEquals("BANNER", RecommendedSectionType.BANNER.code) + assertEquals("ACTIVE_CREATOR", RecommendedSectionType.ACTIVE_CREATOR.code) + assertEquals("DEBUT_CREATOR", RecommendedSectionType.DEBUT_CREATOR.code) + assertEquals("FIRST_AUDIO_CONTENT", RecommendedSectionType.FIRST_AUDIO_CONTENT.code) + assertEquals("AI_CHARACTER", RecommendedSectionType.AI_CHARACTER.code) + assertEquals("GENRE_CREATOR", RecommendedSectionType.GENRE_CREATOR.code) + assertEquals("CHEER_CREATOR", RecommendedSectionType.CHEER_CREATOR.code) + assertEquals("POPULAR_COMMUNITY", RecommendedSectionType.POPULAR_COMMUNITY.code) + } +}