This commit is contained in:
2026-08-19 22:06:01 +03:00
parent 9b10bb21fa
commit 82ad688a92
4 changed files with 12 additions and 15 deletions
@@ -71,7 +71,7 @@ class RedisCache(
} }
} }
suspend inline fun <reified T> exec( suspend inline fun <reified T> transact(
key: String, key: String,
ttl: Duration? = null, ttl: Duration? = null,
createNew: suspend () -> T createNew: suspend () -> T
@@ -16,7 +16,7 @@ class CacheVideoApi(
private val ttl = 3.days private val ttl = 3.days
override suspend fun fetchNewVideos(query: String?): VideosResponse { override suspend fun fetchNewVideos(query: String?): VideosResponse {
return redis.exec("$PREFIX:videos:$query", ttl) { return redis.transact("$PREFIX:videos:$query", ttl) {
wrapper.fetchNewVideos(query).let { wrapper.fetchNewVideos(query).let {
if (query != null) { if (query != null) {
it.copy(items = filter.filter(it.items, query)) it.copy(items = filter.filter(it.items, query))
@@ -28,11 +28,11 @@ class CacheVideoApi(
} }
override suspend fun fetchDetails(id: Long): VideoDetails { override suspend fun fetchDetails(id: Long): VideoDetails {
return redis.exec("$PREFIX:details:$id", ttl) { wrapper.fetchDetails(id) } return redis.transact("$PREFIX:details:$id", ttl) { wrapper.fetchDetails(id) }
} }
override suspend fun fetchVideoLinks(id: Long, seasonId: Long?): VideoLinksResponse { override suspend fun fetchVideoLinks(id: Long, seasonId: Long?): VideoLinksResponse {
return redis.exec("$PREFIX:links:$id:$seasonId", ttl) { return redis.transact("$PREFIX:links:$id:$seasonId", ttl) {
wrapper.fetchVideoLinks(id, seasonId) wrapper.fetchVideoLinks(id, seasonId)
} }
} }
@@ -38,7 +38,7 @@ class CacheRecentlyWatchedRepository(
): Flow<List<RecentlyWatchedInfo>> { ): Flow<List<RecentlyWatchedInfo>> {
return flow { return flow {
emit( emit(
redis.exec( redis.transact(
"$prefix:$movieId:$seasonId", "$prefix:$movieId:$seasonId",
7.days 7.days
) { wrapper.queryRecentlyWatched(movieId, seasonId).first() } ) { wrapper.queryRecentlyWatched(movieId, seasonId).first() }
@@ -47,7 +47,7 @@ class CacheRecentlyWatchedRepository(
} }
override suspend fun getAllRecentlyWatched(): List<RecentlyWatchedInfo> { override suspend fun getAllRecentlyWatched(): List<RecentlyWatchedInfo> {
return redis.exec( return redis.transact(
prefix, prefix,
7.days 7.days
) { wrapper.getAllRecentlyWatched() } ) { wrapper.getAllRecentlyWatched() }
@@ -10,38 +10,35 @@ import kotlin.time.Duration.Companion.days
class CacheSavedMovieRepository( class CacheSavedMovieRepository(
private val wrapper: SavedMovieRepository, private val wrapper: SavedMovieRepository,
private val redisCache: RedisCache, private val redis: RedisCache,
userId: Long userId: Long
) : SavedMovieRepository { ) : SavedMovieRepository {
private val ttl = 7.days private val ttl = 7.days
private val prefix = "saved-movie:$userId" private val prefix = "saved-movie:$userId"
override suspend fun save(details: VideoDetails) { override suspend fun save(details: VideoDetails) {
obtainKeys(details.id).forEach { redisCache.delete(it) } obtainKeys(details.id).forEach { redis.delete(it) }
wrapper.save(details) wrapper.save(details)
} }
private fun obtainKeys(id: Long): Set<String> { private fun obtainKeys(id: Long): Set<String> {
return setOf( return setOf("$prefix:$id", prefix)
"$prefix:$id",
prefix
)
} }
override fun getAll(): Flow<List<VideoDetails>> { override fun getAll(): Flow<List<VideoDetails>> {
return flow { return flow {
emit(redisCache.exec(prefix, ttl) { wrapper.getAll().first() }) emit(redis.transact(prefix, ttl) { wrapper.getAll().first() })
} }
} }
override fun isSaved(id: Long): Flow<Boolean> { override fun isSaved(id: Long): Flow<Boolean> {
return flow { return flow {
emit(redisCache.exec("$prefix:$id") { wrapper.isSaved(id).first() }) emit(redis.transact("$prefix:$id") { wrapper.isSaved(id).first() })
} }
} }
override suspend fun remove(id: Long) { override suspend fun remove(id: Long) {
obtainKeys(id).forEach { redisCache.delete(it) } obtainKeys(id).forEach { redis.delete(it) }
wrapper.remove(id) wrapper.remove(id)
} }
} }