package cache import ( "context" "encoding/json" "fmt" "time" "github.com/luxsin/app-api/internal/model" "github.com/redis/go-redis/v9" ) const ( modelBrandPrefix = "model:brand:" modelAllKey = "model:all" modelTTL = 30 * time.Minute ) type ModelCache struct { rdb *redis.Client } func NewModelCache(rdb *redis.Client) *ModelCache { return &ModelCache{rdb: rdb} } func (c *ModelCache) Exists(ctx context.Context) (bool, error) { n, err := c.rdb.Exists(ctx, modelAllKey).Result() if err != nil { return false, err } return n > 0, nil } func modelBrandKey(brandName string) string { return modelBrandPrefix + brandName } func (c *ModelCache) GetByBrand(ctx context.Context, brandName string) ([]model.Model, error) { data, err := c.rdb.Get(ctx, modelBrandKey(brandName)).Bytes() if err != nil { return nil, err } var list []model.Model if err := json.Unmarshal(data, &list); err != nil { return nil, fmt.Errorf("unmarshal models: %w", err) } return list, nil } func (c *ModelCache) SetByBrand(ctx context.Context, brandName string, list []model.Model) error { data, err := json.Marshal(list) if err != nil { return fmt.Errorf("marshal models: %w", err) } return c.rdb.Set(ctx, modelBrandKey(brandName), data, modelTTL).Err() } func (c *ModelCache) GetAll(ctx context.Context) ([]model.Model, error) { data, err := c.rdb.Get(ctx, modelAllKey).Bytes() if err != nil { return nil, err } var list []model.Model if err := json.Unmarshal(data, &list); err != nil { return nil, fmt.Errorf("unmarshal models: %w", err) } return list, nil } func (c *ModelCache) SetAll(ctx context.Context, list []model.Model) error { data, err := json.Marshal(list) if err != nil { return fmt.Errorf("marshal models: %w", err) } return c.rdb.Set(ctx, modelAllKey, data, modelTTL).Err() }