fix(lint): 修复 golangci-lint 报告的代码问题
- errcheck: 修复类型断言未检查返回值的问题 - pool.go: 添加 sync.Map 类型断言安全检查 - req_client_pool.go: 添加 sync.Map 类型断言安全检查 - concurrency_cache_benchmark_test.go: 显式忽略断言返回值 - gateway_service.go: 显式忽略 WriteString 返回值 - gofmt: 修复代码格式问题 - redis.go: 注释对齐 - api_key_repo.go: 结构体字段对齐 - concurrency_cache.go: 字段对齐 - http_upstream.go: 注释对齐 - unused: 删除未使用的代码 - user_repo.go: 删除未使用的 sql 字段 - usage_service.go: 删除未使用的 calculateStats 函数 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -33,7 +33,7 @@ func buildRedisOptions(cfg *config.Config) *redis.Options {
|
|||||||
DialTimeout: time.Duration(cfg.Redis.DialTimeoutSeconds) * time.Second, // 建连超时
|
DialTimeout: time.Duration(cfg.Redis.DialTimeoutSeconds) * time.Second, // 建连超时
|
||||||
ReadTimeout: time.Duration(cfg.Redis.ReadTimeoutSeconds) * time.Second, // 读取超时
|
ReadTimeout: time.Duration(cfg.Redis.ReadTimeoutSeconds) * time.Second, // 读取超时
|
||||||
WriteTimeout: time.Duration(cfg.Redis.WriteTimeoutSeconds) * time.Second, // 写入超时
|
WriteTimeout: time.Duration(cfg.Redis.WriteTimeoutSeconds) * time.Second, // 写入超时
|
||||||
PoolSize: cfg.Redis.PoolSize, // 连接池大小
|
PoolSize: cfg.Redis.PoolSize, // 连接池大小
|
||||||
MinIdleConns: cfg.Redis.MinIdleConns, // 最小空闲连接
|
MinIdleConns: cfg.Redis.MinIdleConns, // 最小空闲连接
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -58,7 +58,9 @@ var sharedClients sync.Map
|
|||||||
func GetClient(opts Options) (*http.Client, error) {
|
func GetClient(opts Options) (*http.Client, error) {
|
||||||
key := buildClientKey(opts)
|
key := buildClientKey(opts)
|
||||||
if cached, ok := sharedClients.Load(key); ok {
|
if cached, ok := sharedClients.Load(key); ok {
|
||||||
return cached.(*http.Client), nil
|
if client, ok := cached.(*http.Client); ok {
|
||||||
|
return client, nil
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
client, err := buildClient(opts)
|
client, err := buildClient(opts)
|
||||||
@@ -72,7 +74,10 @@ func GetClient(opts Options) (*http.Client, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
actual, _ := sharedClients.LoadOrStore(key, client)
|
actual, _ := sharedClients.LoadOrStore(key, client)
|
||||||
return actual.(*http.Client), nil
|
if c, ok := actual.(*http.Client); ok {
|
||||||
|
return c, nil
|
||||||
|
}
|
||||||
|
return client, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildClient(opts Options) (*http.Client, error) {
|
func buildClient(opts Options) (*http.Client, error) {
|
||||||
|
|||||||
@@ -311,13 +311,13 @@ func groupEntityToService(g *dbent.Group) *service.Group {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return &service.Group{
|
return &service.Group{
|
||||||
ID: g.ID,
|
ID: g.ID,
|
||||||
Name: g.Name,
|
Name: g.Name,
|
||||||
Description: derefString(g.Description),
|
Description: derefString(g.Description),
|
||||||
Platform: g.Platform,
|
Platform: g.Platform,
|
||||||
RateMultiplier: g.RateMultiplier,
|
RateMultiplier: g.RateMultiplier,
|
||||||
IsExclusive: g.IsExclusive,
|
IsExclusive: g.IsExclusive,
|
||||||
Status: g.Status,
|
Status: g.Status,
|
||||||
SubscriptionType: g.SubscriptionType,
|
SubscriptionType: g.SubscriptionType,
|
||||||
DailyLimitUSD: g.DailyLimitUsd,
|
DailyLimitUSD: g.DailyLimitUsd,
|
||||||
WeeklyLimitUSD: g.WeeklyLimitUsd,
|
WeeklyLimitUSD: g.WeeklyLimitUsd,
|
||||||
|
|||||||
@@ -126,7 +126,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type concurrencyCache struct {
|
type concurrencyCache struct {
|
||||||
rdb *redis.Client
|
rdb *redis.Client
|
||||||
slotTTLSeconds int // 槽位过期时间(秒)
|
slotTTLSeconds int // 槽位过期时间(秒)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -137,7 +137,7 @@ func NewConcurrencyCache(rdb *redis.Client, slotTTLMinutes int) service.Concurre
|
|||||||
slotTTLMinutes = defaultSlotTTLMinutes
|
slotTTLMinutes = defaultSlotTTLMinutes
|
||||||
}
|
}
|
||||||
return &concurrencyCache{
|
return &concurrencyCache{
|
||||||
rdb: rdb,
|
rdb: rdb,
|
||||||
slotTTLSeconds: slotTTLMinutes * 60,
|
slotTTLSeconds: slotTTLMinutes * 60,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ func BenchmarkAccountConcurrency(b *testing.B) {
|
|||||||
_ = rdb.Close()
|
_ = rdb.Close()
|
||||||
}()
|
}()
|
||||||
|
|
||||||
cache := NewConcurrencyCache(rdb, benchSlotTTLMinutes).(*concurrencyCache)
|
cache, _ := NewConcurrencyCache(rdb, benchSlotTTLMinutes).(*concurrencyCache)
|
||||||
ctx := context.Background()
|
ctx := context.Background()
|
||||||
|
|
||||||
for _, size := range []int{10, 100, 1000} {
|
for _, size := range []int{10, 100, 1000} {
|
||||||
|
|||||||
@@ -572,7 +572,7 @@ func buildUpstreamTransport(settings poolSettings, proxyURL *url.URL) *http.Tran
|
|||||||
// trackedBody 带跟踪功能的响应体包装器
|
// trackedBody 带跟踪功能的响应体包装器
|
||||||
// 在 Close 时执行回调,用于更新请求计数
|
// 在 Close 时执行回调,用于更新请求计数
|
||||||
type trackedBody struct {
|
type trackedBody struct {
|
||||||
io.ReadCloser // 原始响应体
|
io.ReadCloser // 原始响应体
|
||||||
once sync.Once
|
once sync.Once
|
||||||
onClose func() // 关闭时的回调函数
|
onClose func() // 关闭时的回调函数
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,9 @@ var sharedReqClients sync.Map
|
|||||||
func getSharedReqClient(opts reqClientOptions) *req.Client {
|
func getSharedReqClient(opts reqClientOptions) *req.Client {
|
||||||
key := buildReqClientKey(opts)
|
key := buildReqClientKey(opts)
|
||||||
if cached, ok := sharedReqClients.Load(key); ok {
|
if cached, ok := sharedReqClients.Load(key); ok {
|
||||||
return cached.(*req.Client)
|
if c, ok := cached.(*req.Client); ok {
|
||||||
|
return c
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
client := req.C().SetTimeout(opts.Timeout)
|
client := req.C().SetTimeout(opts.Timeout)
|
||||||
@@ -47,7 +49,10 @@ func getSharedReqClient(opts reqClientOptions) *req.Client {
|
|||||||
}
|
}
|
||||||
|
|
||||||
actual, _ := sharedReqClients.LoadOrStore(key, client)
|
actual, _ := sharedReqClients.LoadOrStore(key, client)
|
||||||
return actual.(*req.Client)
|
if c, ok := actual.(*req.Client); ok {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return client
|
||||||
}
|
}
|
||||||
|
|
||||||
func buildReqClientKey(opts reqClientOptions) string {
|
func buildReqClientKey(opts reqClientOptions) string {
|
||||||
|
|||||||
@@ -16,15 +16,14 @@ import (
|
|||||||
|
|
||||||
type userRepository struct {
|
type userRepository struct {
|
||||||
client *dbent.Client
|
client *dbent.Client
|
||||||
sql sqlExecutor
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewUserRepository(client *dbent.Client, sqlDB *sql.DB) service.UserRepository {
|
func NewUserRepository(client *dbent.Client, sqlDB *sql.DB) service.UserRepository {
|
||||||
return newUserRepositoryWithSQL(client, sqlDB)
|
return newUserRepositoryWithSQL(client, sqlDB)
|
||||||
}
|
}
|
||||||
|
|
||||||
func newUserRepositoryWithSQL(client *dbent.Client, sqlq sqlExecutor) *userRepository {
|
func newUserRepositoryWithSQL(client *dbent.Client, _ sqlExecutor) *userRepository {
|
||||||
return &userRepository{client: client, sql: sqlq}
|
return &userRepository{client: client}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *userRepository) Create(ctx context.Context, userIn *service.User) error {
|
func (r *userRepository) Create(ctx context.Context, userIn *service.User) error {
|
||||||
|
|||||||
@@ -197,7 +197,7 @@ func (s *GatewayService) extractCacheableContent(parsed *ParsedRequest) string {
|
|||||||
if cc, ok := partMap["cache_control"].(map[string]any); ok {
|
if cc, ok := partMap["cache_control"].(map[string]any); ok {
|
||||||
if cc["type"] == "ephemeral" {
|
if cc["type"] == "ephemeral" {
|
||||||
if text, ok := partMap["text"].(string); ok {
|
if text, ok := partMap["text"].(string); ok {
|
||||||
builder.WriteString(text)
|
_, _ = builder.WriteString(text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -235,32 +235,6 @@ func (s *UsageService) GetDailyStats(ctx context.Context, userID int64, days int
|
|||||||
return stats, nil
|
return stats, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// calculateStats 计算统计数据
|
|
||||||
func (s *UsageService) calculateStats(logs []UsageLog) *UsageStats {
|
|
||||||
stats := &UsageStats{}
|
|
||||||
|
|
||||||
for _, log := range logs {
|
|
||||||
stats.TotalRequests++
|
|
||||||
stats.TotalInputTokens += int64(log.InputTokens)
|
|
||||||
stats.TotalOutputTokens += int64(log.OutputTokens)
|
|
||||||
stats.TotalCacheTokens += int64(log.CacheCreationTokens + log.CacheReadTokens)
|
|
||||||
stats.TotalTokens += int64(log.TotalTokens())
|
|
||||||
stats.TotalCost += log.TotalCost
|
|
||||||
stats.TotalActualCost += log.ActualCost
|
|
||||||
|
|
||||||
if log.DurationMs != nil {
|
|
||||||
stats.AverageDurationMs += float64(*log.DurationMs)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 计算平均持续时间
|
|
||||||
if stats.TotalRequests > 0 {
|
|
||||||
stats.AverageDurationMs /= float64(stats.TotalRequests)
|
|
||||||
}
|
|
||||||
|
|
||||||
return stats
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete 删除使用日志(管理员功能,谨慎使用)
|
// Delete 删除使用日志(管理员功能,谨慎使用)
|
||||||
func (s *UsageService) Delete(ctx context.Context, id int64) error {
|
func (s *UsageService) Delete(ctx context.Context, id int64) error {
|
||||||
if err := s.usageRepo.Delete(ctx, id); err != nil {
|
if err := s.usageRepo.Delete(ctx, id); err != nil {
|
||||||
|
|||||||
Reference in New Issue
Block a user