Files
tbphp a97578fe9b feat(access-keys): 完善访问密钥分发与用量管理 (#590)
* feat(access-keys): 完善访问密钥分发与用量管理

* fix(web): 保留监控上下文并同步复制草稿

* fix(web): 补全发放联系信息并保留排行密钥标识

* fix(monitor): 修复日志入口与用量时间边界

* feat(access-keys): 优化分发界面并精简发放流程

* fix(access-keys): 收紧列表排版并精简发放弹窗
2026-09-08 12:52:42 +08:00

38 lines
1.1 KiB
Go

package requestlog
import (
"fmt"
"gorm.io/gorm"
"gpt-load/internal/platform/epochms"
)
// ReadAccessKeyUsage 在调用方的读快照内批量汇总密钥用量,复用用量页的范围和金额校验。
func ReadAccessKeyUsage(db *gorm.DB, query UsageQuery) (map[uint]UsageAggregate, error) {
if _, err := validateUsageQuery(query); err != nil {
return nil, err
}
if query.Granularity == UsageGranularityMinute {
return nil, fmt.Errorf("access key collection requires hourly aggregates")
}
if err := validateUsageIntegrity(usageStatScope(db, query), epochms.MillisecondsPerHour); err != nil {
return nil, err
}
var rows []struct {
AccessKeyID uint
UsageAggregate
}
if err := usageStatScope(db, query).Select("access_key_id, " + usageAggregateSelect).Group("access_key_id").Scan(&rows).Error; err != nil {
return nil, err
}
result := make(map[uint]UsageAggregate, len(rows))
for _, row := range rows {
if err := validateUsageAggregate(row.UsageAggregate); err != nil {
return nil, err
}
result[row.AccessKeyID] = row.UsageAggregate
}
return result, nil
}