mirror of
https://github.com/msfjarvis/compose-lobsters
synced 2025-08-14 22:17: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 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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) }
|
||||||
)
|
)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue