| 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() |
| } |
|
|