Updated on 2026-08-14

This commit is contained in:
Tangem 2024-08-12 14:38:46 +03:00
parent 54800d32cc
commit faa58cf142
39 changed files with 722 additions and 245 deletions

View file

@ -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
}
}

View file

@ -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,

View file

@ -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(

View file

@ -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"

View file

@ -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.")
}

View file

@ -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),
)
}

View file

@ -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),
)

View file

@ -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),
)
}
}