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