package service import ( "context" "strconv" "time" ) // AntigravityTokenRefresher 实现 TokenRefresher 接口 type AntigravityTokenRefresher struct { antigravityOAuthService *AntigravityOAuthService } func NewAntigravityTokenRefresher(antigravityOAuthService *AntigravityOAuthService) *AntigravityTokenRefresher { return &AntigravityTokenRefresher{ antigravityOAuthService: antigravityOAuthService, } } // CanRefresh 检查是否可以刷新此账户 func (r *AntigravityTokenRefresher) CanRefresh(account *Account) bool { return account.Platform == PlatformAntigravity && account.Type == AccountTypeOAuth } // NeedsRefresh 检查账户是否需要刷新 func (r *AntigravityTokenRefresher) NeedsRefresh(account *Account, refreshWindow time.Duration) bool { if !r.CanRefresh(account) { return false } expiresAtStr := account.GetCredential("expires_at") if expiresAtStr == "" { return false } expiresAt, err := strconv.ParseInt(expiresAtStr, 10, 64) if err != nil { return false } expiryTime := time.Unix(expiresAt, 0) return time.Until(expiryTime) < refreshWindow } // Refresh 执行 token 刷新 func (r *AntigravityTokenRefresher) Refresh(ctx context.Context, account *Account) (map[string]any, error) { tokenInfo, err := r.antigravityOAuthService.RefreshAccountToken(ctx, account) if err != nil { return nil, err } newCredentials := r.antigravityOAuthService.BuildAccountCredentials(tokenInfo) for k, v := range account.Credentials { if _, exists := newCredentials[k]; !exists { newCredentials[k] = v } } return newCredentials, nil }