diff --git a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/recent/CacheRecentlyWatchedRepository.kt b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/recent/CacheRecentlyWatchedRepository.kt index 60278e6..f69d8b3 100644 --- a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/recent/CacheRecentlyWatchedRepository.kt +++ b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/recent/CacheRecentlyWatchedRepository.kt @@ -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" - } } diff --git a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/BackendSavedMovieRepository.kt b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/saved/BackendSavedMovieRepository.kt similarity index 98% rename from apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/BackendSavedMovieRepository.kt rename to apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/saved/BackendSavedMovieRepository.kt index db35b0c..f404a8f 100644 --- a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/BackendSavedMovieRepository.kt +++ b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/saved/BackendSavedMovieRepository.kt @@ -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 @@ -74,4 +74,4 @@ class BackendSavedMovieRepository( private companion object { const val TAG = "BackendSavedMovieRepository" } -} +} \ No newline at end of file diff --git a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/saved/CacheSavedMovieRepository.kt b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/saved/CacheSavedMovieRepository.kt new file mode 100644 index 0000000..ad72422 --- /dev/null +++ b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/data/saved/CacheSavedMovieRepository.kt @@ -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 { + return setOf( + "$prefix:$id", + prefix + ) + } + + override fun getAll(): Flow> { + return flow { + emit(redisCache.exec(prefix, ttl) { wrapper.getAll().first() }) + } + } + + override fun isSaved(id: Long): Flow { + 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) + } +} diff --git a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/di/factory/SavedMovieRepositoryFactory.kt b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/di/factory/SavedMovieRepositoryFactory.kt index 66794b0..2fbec99 100644 --- a/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/di/factory/SavedMovieRepositoryFactory.kt +++ b/apps/vbox/backend/src/main/kotlin/ru/shadowsparky/vbox/backend/di/factory/SavedMovieRepositoryFactory.kt @@ -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) } -} \ No newline at end of file +}