From 0d0bec1904e70e8687ff2ee2d2bc14e1112afcb0 Mon Sep 17 00:00:00 2001 From: klaus Date: Wed, 24 Jun 2026 13:35:20 +0900 Subject: [PATCH] =?UTF-8?q?feat(content):=20=EB=9E=AD=ED=82=B9=20API=20?= =?UTF-8?q?=EA=B3=84=EC=95=BD=EC=9D=84=20=EC=B6=94=EA=B0=80=ED=95=9C?= =?UTF-8?q?=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../v2/main/content/data/AudioRankingsApi.kt | 15 ++++++ .../main/content/data/AudioRankingsModels.kt | 34 ++++++++++++++ .../content/data/AudioRankingsRepository.kt | 8 ++++ .../v2/main/content/AudioRankingTypeTest.kt | 46 +++++++++++++++++++ 4 files changed, 103 insertions(+) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsApi.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsModels.kt create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsRepository.kt create mode 100644 app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/AudioRankingTypeTest.kt diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsApi.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsApi.kt new file mode 100644 index 00000000..cd468ce8 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsApi.kt @@ -0,0 +1,15 @@ +package kr.co.vividnext.sodalive.v2.main.content.data + +import io.reactivex.rxjava3.core.Single +import kr.co.vividnext.sodalive.common.ApiResponse +import retrofit2.http.GET +import retrofit2.http.Header +import retrofit2.http.Query + +interface AudioRankingsApi { + @GET("/api/v2/audio/rankings") + fun getRankings( + @Header("Authorization") authHeader: String, + @Query("type") type: AudioRankingType + ): Single> +} diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsModels.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsModels.kt new file mode 100644 index 00000000..bcf71d33 --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsModels.kt @@ -0,0 +1,34 @@ +package kr.co.vividnext.sodalive.v2.main.content.data + +import androidx.annotation.Keep +import com.google.gson.annotations.SerializedName + +@Keep +data class AudioRankingResponse( + @SerializedName("showRankChange") val showRankChange: Boolean, + @SerializedName("type") val type: AudioRankingType, + @SerializedName("items") val items: List +) + +enum class AudioRankingType( + val queryValue: String, + val label: String +) { + WEEKLY_POPULAR("WEEKLY_POPULAR", "주간 인기"), + RISING("RISING", "지금 뜨는 중"), + REVENUE("REVENUE", "매출"), + SALES_COUNT("SALES_COUNT", "판매량"), + COMMENT_COUNT("COMMENT_COUNT", "댓글수"), + LIKE_COUNT("LIKE_COUNT", "좋아요") +} + +@Keep +data class AudioRankingItemResponse( + @SerializedName("contentId") val contentId: Long, + @SerializedName("title") val title: String, + @SerializedName("creatorNickname") val creatorNickname: String, + @SerializedName("rank") val rank: Int, + @SerializedName("rankChange") val rankChange: Int?, + @SerializedName("isNew") val isNew: Boolean, + @SerializedName("coverImageUrl") val coverImageUrl: String? +) diff --git a/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsRepository.kt b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsRepository.kt new file mode 100644 index 00000000..7d42e39a --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/v2/main/content/data/AudioRankingsRepository.kt @@ -0,0 +1,8 @@ +package kr.co.vividnext.sodalive.v2.main.content.data + +class AudioRankingsRepository(private val api: AudioRankingsApi) { + fun getRankings(token: String, type: AudioRankingType) = api.getRankings( + authHeader = token, + type = type + ) +} diff --git a/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/AudioRankingTypeTest.kt b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/AudioRankingTypeTest.kt new file mode 100644 index 00000000..1c40ae1c --- /dev/null +++ b/app/src/test/java/kr/co/vividnext/sodalive/v2/main/content/AudioRankingTypeTest.kt @@ -0,0 +1,46 @@ +package kr.co.vividnext.sodalive.v2.main.content + +import kr.co.vividnext.sodalive.v2.main.content.data.AudioRankingType +import org.junit.Assert.assertEquals +import org.junit.Test + +class AudioRankingTypeTest { + + @Test + fun `랭킹 타입은 PRD 순서를 유지한다`() { + assertEquals( + listOf( + AudioRankingType.WEEKLY_POPULAR, + AudioRankingType.RISING, + AudioRankingType.REVENUE, + AudioRankingType.SALES_COUNT, + AudioRankingType.COMMENT_COUNT, + AudioRankingType.LIKE_COUNT + ), + AudioRankingType.entries + ) + } + + @Test + fun `랭킹 타입 query value는 enum name을 사용한다`() { + assertEquals( + listOf( + "WEEKLY_POPULAR", + "RISING", + "REVENUE", + "SALES_COUNT", + "COMMENT_COUNT", + "LIKE_COUNT" + ), + AudioRankingType.entries.map { it.queryValue } + ) + } + + @Test + fun `랭킹 타입 label은 PRD 순서를 유지한다`() { + assertEquals( + listOf("주간 인기", "지금 뜨는 중", "매출", "판매량", "댓글수", "좋아요"), + AudioRankingType.entries.map { it.label } + ) + } +}