Updated on 2026-08-14
This commit is contained in:
parent
2a5fca2b17
commit
417b2f0906
26 changed files with 313 additions and 32 deletions
|
|
@ -4,6 +4,7 @@ import com.tangem.data.news.DefaultNewsErrorResolver
|
|||
import com.tangem.data.news.repository.DefaultNewsRepository
|
||||
import com.tangem.datasource.api.news.NewsApi
|
||||
import com.tangem.datasource.local.news.details.NewsDetailsStore
|
||||
import com.tangem.datasource.local.news.liked.NewsLikedStore
|
||||
import com.tangem.datasource.local.news.trending.TrendingNewsStore
|
||||
import com.tangem.datasource.local.news.viewed.NewsViewedStore
|
||||
import com.tangem.domain.news.NewsErrorResolver
|
||||
|
|
@ -27,6 +28,7 @@ internal object NewsDataModule {
|
|||
newsDetailsStore: NewsDetailsStore,
|
||||
trendingNewsStore: TrendingNewsStore,
|
||||
newsViewedStore: NewsViewedStore,
|
||||
newsLikedStore: NewsLikedStore,
|
||||
newsErrorResolver: NewsErrorResolver,
|
||||
): NewsRepository {
|
||||
return DefaultNewsRepository(
|
||||
|
|
@ -35,6 +37,7 @@ internal object NewsDataModule {
|
|||
newsDetailsStore = newsDetailsStore,
|
||||
trendingNewsStore = trendingNewsStore,
|
||||
newsViewedStore = newsViewedStore,
|
||||
newsLikedStore = newsLikedStore,
|
||||
newsErrorResolver = newsErrorResolver,
|
||||
)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,9 +6,13 @@ import com.tangem.datasource.api.common.response.getOrThrow
|
|||
import com.tangem.datasource.api.news.NewsApi
|
||||
import com.tangem.datasource.api.news.models.response.NewsTrendingResponse
|
||||
import com.tangem.datasource.local.news.details.NewsDetailsStore
|
||||
import com.tangem.datasource.local.news.liked.NewsLikedStore
|
||||
import com.tangem.datasource.local.news.trending.TrendingNewsStore
|
||||
import com.tangem.datasource.local.news.viewed.NewsViewedStore
|
||||
import com.tangem.domain.models.news.*
|
||||
import com.tangem.domain.models.news.ArticleCategory
|
||||
import com.tangem.domain.models.news.DetailedArticle
|
||||
import com.tangem.domain.models.news.ShortArticle
|
||||
import com.tangem.domain.models.news.TrendingNews
|
||||
import com.tangem.domain.news.NewsErrorResolver
|
||||
import com.tangem.domain.news.model.NewsListBatchFlow
|
||||
import com.tangem.domain.news.model.NewsListBatchingContext
|
||||
|
|
@ -27,12 +31,14 @@ import timber.log.Timber
|
|||
* Implementation of [NewsRepository].
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
@Suppress("LongParameterList")
|
||||
internal class DefaultNewsRepository(
|
||||
private val newsApi: NewsApi,
|
||||
private val dispatchers: CoroutineDispatcherProvider,
|
||||
private val newsDetailsStore: NewsDetailsStore,
|
||||
private val trendingNewsStore: TrendingNewsStore,
|
||||
private val newsViewedStore: NewsViewedStore,
|
||||
private val newsLikedStore: NewsLikedStore,
|
||||
private val newsErrorResolver: NewsErrorResolver,
|
||||
) : NewsRepository {
|
||||
|
||||
|
|
@ -71,9 +77,17 @@ internal class DefaultNewsRepository(
|
|||
}
|
||||
|
||||
override fun observeDetailedArticles(): Flow<Map<Int, DetailedArticle>> {
|
||||
return newsDetailsStore.getAll().map { articles ->
|
||||
articles.associateBy(DetailedArticle::id)
|
||||
}
|
||||
return newsDetailsStore.getAll()
|
||||
.combine(newsLikedStore.getAll()) { articles, likedFlags ->
|
||||
articles.map { article ->
|
||||
article.copy(
|
||||
isLiked = isNewsLiked(article.id),
|
||||
)
|
||||
}
|
||||
}
|
||||
.map { articles ->
|
||||
articles.associateBy(DetailedArticle::id)
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun fetchDetailedArticles(newsIds: Collection<Int>, language: String?) {
|
||||
|
|
@ -118,6 +132,16 @@ internal class DefaultNewsRepository(
|
|||
newsViewedStore.updateViewed(articleIds, viewed)
|
||||
}
|
||||
|
||||
private suspend fun isNewsLiked(articleId: Int): Boolean {
|
||||
return newsLikedStore.getSync()[articleId] == true
|
||||
}
|
||||
|
||||
override suspend fun toggleNewsLiked(articleId: Int): Boolean = withContext(dispatchers.io) {
|
||||
val isNewsLikedValue = !isNewsLiked(articleId)
|
||||
newsLikedStore.updateLiked(listOf(articleId), isNewsLikedValue)
|
||||
isNewsLikedValue
|
||||
}
|
||||
|
||||
private fun updateViewedStatusForNewsBatch(
|
||||
newsBatchFlow: NewsListBatchFlow,
|
||||
scope: CoroutineScope,
|
||||
|
|
@ -148,7 +172,9 @@ internal class DefaultNewsRepository(
|
|||
async {
|
||||
newsApi.getNewsDetails(newsId = newsId, language = language)
|
||||
.getOrThrow()
|
||||
.toDomainDetailedArticle()
|
||||
.toDomainDetailedArticle(
|
||||
isLiked = isNewsLiked(newsId),
|
||||
)
|
||||
}
|
||||
}.awaitAll()
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ import com.tangem.datasource.api.news.models.response.NewsOriginalArticleDto
|
|||
import com.tangem.datasource.api.news.models.response.NewsRelatedTokenDto
|
||||
import com.tangem.domain.models.news.*
|
||||
|
||||
internal fun NewsDetailsResponse.toDomainDetailedArticle(): DetailedArticle {
|
||||
internal fun NewsDetailsResponse.toDomainDetailedArticle(isLiked: Boolean): DetailedArticle {
|
||||
return DetailedArticle(
|
||||
id = id,
|
||||
createdAt = createdAt,
|
||||
|
|
@ -20,6 +20,7 @@ internal fun NewsDetailsResponse.toDomainDetailedArticle(): DetailedArticle {
|
|||
shortContent = shortContent,
|
||||
content = content,
|
||||
originalArticles = originalArticles.map { it.toDomainOriginalArticle() },
|
||||
isLiked = isLiked,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue