gemini_token_refresher.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package service
  2. import (
  3. "context"
  4. "time"
  5. )
  6. type GeminiTokenRefresher struct {
  7. geminiOAuthService *GeminiOAuthService
  8. }
  9. func NewGeminiTokenRefresher(geminiOAuthService *GeminiOAuthService) *GeminiTokenRefresher {
  10. return &GeminiTokenRefresher{geminiOAuthService: geminiOAuthService}
  11. }
  12. // CacheKey 返回用于分布式锁的缓存键
  13. func (r *GeminiTokenRefresher) CacheKey(account *Account) string {
  14. return GeminiTokenCacheKey(account)
  15. }
  16. func (r *GeminiTokenRefresher) CanRefresh(account *Account) bool {
  17. return account.Platform == PlatformGemini && account.Type == AccountTypeOAuth
  18. }
  19. func (r *GeminiTokenRefresher) NeedsRefresh(account *Account, refreshWindow time.Duration) bool {
  20. if !r.CanRefresh(account) {
  21. return false
  22. }
  23. expiresAt := account.GetCredentialAsTime("expires_at")
  24. if expiresAt == nil {
  25. return false
  26. }
  27. return time.Until(*expiresAt) < refreshWindow
  28. }
  29. func (r *GeminiTokenRefresher) Refresh(ctx context.Context, account *Account) (map[string]any, error) {
  30. tokenInfo, err := r.geminiOAuthService.RefreshAccountToken(ctx, account)
  31. if err != nil {
  32. return nil, err
  33. }
  34. newCredentials := r.geminiOAuthService.BuildAccountCredentials(tokenInfo)
  35. newCredentials = MergeCredentials(account.Credentials, newCredentials)
  36. return newCredentials, nil
  37. }