refactor: rework post update worker logic

Directly enqueue jobs on application launch and space out API requests to avoid rate limits
This commit is contained in:
Harsh Shandilya 2025-07-22 00:36:11 +05:30
parent ef0b06cbd7
commit 7487664ac2
2 changed files with 35 additions and 15 deletions

View file

@ -8,16 +8,15 @@ package dev.msfjarvis.claw.android
import android.app.Application
import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.ExistingWorkPolicy
import androidx.work.NetworkType
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager
import com.deliveryhero.whetstone.Whetstone
import com.deliveryhero.whetstone.app.ApplicationComponentOwner
import com.deliveryhero.whetstone.app.ContributesAppInjector
import dev.msfjarvis.claw.android.work.SavedPostUpdaterWorker
import dev.msfjarvis.claw.core.injection.AppPlugin
import java.util.concurrent.TimeUnit
import javax.inject.Inject
@ContributesAppInjector(generateAppComponent = true)
@ -32,14 +31,14 @@ class ClawApplication : Application(), ApplicationComponentOwner {
super.onCreate()
plugins.forEach { plugin -> plugin.apply(this) }
val postUpdateWorkRequest =
PeriodicWorkRequestBuilder<SavedPostUpdaterWorker>(POST_REFRESH_PERIOD, TimeUnit.HOURS)
OneTimeWorkRequestBuilder<SavedPostUpdaterWorker>()
.setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
.build()
WorkManager.getInstance(this)
.enqueueUniquePeriodicWork(
"updateSavedPosts",
ExistingPeriodicWorkPolicy.KEEP,
postUpdateWorkRequest,
.enqueueUniqueWork(
uniqueWorkName = "updateSavedPosts",
existingWorkPolicy = ExistingWorkPolicy.KEEP,
request = postUpdateWorkRequest,
)
}

View file

@ -17,11 +17,13 @@ import com.squareup.anvil.annotations.optional.ForScope
import dev.msfjarvis.claw.android.glance.SavedPostsWidget
import dev.msfjarvis.claw.android.viewmodel.SavedPostsRepository
import dev.msfjarvis.claw.api.LobstersApi
import dev.msfjarvis.claw.model.LobstersPostDetails
import dev.msfjarvis.claw.model.UIPost
import dev.msfjarvis.claw.model.fromSavedPost
import dev.msfjarvis.claw.model.toSavedPost
import java.time.Instant
import java.time.format.DateTimeFormatter
import javax.inject.Inject
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map
@ -41,12 +43,31 @@ constructor(
private val lobstersApi: LobstersApi,
) : CoroutineWorker(appContext, workerParams) {
override suspend fun doWork(): Result {
savedPostsRepository.savedPosts
.first()
.map { post -> lobstersApi.getPostDetails(post.shortId) }
.filterIsInstance<Success<LobstersPostDetails>>()
.map { result -> result.value.toSavedPost() }
.let { savedPostsRepository.savePosts(it) }
val postsToUpdate =
savedPostsRepository.savedPosts
.first()
.sortedBy { post ->
Instant.from(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(post.createdAt))
}
.take(30)
val updatedPosts = mutableListOf<dev.msfjarvis.claw.database.local.SavedPost>()
for (post in postsToUpdate) {
when (val result = lobstersApi.getPostDetails(post.shortId)) {
is Success -> {
updatedPosts.add(result.value.toSavedPost())
}
else -> {
// Continue to the next post if the API call fails
}
}
// Add a 1-second delay to avoid rate-limiting
delay(1000)
}
savedPostsRepository.savePosts(updatedPosts)
SavedPostsWidget(
savedPostsRepository.savedPosts.map { it.map(UIPost.Companion::fromSavedPost) }
)