Add auto refresh to wulkanowy repo

This commit is contained in:
Mikołaj Pich 2024-05-22 20:23:57 +02:00
parent 24abe47332
commit 859c6ef154
No known key found for this signature in database
2 changed files with 18 additions and 2 deletions

View File

@ -6,6 +6,8 @@ import io.github.wulkanowy.data.api.services.WulkanowyService
import io.github.wulkanowy.data.db.dao.AdminMessageDao import io.github.wulkanowy.data.db.dao.AdminMessageDao
import io.github.wulkanowy.data.db.entities.AdminMessage import io.github.wulkanowy.data.db.entities.AdminMessage
import io.github.wulkanowy.data.networkBoundResource import io.github.wulkanowy.data.networkBoundResource
import io.github.wulkanowy.utils.AutoRefreshHelper
import io.github.wulkanowy.utils.getRefreshKey
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.filterNot import kotlinx.coroutines.flow.filterNot
import kotlinx.coroutines.sync.Mutex import kotlinx.coroutines.sync.Mutex
@ -18,10 +20,13 @@ class WulkanowyRepository @Inject constructor(
private val wulkanowyService: WulkanowyService, private val wulkanowyService: WulkanowyService,
private val adminMessageDao: AdminMessageDao, private val adminMessageDao: AdminMessageDao,
private val preferencesRepository: PreferencesRepository, private val preferencesRepository: PreferencesRepository,
private val refreshHelper: AutoRefreshHelper,
) { ) {
private val saveFetchResultMutex = Mutex() private val saveFetchResultMutex = Mutex()
private val cacheKey = "mapping"
fun getAdminMessages(): Flow<Resource<List<AdminMessage>>> = fun getAdminMessages(): Flow<Resource<List<AdminMessage>>> =
networkBoundResource( networkBoundResource(
mutex = saveFetchResultMutex, mutex = saveFetchResultMutex,
@ -38,7 +43,11 @@ class WulkanowyRepository @Inject constructor(
suspend fun getMapping(): Mapping? { suspend fun getMapping(): Mapping? {
var savedMapping = preferencesRepository.mapping var savedMapping = preferencesRepository.mapping
if (savedMapping == null) { val isExpired = refreshHelper.shouldBeRefreshed(
key = getRefreshKey(cacheKey)
)
if (savedMapping == null || isExpired) {
fetchMapping() fetchMapping()
savedMapping = preferencesRepository.mapping savedMapping = preferencesRepository.mapping
} }
@ -49,6 +58,9 @@ class WulkanowyRepository @Inject constructor(
suspend fun fetchMapping() { suspend fun fetchMapping() {
runCatching { wulkanowyService.getMapping() } runCatching { wulkanowyService.getMapping() }
.onFailure { Timber.e(it) } .onFailure { Timber.e(it) }
.onSuccess { preferencesRepository.mapping = it } .onSuccess {
preferencesRepository.mapping = it
refreshHelper.updateLastRefreshTimestamp(cacheKey)
}
} }
} }

View File

@ -30,6 +30,10 @@ fun getRefreshKey(name: String, mailbox: Mailbox?, folder: MessageFolder): Strin
return "${name}_${mailbox?.globalKey ?: "all"}_${folder.id}" return "${name}_${mailbox?.globalKey ?: "all"}_${folder.id}"
} }
fun getRefreshKey(name: String): String {
return name
}
class AutoRefreshHelper @Inject constructor( class AutoRefreshHelper @Inject constructor(
@ApplicationContext private val context: Context, @ApplicationContext private val context: Context,
private val sharedPref: SharedPrefProvider private val sharedPref: SharedPrefProvider