发布 0.1.0:通知渠道、告警规则、令牌版本与安全加固
This commit is contained in:
@@ -14,6 +14,7 @@ import (
|
||||
"time"
|
||||
|
||||
"gorm.io/gorm"
|
||||
"gorm.io/gorm/clause"
|
||||
|
||||
"oci-portal/internal/aiwire"
|
||||
"oci-portal/internal/model"
|
||||
@@ -506,13 +507,36 @@ func (s *AiGatewayService) ProbeAll(ctx context.Context) (string, error) {
|
||||
// LogCall 落一条调用日志(仅元数据与用量,永不含请求 / 响应正文),返回落库 ID 供内容日志关联(失败为 0)。
|
||||
func (s *AiGatewayService) LogCall(entry model.AiCallLog) uint {
|
||||
entry.ErrMsg = truncateErr(entry.ErrMsg)
|
||||
if err := s.db.Create(&entry).Error; err != nil {
|
||||
stored := false
|
||||
err := s.db.Transaction(func(tx *gorm.DB) error {
|
||||
ok, err := lockAiLogParent(tx, &model.AiChannel{}, entry.ChannelID)
|
||||
if err != nil || !ok {
|
||||
return err
|
||||
}
|
||||
stored = true
|
||||
return tx.Create(&entry).Error
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("ai call log: %v", err)
|
||||
return 0
|
||||
}
|
||||
if !stored {
|
||||
return 0
|
||||
}
|
||||
return entry.ID
|
||||
}
|
||||
|
||||
func lockAiLogParent(tx *gorm.DB, value any, id uint) (bool, error) {
|
||||
if id == 0 {
|
||||
return true, nil
|
||||
}
|
||||
err := tx.Clauses(clause.Locking{Strength: "UPDATE"}).Select("id").First(value, id).Error
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return false, nil
|
||||
}
|
||||
return err == nil, err
|
||||
}
|
||||
|
||||
// CallLogs 分页查询调用日志。
|
||||
func (s *AiGatewayService) CallLogs(ctx context.Context, page, size int) ([]model.AiCallLog, int64, error) {
|
||||
if page < 1 {
|
||||
@@ -555,9 +579,19 @@ func (s *AiGatewayService) UpdateKeyContentLog(ctx context.Context, id uint, hou
|
||||
|
||||
// LogContent 写一条内容日志(调用方已确认密钥开启且未过期);正文截断至 64KB。
|
||||
func (s *AiGatewayService) LogContent(entry model.AiContentLog) {
|
||||
if entry.CallLogID == 0 {
|
||||
return
|
||||
}
|
||||
entry.RequestBody = truncateBody(entry.RequestBody)
|
||||
entry.ResponseBody = truncateBody(entry.ResponseBody)
|
||||
if err := s.db.Create(&entry).Error; err != nil {
|
||||
err := s.db.Transaction(func(tx *gorm.DB) error {
|
||||
ok, err := lockAiLogParent(tx, &model.AiCallLog{}, entry.CallLogID)
|
||||
if err != nil || !ok {
|
||||
return err
|
||||
}
|
||||
return tx.Create(&entry).Error
|
||||
})
|
||||
if err != nil {
|
||||
log.Printf("ai content log: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user