Updated on 2026-08-14
This commit is contained in:
parent
54800d32cc
commit
faa58cf142
39 changed files with 722 additions and 245 deletions
|
|
@ -19,9 +19,6 @@ internal class DefaultMarketsTokenRepository(
|
|||
private val dispatcherProvider: CoroutineDispatcherProvider,
|
||||
) : MarketsTokenRepository {
|
||||
|
||||
private val tokenListConverter = TokenMarketListConverter()
|
||||
private val tokenChartConverter = TokenChartConverter()
|
||||
|
||||
private fun createTokenMarketsFetcher(firstBatchSize: Int, nextBatchSize: Int) = LimitOffsetBatchFetcher(
|
||||
prefetchDistance = firstBatchSize,
|
||||
batchSize = nextBatchSize,
|
||||
|
|
@ -65,7 +62,7 @@ internal class DefaultMarketsTokenRepository(
|
|||
val last = res.tokens.size < request.limit
|
||||
|
||||
return BatchFetchResult.Success(
|
||||
data = tokenListConverter.convert(res),
|
||||
data = TokenMarketListConverter.convert(res),
|
||||
last = last,
|
||||
empty = res.tokens.isEmpty(),
|
||||
)
|
||||
|
|
@ -105,7 +102,7 @@ internal class DefaultMarketsTokenRepository(
|
|||
interval = interval.toRequestParam(),
|
||||
)
|
||||
|
||||
return tokenChartConverter.convert(interval, response.getOrThrow())
|
||||
return TokenChartConverter.convert(interval, response.getOrThrow())
|
||||
}
|
||||
|
||||
override suspend fun getTokenInfo(
|
||||
|
|
@ -119,6 +116,17 @@ internal class DefaultMarketsTokenRepository(
|
|||
language = languageCode,
|
||||
)
|
||||
|
||||
return TokenMarketInfoConverter().convert(response.getOrThrow())
|
||||
return TokenMarketInfoConverter.convert(response.getOrThrow())
|
||||
}
|
||||
|
||||
override suspend fun getTokenQuotes(fiatCurrencyCode: String, tokenId: String): TokenQuotes {
|
||||
// TODO change method when backend is ready
|
||||
val response = marketsApi.getCoinMarketData(
|
||||
currency = fiatCurrencyCode,
|
||||
coinId = tokenId,
|
||||
language = "en",
|
||||
)
|
||||
|
||||
return TokenMarketInfoConverter.convert(response.getOrThrow()).quotes
|
||||
}
|
||||
}
|
||||
|
|
@ -1,8 +1,7 @@
|
|||
package com.tangem.data.markets
|
||||
|
||||
import com.tangem.data.markets.converters.TokenChartConverter
|
||||
import com.tangem.data.markets.converters.TokenMarketChartsConverter
|
||||
import com.tangem.data.markets.converters.TokenQuotesConverter
|
||||
import com.tangem.data.markets.converters.TokenQuotesShortConverter
|
||||
import com.tangem.data.markets.converters.toRequestParam
|
||||
import com.tangem.data.markets.utils.retryOnError
|
||||
import com.tangem.datasource.api.common.response.getOrThrow
|
||||
|
|
@ -21,9 +20,6 @@ internal class MarketsBatchUpdateFetcher(
|
|||
private val tangemTechApi: TangemTechApi,
|
||||
) : BatchUpdateFetcher<Int, List<TokenMarket>, TokenMarketUpdateRequest> {
|
||||
|
||||
private val tokenListChartsConverter = TokenMarketChartsConverter(TokenChartConverter())
|
||||
private val tokenQuotesConverter = TokenQuotesConverter()
|
||||
|
||||
override suspend fun BatchUpdateFetcher.UpdateContext<Int, List<TokenMarket>>.fetchUpdateAsync(
|
||||
toUpdate: List<Batch<Int, List<TokenMarket>>>,
|
||||
updateRequest: TokenMarketUpdateRequest,
|
||||
|
|
@ -75,7 +71,7 @@ internal class MarketsBatchUpdateFetcher(
|
|||
val res = toUpdate.map { batch ->
|
||||
batch.copy(
|
||||
data = batch.data.map {
|
||||
it.copy(tokenQuotes = tokenQuotesConverter.convert(it.id, quotesRes))
|
||||
it.copy(tokenQuotesShort = TokenQuotesShortConverter.convert(it.id, quotesRes))
|
||||
},
|
||||
)
|
||||
}
|
||||
|
|
@ -97,7 +93,7 @@ internal class MarketsBatchUpdateFetcher(
|
|||
key = batchToUpdate.key,
|
||||
data = batchToUpdate.data.map {
|
||||
it.copy(
|
||||
tokenCharts = tokenListChartsConverter.convert(
|
||||
tokenCharts = TokenMarketChartsConverter.convert(
|
||||
chartsToCopy = it.tokenCharts,
|
||||
tokenId = it.id,
|
||||
interval = updateRequest.interval,
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ import com.tangem.datasource.api.markets.models.response.TokenMarketChartRespons
|
|||
import com.tangem.domain.markets.PriceChangeInterval
|
||||
import com.tangem.domain.markets.TokenChart
|
||||
|
||||
class TokenChartConverter {
|
||||
internal object TokenChartConverter {
|
||||
|
||||
fun convert(interval: PriceChangeInterval, value: TokenMarketChartResponse): TokenChart {
|
||||
return TokenChart(
|
||||
|
|
|
|||
|
|
@ -3,13 +3,13 @@ package com.tangem.data.markets.converters
|
|||
import com.tangem.domain.markets.PriceChangeInterval
|
||||
import com.tangem.domain.markets.TokenMarketListConfig
|
||||
|
||||
fun TokenMarketListConfig.Interval.toRequestParam(): String = when (this) {
|
||||
internal fun TokenMarketListConfig.Interval.toRequestParam(): String = when (this) {
|
||||
TokenMarketListConfig.Interval.H24 -> "24h"
|
||||
TokenMarketListConfig.Interval.WEEK -> "1w"
|
||||
TokenMarketListConfig.Interval.MONTH -> "30d"
|
||||
}
|
||||
|
||||
fun TokenMarketListConfig.Order.toRequestParam(): String = when (this) {
|
||||
internal fun TokenMarketListConfig.Order.toRequestParam(): String = when (this) {
|
||||
TokenMarketListConfig.Order.ByRating -> "rating"
|
||||
TokenMarketListConfig.Order.Trending -> "trending"
|
||||
TokenMarketListConfig.Order.Buyers -> "buyers"
|
||||
|
|
@ -17,7 +17,7 @@ fun TokenMarketListConfig.Order.toRequestParam(): String = when (this) {
|
|||
TokenMarketListConfig.Order.TopLosers -> "losers"
|
||||
}
|
||||
|
||||
fun PriceChangeInterval.toRequestParam(): String = when (this) {
|
||||
internal fun PriceChangeInterval.toRequestParam(): String = when (this) {
|
||||
PriceChangeInterval.H24 -> "24h"
|
||||
PriceChangeInterval.WEEK -> "1w"
|
||||
PriceChangeInterval.MONTH -> "1m"
|
||||
|
|
|
|||
|
|
@ -5,9 +5,7 @@ import com.tangem.domain.markets.PriceChangeInterval
|
|||
import com.tangem.domain.markets.TokenMarket
|
||||
import com.tangem.domain.markets.TokenMarketListConfig
|
||||
|
||||
class TokenMarketChartsConverter(
|
||||
private val tokenChartConverter: TokenChartConverter,
|
||||
) {
|
||||
internal object TokenMarketChartsConverter {
|
||||
|
||||
fun convert(
|
||||
chartsToCopy: TokenMarket.Charts,
|
||||
|
|
@ -20,13 +18,13 @@ class TokenMarketChartsConverter(
|
|||
}
|
||||
return when (interval) {
|
||||
TokenMarketListConfig.Interval.H24 -> chartsToCopy.copy(
|
||||
h24 = tokenChartConverter.convert(interval.toPriceChangeInterval(), prices),
|
||||
h24 = TokenChartConverter.convert(interval.toPriceChangeInterval(), prices),
|
||||
)
|
||||
TokenMarketListConfig.Interval.WEEK -> chartsToCopy.copy(
|
||||
week = tokenChartConverter.convert(interval.toPriceChangeInterval(), prices),
|
||||
week = TokenChartConverter.convert(interval.toPriceChangeInterval(), prices),
|
||||
)
|
||||
TokenMarketListConfig.Interval.MONTH -> chartsToCopy.copy(
|
||||
month = tokenChartConverter.convert(interval.toPriceChangeInterval(), prices),
|
||||
month = TokenChartConverter.convert(interval.toPriceChangeInterval(), prices),
|
||||
)
|
||||
else -> error("unsupported interval=$interval. This shouldn't have happened.")
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,9 +2,10 @@ package com.tangem.data.markets.converters
|
|||
|
||||
import com.tangem.datasource.api.markets.models.response.TokenMarketInfoResponse
|
||||
import com.tangem.domain.markets.TokenMarketInfo
|
||||
import com.tangem.domain.markets.TokenQuotes
|
||||
import com.tangem.utils.converter.Converter
|
||||
|
||||
internal class TokenMarketInfoConverter : Converter<TokenMarketInfoResponse, TokenMarketInfo> {
|
||||
internal object TokenMarketInfoConverter : Converter<TokenMarketInfoResponse, TokenMarketInfo> {
|
||||
|
||||
override fun convert(value: TokenMarketInfoResponse): TokenMarketInfo {
|
||||
return with(value) {
|
||||
|
|
@ -12,8 +13,7 @@ internal class TokenMarketInfoConverter : Converter<TokenMarketInfoResponse, Tok
|
|||
id = id,
|
||||
name = name,
|
||||
symbol = symbol,
|
||||
currentPrice = currentPrice,
|
||||
priceChangePercentage = priceChangePercentage?.convert(),
|
||||
quotes = getQuotes(),
|
||||
networks = networks?.convert(),
|
||||
shortDescription = shortDescription,
|
||||
fullDescription = fullDescription,
|
||||
|
|
@ -25,15 +25,16 @@ internal class TokenMarketInfoConverter : Converter<TokenMarketInfoResponse, Tok
|
|||
}
|
||||
}
|
||||
|
||||
private fun TokenMarketInfoResponse.PriceChangePercentage.convert(): TokenMarketInfo.PriceChangePercentage {
|
||||
return TokenMarketInfo.PriceChangePercentage(
|
||||
day = day,
|
||||
week = week,
|
||||
month = month,
|
||||
threeMonths = threeMonths,
|
||||
sixMonths = sixMonths,
|
||||
year = year,
|
||||
allTime = allTime,
|
||||
private fun TokenMarketInfoResponse.getQuotes(): TokenQuotes {
|
||||
return TokenQuotes(
|
||||
currentPrice = currentPrice,
|
||||
h24ChangePercent = priceChangePercentage?.day?.movePointLeft(2),
|
||||
weekChangePercent = priceChangePercentage?.week?.movePointLeft(2),
|
||||
monthChangePercent = priceChangePercentage?.month?.movePointLeft(2),
|
||||
m3ChangePercent = priceChangePercentage?.threeMonths?.movePointLeft(2),
|
||||
m6ChangePercent = priceChangePercentage?.sixMonths?.movePointLeft(2),
|
||||
yearChangePercent = priceChangePercentage?.year?.movePointLeft(2),
|
||||
allTimeChangePercent = priceChangePercentage?.allTime?.movePointLeft(2),
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,12 +1,11 @@
|
|||
package com.tangem.data.markets.converters
|
||||
|
||||
import com.tangem.datasource.api.markets.models.response.TokenMarketListResponse
|
||||
import com.tangem.domain.markets.PriceChangeInterval
|
||||
import com.tangem.domain.markets.TokenMarket
|
||||
import com.tangem.domain.markets.TokenQuotes
|
||||
import com.tangem.domain.markets.TokenQuotesShort
|
||||
import com.tangem.utils.converter.Converter
|
||||
|
||||
class TokenMarketListConverter : Converter<TokenMarketListResponse, List<TokenMarket>> {
|
||||
internal object TokenMarketListConverter : Converter<TokenMarketListResponse, List<TokenMarket>> {
|
||||
|
||||
override fun convert(value: TokenMarketListResponse): List<TokenMarket> {
|
||||
val imageHost = value.imageHost ?: run {
|
||||
|
|
@ -25,13 +24,11 @@ class TokenMarketListConverter : Converter<TokenMarketListResponse, List<TokenMa
|
|||
marketRating = token.marketRating,
|
||||
marketCap = token.marketCap,
|
||||
imageHost = imageHost,
|
||||
tokenQuotes = TokenQuotes(
|
||||
tokenQuotesShort = TokenQuotesShort(
|
||||
currentPrice = token.currentPrice,
|
||||
priceChanges = mapOf(
|
||||
PriceChangeInterval.H24 to token.priceChangePercentage.h24.movePointLeft(2),
|
||||
PriceChangeInterval.WEEK to token.priceChangePercentage.week1.movePointLeft(2),
|
||||
PriceChangeInterval.MONTH to token.priceChangePercentage.day30.movePointLeft(2),
|
||||
),
|
||||
h24ChangePercent = token.priceChangePercentage.h24.movePointLeft(2),
|
||||
weekChangePercent = token.priceChangePercentage.week1.movePointLeft(2),
|
||||
monthChangePercent = token.priceChangePercentage.day30.movePointLeft(2),
|
||||
),
|
||||
tokenCharts = TokenMarket.Charts(null, null, null),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -1,25 +1,22 @@
|
|||
package com.tangem.data.markets.converters
|
||||
|
||||
import com.tangem.datasource.api.tangemTech.models.QuotesResponse
|
||||
import com.tangem.domain.markets.PriceChangeInterval
|
||||
import com.tangem.domain.markets.TokenQuotes
|
||||
import com.tangem.domain.markets.TokenQuotesShort
|
||||
import java.math.BigDecimal
|
||||
|
||||
class TokenQuotesConverter {
|
||||
internal object TokenQuotesShortConverter {
|
||||
|
||||
fun convert(tokenId: String, value: QuotesResponse): TokenQuotes {
|
||||
fun convert(tokenId: String, value: QuotesResponse): TokenQuotesShort {
|
||||
val quote = requireNotNull(value.quotes[tokenId]) {
|
||||
"$tokenId is not found in the response. This shouldn't have happened."
|
||||
}
|
||||
return TokenQuotes(
|
||||
return TokenQuotesShort(
|
||||
currentPrice = requireNotNull(quote.price) {
|
||||
"Price is not found in the QuotesResponse. This shouldn't have happened."
|
||||
},
|
||||
priceChanges = mapOf(
|
||||
PriceChangeInterval.H24 to (quote.priceChange24h ?: BigDecimal.ZERO).movePointLeft(2),
|
||||
PriceChangeInterval.WEEK to (quote.priceChange1w ?: BigDecimal.ZERO).movePointLeft(2),
|
||||
PriceChangeInterval.MONTH to (quote.priceChange30d ?: BigDecimal.ZERO).movePointLeft(2),
|
||||
),
|
||||
h24ChangePercent = (quote.priceChange24h ?: BigDecimal.ZERO).movePointLeft(2),
|
||||
weekChangePercent = (quote.priceChange1w ?: BigDecimal.ZERO).movePointLeft(2),
|
||||
monthChangePercent = (quote.priceChange30d ?: BigDecimal.ZERO).movePointLeft(2),
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue