mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-15 06:27:02 +05:30
refactor(android): run post updates in a batch transaction
This commit is contained in:
parent
33210319bb
commit
766f14cd22
2 changed files with 18 additions and 17 deletions
|
@ -30,6 +30,15 @@ constructor(
|
||||||
withContext(dbDispatcher) { savedPostQueries.insertOrReplacePost(post) }
|
withContext(dbDispatcher) { savedPostQueries.insertOrReplacePost(post) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun savePosts(posts: List<SavedPost>) {
|
||||||
|
Napier.d(tag = TAG) { "Saving posts: ${posts.joinToString(",") { it.shortId }}" }
|
||||||
|
withContext(dbDispatcher) {
|
||||||
|
savedPostQueries.transaction {
|
||||||
|
posts.forEach { post -> savedPostQueries.insertOrReplacePost(post) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
suspend fun removePost(post: SavedPost) {
|
suspend fun removePost(post: SavedPost) {
|
||||||
Napier.d(tag = TAG) { "Removing post: ${post.shortId}" }
|
Napier.d(tag = TAG) { "Removing post: ${post.shortId}" }
|
||||||
withContext(dbDispatcher) { savedPostQueries.deletePost(post.shortId) }
|
withContext(dbDispatcher) { savedPostQueries.deletePost(post.shortId) }
|
||||||
|
|
|
@ -12,15 +12,13 @@ import androidx.work.WorkerParameters
|
||||||
import com.deliveryhero.whetstone.ForScope
|
import com.deliveryhero.whetstone.ForScope
|
||||||
import com.deliveryhero.whetstone.worker.ContributesWorker
|
import com.deliveryhero.whetstone.worker.ContributesWorker
|
||||||
import com.deliveryhero.whetstone.worker.WorkerScope
|
import com.deliveryhero.whetstone.worker.WorkerScope
|
||||||
import com.slack.eithernet.ApiResult
|
import com.slack.eithernet.ApiResult.Success
|
||||||
import dev.msfjarvis.claw.android.viewmodel.SavedPostsRepository
|
import dev.msfjarvis.claw.android.viewmodel.SavedPostsRepository
|
||||||
import dev.msfjarvis.claw.api.LobstersApi
|
import dev.msfjarvis.claw.api.LobstersApi
|
||||||
import dev.msfjarvis.claw.common.posts.toDbModel
|
import dev.msfjarvis.claw.common.posts.toDbModel
|
||||||
|
import dev.msfjarvis.claw.model.LobstersPostDetails
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlinx.coroutines.async
|
|
||||||
import kotlinx.coroutines.awaitAll
|
|
||||||
import kotlinx.coroutines.flow.first
|
import kotlinx.coroutines.flow.first
|
||||||
import kotlinx.coroutines.supervisorScope
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* WorkManager-backed [CoroutineWorker] that gets all the posts from [SavedPostsRepository], fetches
|
* WorkManager-backed [CoroutineWorker] that gets all the posts from [SavedPostsRepository], fetches
|
||||||
|
@ -38,19 +36,13 @@ constructor(
|
||||||
private val lobstersApi: LobstersApi,
|
private val lobstersApi: LobstersApi,
|
||||||
) : CoroutineWorker(appContext, workerParams) {
|
) : CoroutineWorker(appContext, workerParams) {
|
||||||
override suspend fun doWork(): Result {
|
override suspend fun doWork(): Result {
|
||||||
val posts = savedPostsRepository.savedPosts.first()
|
savedPostsRepository.savedPosts
|
||||||
supervisorScope {
|
.first()
|
||||||
posts
|
.map { post -> lobstersApi.getPostDetails(post.shortId) }
|
||||||
.map { post ->
|
.filterIsInstance<Success<LobstersPostDetails>>()
|
||||||
async {
|
.map { result -> result.value.toDbModel() }
|
||||||
val details = lobstersApi.getPostDetails(post.shortId)
|
.toList()
|
||||||
if (details is ApiResult.Success) {
|
.let { savedPostsRepository.savePosts(it) }
|
||||||
savedPostsRepository.savePost(details.value.toDbModel())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.awaitAll()
|
|
||||||
}
|
|
||||||
return Result.success()
|
return Result.success()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue