refactor(android): run post updates in a batch transaction

This commit is contained in:
Harsh Shandilya 2022-12-10 19:08:27 +05:30
parent 33210319bb
commit 766f14cd22
No known key found for this signature in database
2 changed files with 18 additions and 17 deletions

View file

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

View file

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