mirror of
https://github.com/Dvorinka/SEEN.git
synced 2026-06-04 04:23:01 +00:00
137 lines
4.9 KiB
Go
137 lines
4.9 KiB
Go
package cache
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
)
|
|
|
|
// CatalogCache provides caching for catalog operations
|
|
type CatalogCache struct {
|
|
service *Service
|
|
keys *KeyBuilder
|
|
}
|
|
|
|
// NewCatalogCache creates a new catalog cache
|
|
func NewCatalogCache(service *Service, namespace string) *CatalogCache {
|
|
return &CatalogCache{
|
|
service: service,
|
|
keys: NewKeyBuilder(namespace),
|
|
}
|
|
}
|
|
|
|
// GetDashboard retrieves cached dashboard data
|
|
func (cc *CatalogCache) GetDashboard(ctx context.Context, userID string, target interface{}) error {
|
|
key := cc.keys.CatalogDashboardKey(userID)
|
|
return cc.service.Get(ctx, key, target)
|
|
}
|
|
|
|
// SetDashboard stores dashboard data in cache
|
|
func (cc *CatalogCache) SetDashboard(ctx context.Context, userID string, data interface{}) error {
|
|
key := cc.keys.CatalogDashboardKey(userID)
|
|
return cc.service.Set(ctx, key, data, TTLCatalog)
|
|
}
|
|
|
|
// InvalidateDashboard removes cached dashboard data
|
|
func (cc *CatalogCache) InvalidateDashboard(ctx context.Context, userID string) error {
|
|
key := cc.keys.CatalogDashboardKey(userID)
|
|
return cc.service.Delete(ctx, key)
|
|
}
|
|
|
|
// GetDiscover retrieves cached discover sections
|
|
func (cc *CatalogCache) GetDiscover(ctx context.Context, genre, mediaType string, page int, target interface{}) error {
|
|
key := cc.keys.CatalogDiscoverKey(genre, mediaType, page)
|
|
return cc.service.Get(ctx, key, target)
|
|
}
|
|
|
|
// SetDiscover stores discover sections in cache
|
|
func (cc *CatalogCache) SetDiscover(ctx context.Context, genre, mediaType string, page int, data interface{}) error {
|
|
key := cc.keys.CatalogDiscoverKey(genre, mediaType, page)
|
|
return cc.service.Set(ctx, key, data, TTLCatalog)
|
|
}
|
|
|
|
// GetSearch retrieves cached search results
|
|
func (cc *CatalogCache) GetSearch(ctx context.Context, query, genre, mediaType string, target interface{}) error {
|
|
key := cc.keys.CatalogSearchKey(query, genre, mediaType)
|
|
return cc.service.Get(ctx, key, target)
|
|
}
|
|
|
|
// SetSearch stores search results in cache
|
|
func (cc *CatalogCache) SetSearch(ctx context.Context, query, genre, mediaType string, data interface{}) error {
|
|
key := cc.keys.CatalogSearchKey(query, genre, mediaType)
|
|
return cc.service.Set(ctx, key, data, TTLSearch)
|
|
}
|
|
|
|
// GetWatchLater retrieves cached watch later list
|
|
func (cc *CatalogCache) GetWatchLater(ctx context.Context, userID string, target interface{}) error {
|
|
key := cc.keys.WatchLaterKey(userID)
|
|
return cc.service.Get(ctx, key, target)
|
|
}
|
|
|
|
// SetWatchLater stores watch later list in cache
|
|
func (cc *CatalogCache) SetWatchLater(ctx context.Context, userID string, data interface{}) error {
|
|
key := cc.keys.WatchLaterKey(userID)
|
|
return cc.service.Set(ctx, key, data, TTLCatalog)
|
|
}
|
|
|
|
// InvalidateWatchLater removes cached watch later list
|
|
func (cc *CatalogCache) InvalidateWatchLater(ctx context.Context, userID string) error {
|
|
key := cc.keys.WatchLaterKey(userID)
|
|
return cc.service.Delete(ctx, key)
|
|
}
|
|
|
|
// GetContinueWatching retrieves cached continue watching list
|
|
func (cc *CatalogCache) GetContinueWatching(ctx context.Context, userID string, target interface{}) error {
|
|
key := cc.keys.ContinueWatchingKey(userID)
|
|
return cc.service.Get(ctx, key, target)
|
|
}
|
|
|
|
// SetContinueWatching stores continue watching list in cache
|
|
func (cc *CatalogCache) SetContinueWatching(ctx context.Context, userID string, data interface{}) error {
|
|
key := cc.keys.ContinueWatchingKey(userID)
|
|
return cc.service.Set(ctx, key, data, TTLCatalog)
|
|
}
|
|
|
|
// InvalidateContinueWatching removes cached continue watching list
|
|
func (cc *CatalogCache) InvalidateContinueWatching(ctx context.Context, userID string) error {
|
|
key := cc.keys.ContinueWatchingKey(userID)
|
|
return cc.service.Delete(ctx, key)
|
|
}
|
|
|
|
// InvalidateUserCatalog removes all cached catalog data for a user
|
|
func (cc *CatalogCache) InvalidateUserCatalog(ctx context.Context, userID string) error {
|
|
keys := []string{
|
|
cc.keys.CatalogDashboardKey(userID),
|
|
cc.keys.WatchLaterKey(userID),
|
|
cc.keys.ContinueWatchingKey(userID),
|
|
}
|
|
|
|
return cc.service.Delete(ctx, keys...)
|
|
}
|
|
|
|
// GetRecommendations retrieves cached recommendations
|
|
func (cc *CatalogCache) GetRecommendations(ctx context.Context, userID string, target interface{}) error {
|
|
key := cc.keys.RecommendationKey(userID)
|
|
return cc.service.Get(ctx, key, target)
|
|
}
|
|
|
|
// SetRecommendations stores recommendations in cache
|
|
func (cc *CatalogCache) SetRecommendations(ctx context.Context, userID string, data interface{}) error {
|
|
key := cc.keys.RecommendationKey(userID)
|
|
return cc.service.Set(ctx, key, data, TTLRecommendation)
|
|
}
|
|
|
|
// InvalidateRecommendations removes cached recommendations
|
|
func (cc *CatalogCache) InvalidateRecommendations(ctx context.Context, userID string) error {
|
|
key := cc.keys.RecommendationKey(userID)
|
|
return cc.service.Delete(ctx, key)
|
|
}
|
|
|
|
// WarmupCache pre-populates cache with common queries
|
|
func (cc *CatalogCache) WarmupCache(ctx context.Context, warmupFunc func(ctx context.Context) error) error {
|
|
if warmupFunc == nil {
|
|
return fmt.Errorf("warmup function is required")
|
|
}
|
|
|
|
return warmupFunc(ctx)
|
|
}
|