package service import ( "context" "time" ) type GeminiTokenRefresher struct { geminiOAuthService *GeminiOAuthService } func NewGeminiTokenRefresher(geminiOAuthService *GeminiOAuthService) *GeminiTokenRefresher { return &GeminiTokenRefresher{geminiOAuthService: geminiOAuthService} } func (r *GeminiTokenRefresher) CanRefresh(account *Account) bool { return account.Platform == PlatformGemini && account.Type == AccountTypeOAuth } func (r *GeminiTokenRefresher) NeedsRefresh(account *Account, refreshWindow time.Duration) bool { if !r.CanRefresh(account) { return false } expiresAt := account.GetCredentialAsTime("expires_at") if expiresAt == nil { return false } return time.Until(*expiresAt) < refreshWindow } func (r *GeminiTokenRefresher) Refresh(ctx context.Context, account *Account) (map[string]any, error) { tokenInfo, err := r.geminiOAuthService.RefreshAccountToken(ctx, account) if err != nil { return nil, err } newCredentials := r.geminiOAuthService.BuildAccountCredentials(tokenInfo) for k, v := range account.Credentials { if _, exists := newCredentials[k]; !exists { newCredentials[k] = v } } return newCredentials, nil }