add BackendSavedMovieRepository

This commit is contained in:
2026-08-19 21:59:39 +03:00
parent 58c5da7d8f
commit 9b10bb21fa
4 changed files with 58 additions and 11 deletions
@@ -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,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
@@ -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)
}
}
@@ -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)
}
}