mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 18:47:03 +05:30
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:
parent
ef0b06cbd7
commit
7487664ac2
2 changed files with 35 additions and 15 deletions
|
@ -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,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
@ -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) }
|
||||
)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue