diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt index 844aab91..ed7a1c2c 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ClawApplication.kt @@ -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(POST_REFRESH_PERIOD, TimeUnit.HOURS) + OneTimeWorkRequestBuilder() .setConstraints(Constraints.Builder().setRequiredNetworkType(NetworkType.CONNECTED).build()) .build() WorkManager.getInstance(this) - .enqueueUniquePeriodicWork( - "updateSavedPosts", - ExistingPeriodicWorkPolicy.KEEP, - postUpdateWorkRequest, + .enqueueUniqueWork( + uniqueWorkName = "updateSavedPosts", + existingWorkPolicy = ExistingWorkPolicy.KEEP, + request = postUpdateWorkRequest, ) } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/work/SavedPostUpdaterWorker.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/work/SavedPostUpdaterWorker.kt index ff46a58e..907d8abe 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/work/SavedPostUpdaterWorker.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/work/SavedPostUpdaterWorker.kt @@ -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>() - .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() + + 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) } )