feat(home): 크리에이터 랭킹 응답 매핑을 추가한다
This commit is contained in:
@@ -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>>
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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
|
||||
}
|
||||
Reference in New Issue
Block a user