add BackendSavedMovieRepository
This commit is contained in:
+1
-5
@@ -13,7 +13,7 @@ class CacheRecentlyWatchedRepository(
|
||||
private val redis: RedisCache,
|
||||
userId: Long
|
||||
) : RecentlyWatchedRepository {
|
||||
private val prefix = "$PREFIX:$userId"
|
||||
private val prefix = "recently_watched:$userId"
|
||||
|
||||
override suspend fun remove(info: RecentlyWatchedInfo) {
|
||||
info.obtainKeys().forEach { redis.delete(it) }
|
||||
@@ -52,8 +52,4 @@ class CacheRecentlyWatchedRepository(
|
||||
7.days
|
||||
) { wrapper.getAllRecentlyWatched() }
|
||||
}
|
||||
|
||||
companion object {
|
||||
const val PREFIX = "recently_watched"
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
package ru.shadowsparky.vbox.backend.data
|
||||
package ru.shadowsparky.vbox.backend.data.saved
|
||||
|
||||
import app.cash.sqldelight.coroutines.asFlow
|
||||
import app.cash.sqldelight.coroutines.mapToList
|
||||
+47
@@ -0,0 +1,47 @@
|
||||
package ru.shadowsparky.vbox.backend.data.saved
|
||||
|
||||
import kotlinx.coroutines.flow.Flow
|
||||
import kotlinx.coroutines.flow.first
|
||||
import kotlinx.coroutines.flow.flow
|
||||
import ru.shadowsparky.vbox.backend.data.RedisCache
|
||||
import ru.shadowsparky.vbox.shared.domain.SavedMovieRepository
|
||||
import ru.shadowsparky.vbox.shared.domain.model.VideoDetails
|
||||
import kotlin.time.Duration.Companion.days
|
||||
|
||||
class CacheSavedMovieRepository(
|
||||
private val wrapper: SavedMovieRepository,
|
||||
private val redisCache: RedisCache,
|
||||
userId: Long
|
||||
) : SavedMovieRepository {
|
||||
private val ttl = 7.days
|
||||
private val prefix = "saved-movie:$userId"
|
||||
|
||||
override suspend fun save(details: VideoDetails) {
|
||||
obtainKeys(details.id).forEach { redisCache.delete(it) }
|
||||
wrapper.save(details)
|
||||
}
|
||||
|
||||
private fun obtainKeys(id: Long): Set<String> {
|
||||
return setOf(
|
||||
"$prefix:$id",
|
||||
prefix
|
||||
)
|
||||
}
|
||||
|
||||
override fun getAll(): Flow<List<VideoDetails>> {
|
||||
return flow {
|
||||
emit(redisCache.exec(prefix, ttl) { wrapper.getAll().first() })
|
||||
}
|
||||
}
|
||||
|
||||
override fun isSaved(id: Long): Flow<Boolean> {
|
||||
return flow {
|
||||
emit(redisCache.exec("$prefix:$id") { wrapper.isSaved(id).first() })
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun remove(id: Long) {
|
||||
obtainKeys(id).forEach { redisCache.delete(it) }
|
||||
wrapper.remove(id)
|
||||
}
|
||||
}
|
||||
+7
-3
@@ -4,7 +4,9 @@ import org.koin.core.annotation.Factory
|
||||
import ru.shadowsparky.backend.data.Logger
|
||||
import ru.shadowsparky.vbox.backend.AppDatabase
|
||||
import ru.shadowsparky.vbox.backend.data.BackendRemoteEventHandler
|
||||
import ru.shadowsparky.vbox.backend.data.BackendSavedMovieRepository
|
||||
import ru.shadowsparky.vbox.backend.data.RedisCache
|
||||
import ru.shadowsparky.vbox.backend.data.saved.BackendSavedMovieRepository
|
||||
import ru.shadowsparky.vbox.backend.data.saved.CacheSavedMovieRepository
|
||||
import ru.shadowsparky.vbox.shared.di.factory.DispatcherProvider
|
||||
import ru.shadowsparky.vbox.shared.domain.SavedMovieRepository
|
||||
|
||||
@@ -13,9 +15,11 @@ class SavedMovieRepositoryFactory(
|
||||
private val db: AppDatabase,
|
||||
private val dispatcherProvider: DispatcherProvider,
|
||||
private val logger: Logger,
|
||||
private val eventHandler: BackendRemoteEventHandler
|
||||
private val eventHandler: BackendRemoteEventHandler,
|
||||
private val redisCache: RedisCache
|
||||
) {
|
||||
fun create(userId: Long): SavedMovieRepository {
|
||||
return BackendSavedMovieRepository(db, userId, dispatcherProvider, logger, eventHandler)
|
||||
val impl = BackendSavedMovieRepository(db, userId, dispatcherProvider, logger, eventHandler)
|
||||
return CacheSavedMovieRepository(impl, redisCache, userId)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user