add BackendSavedMovieRepository
This commit is contained in:
+1
-5
@@ -13,7 +13,7 @@ class CacheRecentlyWatchedRepository(
|
|||||||
private val redis: RedisCache,
|
private val redis: RedisCache,
|
||||||
userId: Long
|
userId: Long
|
||||||
) : RecentlyWatchedRepository {
|
) : RecentlyWatchedRepository {
|
||||||
private val prefix = "$PREFIX:$userId"
|
private val prefix = "recently_watched:$userId"
|
||||||
|
|
||||||
override suspend fun remove(info: RecentlyWatchedInfo) {
|
override suspend fun remove(info: RecentlyWatchedInfo) {
|
||||||
info.obtainKeys().forEach { redis.delete(it) }
|
info.obtainKeys().forEach { redis.delete(it) }
|
||||||
@@ -52,8 +52,4 @@ class CacheRecentlyWatchedRepository(
|
|||||||
7.days
|
7.days
|
||||||
) { wrapper.getAllRecentlyWatched() }
|
) { wrapper.getAllRecentlyWatched() }
|
||||||
}
|
}
|
||||||
|
|
||||||
companion object {
|
|
||||||
const val PREFIX = "recently_watched"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -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.asFlow
|
||||||
import app.cash.sqldelight.coroutines.mapToList
|
import app.cash.sqldelight.coroutines.mapToList
|
||||||
@@ -74,4 +74,4 @@ class BackendSavedMovieRepository(
|
|||||||
private companion object {
|
private companion object {
|
||||||
const val TAG = "BackendSavedMovieRepository"
|
const val TAG = "BackendSavedMovieRepository"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+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)
|
||||||
|
}
|
||||||
|
}
|
||||||
+8
-4
@@ -4,7 +4,9 @@ import org.koin.core.annotation.Factory
|
|||||||
import ru.shadowsparky.backend.data.Logger
|
import ru.shadowsparky.backend.data.Logger
|
||||||
import ru.shadowsparky.vbox.backend.AppDatabase
|
import ru.shadowsparky.vbox.backend.AppDatabase
|
||||||
import ru.shadowsparky.vbox.backend.data.BackendRemoteEventHandler
|
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.di.factory.DispatcherProvider
|
||||||
import ru.shadowsparky.vbox.shared.domain.SavedMovieRepository
|
import ru.shadowsparky.vbox.shared.domain.SavedMovieRepository
|
||||||
|
|
||||||
@@ -13,9 +15,11 @@ class SavedMovieRepositoryFactory(
|
|||||||
private val db: AppDatabase,
|
private val db: AppDatabase,
|
||||||
private val dispatcherProvider: DispatcherProvider,
|
private val dispatcherProvider: DispatcherProvider,
|
||||||
private val logger: Logger,
|
private val logger: Logger,
|
||||||
private val eventHandler: BackendRemoteEventHandler
|
private val eventHandler: BackendRemoteEventHandler,
|
||||||
|
private val redisCache: RedisCache
|
||||||
) {
|
) {
|
||||||
fun create(userId: Long): SavedMovieRepository {
|
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