package repository import ( "context" "fmt" "time" "github.com/Wei-Shaw/sub2api/internal/service" "github.com/redis/go-redis/v9" ) const ( oauthTokenKeyPrefix = "oauth:token:" oauthRefreshLockKeyPrefix = "oauth:refresh_lock:" ) type geminiTokenCache struct { rdb *redis.Client } func NewGeminiTokenCache(rdb *redis.Client) service.GeminiTokenCache { return &geminiTokenCache{rdb: rdb} } func (c *geminiTokenCache) GetAccessToken(ctx context.Context, cacheKey string) (string, error) { key := fmt.Sprintf("%s%s", oauthTokenKeyPrefix, cacheKey) return c.rdb.Get(ctx, key).Result() } func (c *geminiTokenCache) SetAccessToken(ctx context.Context, cacheKey string, token string, ttl time.Duration) error { key := fmt.Sprintf("%s%s", oauthTokenKeyPrefix, cacheKey) return c.rdb.Set(ctx, key, token, ttl).Err() } func (c *geminiTokenCache) DeleteAccessToken(ctx context.Context, cacheKey string) error { key := fmt.Sprintf("%s%s", oauthTokenKeyPrefix, cacheKey) return c.rdb.Del(ctx, key).Err() } func (c *geminiTokenCache) AcquireRefreshLock(ctx context.Context, cacheKey string, ttl time.Duration) (bool, error) { key := fmt.Sprintf("%s%s", oauthRefreshLockKeyPrefix, cacheKey) return c.rdb.SetNX(ctx, key, 1, ttl).Result() } func (c *geminiTokenCache) ReleaseRefreshLock(ctx context.Context, cacheKey string) error { key := fmt.Sprintf("%s%s", oauthRefreshLockKeyPrefix, cacheKey) return c.rdb.Del(ctx, key).Err() }