package repository import ( "context" "strings" "time" "github.com/Wei-Shaw/sub2api/internal/config" "github.com/Wei-Shaw/sub2api/internal/service" "github.com/redis/go-redis/v9" ) const dashboardStatsCacheKey = "dashboard:stats:v1" type dashboardCache struct { rdb *redis.Client keyPrefix string } func NewDashboardCache(rdb *redis.Client, cfg *config.Config) service.DashboardStatsCache { prefix := "sub2api:" if cfg != nil { prefix = strings.TrimSpace(cfg.Dashboard.KeyPrefix) } if prefix != "" && !strings.HasSuffix(prefix, ":") { prefix += ":" } return &dashboardCache{ rdb: rdb, keyPrefix: prefix, } } func (c *dashboardCache) GetDashboardStats(ctx context.Context) (string, error) { val, err := c.rdb.Get(ctx, c.buildKey()).Result() if err != nil { if err == redis.Nil { return "", service.ErrDashboardStatsCacheMiss } return "", err } return val, nil } func (c *dashboardCache) SetDashboardStats(ctx context.Context, data string, ttl time.Duration) error { return c.rdb.Set(ctx, c.buildKey(), data, ttl).Err() } func (c *dashboardCache) buildKey() string { if c.keyPrefix == "" { return dashboardStatsCacheKey } return c.keyPrefix + dashboardStatsCacheKey } func (c *dashboardCache) DeleteDashboardStats(ctx context.Context) error { return c.rdb.Del(ctx, c.buildKey()).Err() }