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 android.app.Application
import androidx.work.Constraints import androidx.work.Constraints
import androidx.work.ExistingPeriodicWorkPolicy import androidx.work.ExistingWorkPolicy
import androidx.work.NetworkType import androidx.work.NetworkType
import androidx.work.PeriodicWorkRequestBuilder import androidx.work.OneTimeWorkRequestBuilder
import androidx.work.WorkManager import androidx.work.WorkManager
import com.deliveryhero.whetstone.Whetstone import com.deliveryhero.whetstone.Whetstone
import com.deliveryhero.whetstone.app.ApplicationComponentOwner import com.deliveryhero.whetstone.app.ApplicationComponentOwner
import com.deliveryhero.whetstone.app.ContributesAppInjector import com.deliveryhero.whetstone.app.ContributesAppInjector
import dev.msfjarvis.claw.android.work.SavedPostUpdaterWorker import dev.msfjarvis.claw.android.work.SavedPostUpdaterWorker
import dev.msfjarvis.claw.core.injection.AppPlugin import dev.msfjarvis.claw.core.injection.AppPlugin
import java.util.concurrent.TimeUnit
import javax.inject.Inject import javax.inject.Inject
@ContributesAppInjector(generateAppComponent = true) @ContributesAppInjector(generateAppComponent = true)
@ -32,14 +31,14 @@ class ClawApplication : Application(), ApplicationComponentOwner {
super.onCreate() super.onCreate()
plugins.forEach { plugin -> plugin.apply(this) } plugins.forEach { plugin -> plugin.apply(this) }
val postUpdateWorkRequest = val postUpdateWorkRequest =
PeriodicWorkRequestBuilder<SavedPostUpdaterWorker>(POST_REFRESH_PERIOD, TimeUnit.HOURS) OneTimeWorkRequestBuilder<SavedPostUpdaterWorker>()
.setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()) .setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build())
.build() .build()
WorkManager.getInstance(this) WorkManager.getInstance(this)
.enqueueUniquePeriodicWork( .enqueueUniqueWork(
"updateSavedPosts", uniqueWorkName = "updateSavedPosts",
ExistingPeriodicWorkPolicy.KEEP, existingWorkPolicy = ExistingWorkPolicy.KEEP,
postUpdateWorkRequest, 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.glance.SavedPostsWidget
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.model.LobstersPostDetails
import dev.msfjarvis.claw.model.UIPost import dev.msfjarvis.claw.model.UIPost
import dev.msfjarvis.claw.model.fromSavedPost import dev.msfjarvis.claw.model.fromSavedPost
import dev.msfjarvis.claw.model.toSavedPost import dev.msfjarvis.claw.model.toSavedPost
import java.time.Instant
import java.time.format.DateTimeFormatter
import javax.inject.Inject import javax.inject.Inject
import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.first
import kotlinx.coroutines.flow.map import kotlinx.coroutines.flow.map
@ -41,12 +43,31 @@ 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 {
savedPostsRepository.savedPosts val postsToUpdate =
.first() savedPostsRepository.savedPosts
.map { post -> lobstersApi.getPostDetails(post.shortId) } .first()
.filterIsInstance<Success<LobstersPostDetails>>() .sortedBy { post ->
.map { result -> result.value.toSavedPost() } Instant.from(DateTimeFormatter.ISO_OFFSET_DATE_TIME.parse(post.createdAt))
.let { savedPostsRepository.savePosts(it) } }
.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( SavedPostsWidget(
savedPostsRepository.savedPosts.map { it.map(UIPost.Companion::fromSavedPost) } savedPostsRepository.savedPosts.map { it.map(UIPost.Companion::fromSavedPost) }
) )