fix(lint): 修复 golangci-lint 检查错误
- 修复未检查的错误返回值 (errcheck) - 移除未使用的 httpClient 字段 (unused) - 修复低效赋值问题 (ineffassign) - 使用 switch 替代 if-else 链 (staticcheck QF1003) - 修复错误字符串首字母大写问题 (staticcheck ST1005) - 运行 gofmt 格式化代码
This commit is contained in:
@@ -1023,6 +1023,10 @@ func (h *AccountHandler) RefreshTier(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
tierID, storageInfo, err := h.geminiOAuthService.FetchGoogleOneTier(c.Request.Context(), accessToken, proxyURL)
|
tierID, storageInfo, err := h.geminiOAuthService.FetchGoogleOneTier(c.Request.Context(), accessToken, proxyURL)
|
||||||
|
if err != nil {
|
||||||
|
response.ErrorFrom(c, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
if account.Extra == nil {
|
if account.Extra == nil {
|
||||||
account.Extra = make(map[string]any)
|
account.Extra = make(map[string]any)
|
||||||
@@ -1044,10 +1048,10 @@ func (h *AccountHandler) RefreshTier(c *gin.Context) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
response.Success(c, gin.H{
|
response.Success(c, gin.H{
|
||||||
"tier_id": tierID,
|
"tier_id": tierID,
|
||||||
"drive_storage_limit": account.Extra["drive_storage_limit"],
|
"drive_storage_limit": account.Extra["drive_storage_limit"],
|
||||||
"drive_storage_usage": account.Extra["drive_storage_usage"],
|
"drive_storage_usage": account.Extra["drive_storage_usage"],
|
||||||
"updated_at": account.Extra["drive_tier_updated_at"],
|
"updated_at": account.Extra["drive_tier_updated_at"],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -22,17 +22,11 @@ type DriveClient interface {
|
|||||||
GetStorageQuota(ctx context.Context, accessToken, proxyURL string) (*DriveStorageInfo, error)
|
GetStorageQuota(ctx context.Context, accessToken, proxyURL string) (*DriveStorageInfo, error)
|
||||||
}
|
}
|
||||||
|
|
||||||
type driveClient struct {
|
type driveClient struct{}
|
||||||
httpClient *http.Client
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewDriveClient creates a new Drive API client
|
// NewDriveClient creates a new Drive API client
|
||||||
func NewDriveClient() DriveClient {
|
func NewDriveClient() DriveClient {
|
||||||
return &driveClient{
|
return &driveClient{}
|
||||||
httpClient: &http.Client{
|
|
||||||
Timeout: 10 * time.Second,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// GetStorageQuota fetches storage quota from Google Drive API
|
// GetStorageQuota fetches storage quota from Google Drive API
|
||||||
@@ -71,7 +65,7 @@ func (c *driveClient) GetStorageQuota(ctx context.Context, accessToken, proxyURL
|
|||||||
|
|
||||||
// Rate limit - retry with exponential backoff
|
// Rate limit - retry with exponential backoff
|
||||||
if resp.StatusCode == http.StatusTooManyRequests && attempt < maxRetries-1 {
|
if resp.StatusCode == http.StatusTooManyRequests && attempt < maxRetries-1 {
|
||||||
resp.Body.Close()
|
_ = resp.Body.Close()
|
||||||
backoff := time.Duration(1<<uint(attempt)) * time.Second // 1s, 2s, 4s
|
backoff := time.Duration(1<<uint(attempt)) * time.Second // 1s, 2s, 4s
|
||||||
time.Sleep(backoff)
|
time.Sleep(backoff)
|
||||||
continue
|
continue
|
||||||
@@ -79,11 +73,11 @@ func (c *driveClient) GetStorageQuota(ctx context.Context, accessToken, proxyURL
|
|||||||
|
|
||||||
// Other errors - return immediately
|
// Other errors - return immediately
|
||||||
body, _ := io.ReadAll(resp.Body)
|
body, _ := io.ReadAll(resp.Body)
|
||||||
resp.Body.Close()
|
_ = resp.Body.Close()
|
||||||
return nil, fmt.Errorf("Drive API error (status %d): %s", resp.StatusCode, string(body))
|
return nil, fmt.Errorf("drive API error (status %d): %s", resp.StatusCode, string(body))
|
||||||
}
|
}
|
||||||
|
|
||||||
defer resp.Body.Close()
|
defer func() { _ = resp.Body.Close() }()
|
||||||
|
|
||||||
// Parse response
|
// Parse response
|
||||||
var result struct {
|
var result struct {
|
||||||
@@ -100,10 +94,10 @@ func (c *driveClient) GetStorageQuota(ctx context.Context, accessToken, proxyURL
|
|||||||
// Parse limit and usage (handle both string and number formats)
|
// Parse limit and usage (handle both string and number formats)
|
||||||
var limit, usage int64
|
var limit, usage int64
|
||||||
if result.StorageQuota.Limit != "" {
|
if result.StorageQuota.Limit != "" {
|
||||||
fmt.Sscanf(result.StorageQuota.Limit, "%d", &limit)
|
_, _ = fmt.Sscanf(result.StorageQuota.Limit, "%d", &limit)
|
||||||
}
|
}
|
||||||
if result.StorageQuota.Usage != "" {
|
if result.StorageQuota.Usage != "" {
|
||||||
fmt.Sscanf(result.StorageQuota.Usage, "%d", &usage)
|
_, _ = fmt.Sscanf(result.StorageQuota.Usage, "%d", &usage)
|
||||||
}
|
}
|
||||||
|
|
||||||
return &DriveStorageInfo{
|
return &DriveStorageInfo{
|
||||||
|
|||||||
@@ -18,11 +18,11 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
TierAIPremium = "AI_PREMIUM"
|
TierAIPremium = "AI_PREMIUM"
|
||||||
TierGoogleOneStandard = "GOOGLE_ONE_STANDARD"
|
TierGoogleOneStandard = "GOOGLE_ONE_STANDARD"
|
||||||
TierGoogleOneBasic = "GOOGLE_ONE_BASIC"
|
TierGoogleOneBasic = "GOOGLE_ONE_BASIC"
|
||||||
TierFree = "FREE"
|
TierFree = "FREE"
|
||||||
TierGoogleOneUnknown = "GOOGLE_ONE_UNKNOWN"
|
TierGoogleOneUnknown = "GOOGLE_ONE_UNKNOWN"
|
||||||
TierGoogleOneUnlimited = "GOOGLE_ONE_UNLIMITED"
|
TierGoogleOneUnlimited = "GOOGLE_ONE_UNLIMITED"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -340,7 +340,8 @@ func (s *GeminiOAuthService) ExchangeCode(ctx context.Context, input *GeminiExch
|
|||||||
// 对于 code_assist 模式,project_id 是必需的,需要调用 Code Assist API
|
// 对于 code_assist 模式,project_id 是必需的,需要调用 Code Assist API
|
||||||
// 对于 google_one 模式,使用个人 Google 账号,不需要 project_id,配额由 Google 网关自动识别
|
// 对于 google_one 模式,使用个人 Google 账号,不需要 project_id,配额由 Google 网关自动识别
|
||||||
// 对于 ai_studio 模式,project_id 是可选的(不影响使用 AI Studio API)
|
// 对于 ai_studio 模式,project_id 是可选的(不影响使用 AI Studio API)
|
||||||
if oauthType == "code_assist" {
|
switch oauthType {
|
||||||
|
case "code_assist":
|
||||||
if projectID == "" {
|
if projectID == "" {
|
||||||
var err error
|
var err error
|
||||||
projectID, tierID, err = s.fetchProjectID(ctx, tokenResp.AccessToken, proxyURL)
|
projectID, tierID, err = s.fetchProjectID(ctx, tokenResp.AccessToken, proxyURL)
|
||||||
@@ -364,7 +365,7 @@ func (s *GeminiOAuthService) ExchangeCode(ctx context.Context, input *GeminiExch
|
|||||||
if tierID == "" {
|
if tierID == "" {
|
||||||
tierID = "LEGACY"
|
tierID = "LEGACY"
|
||||||
}
|
}
|
||||||
} else if oauthType == "google_one" {
|
case "google_one":
|
||||||
// Attempt to fetch Drive storage tier
|
// Attempt to fetch Drive storage tier
|
||||||
tierID, storageInfo, err := s.FetchGoogleOneTier(ctx, tokenResp.AccessToken, proxyURL)
|
tierID, storageInfo, err := s.FetchGoogleOneTier(ctx, tokenResp.AccessToken, proxyURL)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@@ -523,7 +524,8 @@ func (s *GeminiOAuthService) RefreshAccountToken(ctx context.Context, account *A
|
|||||||
|
|
||||||
// For Code Assist, project_id is required. Auto-detect if missing.
|
// For Code Assist, project_id is required. Auto-detect if missing.
|
||||||
// For AI Studio OAuth, project_id is optional and should not block refresh.
|
// For AI Studio OAuth, project_id is optional and should not block refresh.
|
||||||
if oauthType == "code_assist" {
|
switch oauthType {
|
||||||
|
case "code_assist":
|
||||||
// 先设置默认值或保留旧值,确保 tier_id 始终有值
|
// 先设置默认值或保留旧值,确保 tier_id 始终有值
|
||||||
if existingTierID != "" {
|
if existingTierID != "" {
|
||||||
tokenInfo.TierID = existingTierID
|
tokenInfo.TierID = existingTierID
|
||||||
@@ -551,7 +553,7 @@ func (s *GeminiOAuthService) RefreshAccountToken(ctx context.Context, account *A
|
|||||||
if strings.TrimSpace(tokenInfo.ProjectID) == "" {
|
if strings.TrimSpace(tokenInfo.ProjectID) == "" {
|
||||||
return nil, fmt.Errorf("failed to auto-detect project_id: empty result")
|
return nil, fmt.Errorf("failed to auto-detect project_id: empty result")
|
||||||
}
|
}
|
||||||
} else if oauthType == "google_one" {
|
case "google_one":
|
||||||
// Check if tier cache is stale (> 24 hours)
|
// Check if tier cache is stale (> 24 hours)
|
||||||
needsRefresh := true
|
needsRefresh := true
|
||||||
if account.Extra != nil {
|
if account.Extra != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user