Updated on 2026-08-14
This commit is contained in:
parent
ba36b7d26d
commit
dfcfce392a
5 changed files with 76 additions and 6 deletions
|
|
@ -103,6 +103,7 @@ internal class DefaultMarketsTokenRepository(
|
|||
val tokenMarketsUpdateFetcher = MarketsBatchUpdateFetcher(
|
||||
tangemTechApi = tangemTechApi,
|
||||
marketsApi = marketsApi,
|
||||
analyticsEventHandler = analyticsEventHandler,
|
||||
onApiError = {
|
||||
analyticsEventHandler.send(MarketsDataAnalyticsEvent.List.Error.toEvent())
|
||||
},
|
||||
|
|
@ -141,7 +142,19 @@ internal class DefaultMarketsTokenRepository(
|
|||
response.getOrThrow()
|
||||
}
|
||||
|
||||
return TokenChartConverter.convert(interval, result)
|
||||
return TokenChartConverter.convert(
|
||||
interval = interval,
|
||||
value = result,
|
||||
|
||||
// === Analytics ===
|
||||
onNullPresented = {
|
||||
analyticsEventHandler.send(
|
||||
MarketsDataAnalyticsEvent.ChartNullValuesError(
|
||||
requestPath = "coins/history",
|
||||
),
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun getChartPreview(
|
||||
|
|
@ -163,7 +176,19 @@ internal class DefaultMarketsTokenRepository(
|
|||
)
|
||||
}
|
||||
|
||||
return TokenChartConverter.convert(interval, chart)
|
||||
return TokenChartConverter.convert(
|
||||
interval = interval,
|
||||
value = chart,
|
||||
|
||||
// === Analytics ===
|
||||
onNullPresented = {
|
||||
analyticsEventHandler.send(
|
||||
MarketsDataAnalyticsEvent.ChartNullValuesError(
|
||||
requestPath = "coins/history_preview",
|
||||
),
|
||||
)
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
override suspend fun getTokenInfo(
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
package com.tangem.data.markets
|
||||
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.data.common.utils.retryOnError
|
||||
import com.tangem.data.markets.analytics.MarketsDataAnalyticsEvent
|
||||
import com.tangem.data.markets.converters.TokenMarketChartsConverter
|
||||
import com.tangem.data.markets.converters.TokenQuotesShortConverter
|
||||
import com.tangem.data.markets.converters.toRequestParam
|
||||
|
|
@ -22,6 +24,7 @@ import kotlinx.coroutines.launch
|
|||
internal class MarketsBatchUpdateFetcher(
|
||||
private val marketsApi: TangemTechMarketsApi,
|
||||
private val tangemTechApi: TangemTechApi,
|
||||
private val analyticsEventHandler: AnalyticsEventHandler,
|
||||
private val onApiError: () -> Unit,
|
||||
) : BatchUpdateFetcher<Int, List<TokenMarket>, TokenMarketUpdateRequest> {
|
||||
|
||||
|
|
@ -52,6 +55,7 @@ internal class MarketsBatchUpdateFetcher(
|
|||
updateTasks.forEachIndexed { index, deferred ->
|
||||
launch {
|
||||
val res = deferred.await()
|
||||
checkForNulls(res)
|
||||
val batchToUpdate = toUpdate[index]
|
||||
|
||||
update {
|
||||
|
|
@ -113,6 +117,22 @@ internal class MarketsBatchUpdateFetcher(
|
|||
)
|
||||
}
|
||||
|
||||
private fun checkForNulls(response: TokenMarketChartListResponse) {
|
||||
response.values.forEach { chart ->
|
||||
chart.prices.forEach { (_, price) ->
|
||||
if (price == null) {
|
||||
analyticsEventHandler.send(
|
||||
MarketsDataAnalyticsEvent.ChartNullValuesError(
|
||||
requestPath = "coins/history_preview",
|
||||
),
|
||||
)
|
||||
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private inline fun <T> catchApiError(onError: () -> Unit, block: () -> T): T {
|
||||
return try {
|
||||
block()
|
||||
|
|
|
|||
|
|
@ -36,7 +36,20 @@ sealed interface MarketsDataAnalyticsEvent {
|
|||
}
|
||||
|
||||
fun toEvent(): AnalyticsEvent = when (this) {
|
||||
is ChartNullValuesError -> this
|
||||
is List -> this
|
||||
is Details -> this
|
||||
}
|
||||
|
||||
data class ChartNullValuesError(
|
||||
val requestPath: String,
|
||||
) : AnalyticsEvent(
|
||||
category = "Markets / Chart",
|
||||
event = "Data Error",
|
||||
params = mapOf("Request path" to requestPath),
|
||||
error = IllegalStateException(
|
||||
"Chart data contains null values from the API",
|
||||
),
|
||||
),
|
||||
MarketsDataAnalyticsEvent
|
||||
}
|
||||
|
|
@ -6,11 +6,21 @@ import com.tangem.domain.markets.TokenChart
|
|||
|
||||
internal object TokenChartConverter {
|
||||
|
||||
fun convert(interval: PriceChangeInterval, value: TokenMarketChartResponse): TokenChart {
|
||||
fun convert(
|
||||
interval: PriceChangeInterval,
|
||||
value: TokenMarketChartResponse,
|
||||
onNullPresented: () -> Unit = {},
|
||||
): TokenChart {
|
||||
val points = value.prices.mapNotNull { p -> p.value?.let { p.key to it } }.toMap()
|
||||
|
||||
if (points.size < points.values.size) {
|
||||
onNullPresented()
|
||||
}
|
||||
|
||||
return TokenChart(
|
||||
interval = interval,
|
||||
priceY = value.prices.values.toList(),
|
||||
timeStamps = value.prices.keys.toList(),
|
||||
priceY = points.values.toList(),
|
||||
timeStamps = points.keys.toList(),
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue