feat(recommend): 추천 활동 공통 모델을 추가한다

This commit is contained in:
2026-05-30 17:45:30 +09:00
parent c5b92d250e
commit 1d1e062e1e
4 changed files with 88 additions and 0 deletions

View File

@@ -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 = "다시듣기"
}
}

View File

@@ -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")
}

View File

@@ -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")
}

View File

@@ -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)
}
}