feat(home): 크리에이터 랭킹 응답 매핑을 추가한다

This commit is contained in:
2026-06-08 15:22:16 +09:00
parent 6d980e319b
commit 21e94af8d1
5 changed files with 187 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
package kr.co.vividnext.sodalive.v2.main.home.data
import io.reactivex.rxjava3.core.Single
import kr.co.vividnext.sodalive.common.ApiResponse
import retrofit2.http.GET
import retrofit2.http.Header
interface HomeCreatorRankingApi {
@GET("/api/v2/home/rankings/creators")
fun getCreatorRankings(
@Header("Authorization") authHeader: String
): Single<ApiResponse<HomeCreatorRankingResponse>>
}

View File

@@ -0,0 +1,20 @@
package kr.co.vividnext.sodalive.v2.main.home.data
import androidx.annotation.Keep
import com.google.gson.annotations.SerializedName
@Keep
data class HomeCreatorRankingResponse(
@SerializedName("showRankChange") val showRankChange: Boolean,
@SerializedName("items") val items: List<HomeCreatorRankingItemResponse>
)
@Keep
data class HomeCreatorRankingItemResponse(
@SerializedName("rank") val rank: Int,
@SerializedName("rankChange") val rankChange: Int?,
@SerializedName("isNew") val isNew: Boolean,
@SerializedName("creatorId") val creatorId: Long,
@SerializedName("nickname") val nickname: String,
@SerializedName("profileImageUrl") val profileImageUrl: String
)

View File

@@ -0,0 +1,5 @@
package kr.co.vividnext.sodalive.v2.main.home.data
class HomeCreatorRankingRepository(private val api: HomeCreatorRankingApi) {
fun getCreatorRankings(token: String) = api.getCreatorRankings(authHeader = token)
}

View File

@@ -0,0 +1,37 @@
package kr.co.vividnext.sodalive.v2.main.home.model
import kr.co.vividnext.sodalive.v2.main.home.data.HomeCreatorRankingItemResponse
import kr.co.vividnext.sodalive.v2.main.home.data.HomeCreatorRankingResponse
import kr.co.vividnext.sodalive.v2.widget.creatorranking.CreatorRankingItem
import kr.co.vividnext.sodalive.v2.widget.ranking.RankingChangeType
import kr.co.vividnext.sodalive.v2.widget.ranking.RankingChangeType.Decrease
import kr.co.vividnext.sodalive.v2.widget.ranking.RankingChangeType.Increase
import kr.co.vividnext.sodalive.v2.widget.ranking.RankingChangeType.New
import kr.co.vividnext.sodalive.v2.widget.ranking.RankingChangeType.Stay
import kotlin.math.abs
fun HomeCreatorRankingResponse.toCreatorRankingItems(): List<CreatorRankingItem> = items
.filter { it.rank >= 1 }
.sortedBy { it.rank }
.map { it.toCreatorRankingItem(showRankChange) }
private fun HomeCreatorRankingItemResponse.toCreatorRankingItem(showRankChange: Boolean): CreatorRankingItem {
val changeType = toRankingChangeType()
return CreatorRankingItem(
creatorId = creatorId,
rank = rank,
rankChangeType = changeType,
rankChangeAmount = if (changeType == New) 0 else abs(rankChange ?: 0),
creatorName = nickname,
imageUrl = profileImageUrl,
isBlocked = creatorId == 0L,
showRankChange = showRankChange
)
}
private fun HomeCreatorRankingItemResponse.toRankingChangeType(): RankingChangeType = when {
isNew -> New
rankChange == null || rankChange == 0 -> Stay
rankChange > 0 -> Increase
else -> Decrease
}