修复
All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 8m28s

This commit is contained in:
2026-08-11 15:27:18 +08:00
parent 629609a556
commit 2a7a8fb49d
5 changed files with 16112 additions and 18 deletions

View File

@@ -872,27 +872,33 @@ func (w *Writer) WriteRecovery(ctx context.Context, tx *gorm.DB, recovery outbox
// Append 在调用方提供的 GORM 事务中顺序追加事件及资源。
func (w *Writer) Append(ctx context.Context, tx *gorm.DB, input AppendInput) error {
_, err := w.AppendAndGet(ctx, tx, input)
return err
}
// AppendAndGet 追加事件并返回已持久化的审计事件,幂等重放返回已有事件。
func (w *Writer) AppendAndGet(ctx context.Context, tx *gorm.DB, input AppendInput) (*model.AuditEvent, error) {
if w == nil || w.registry == nil || tx == nil {
return pkgerrors.New(pkgerrors.CodeInvalidStatus, "统一审计 Writer 未正确配置")
return nil, pkgerrors.New(pkgerrors.CodeInvalidStatus, "统一审计 Writer 未正确配置")
}
input = fillFromContext(ctx, input)
action, ok := w.registry.Action(input.ActionCode)
if !ok {
return pkgerrors.New(pkgerrors.CodeInvalidParam, "审计动作未注册")
return nil, pkgerrors.New(pkgerrors.CodeInvalidParam, "审计动作未注册")
}
if !actionAllowsOrigin(action, input.Actor.Kind, input.Source) || input.Actor.ID == "" {
return pkgerrors.New(pkgerrors.CodeInvalidParam, "审计操作者或入口不符合动作注册规则")
return nil, pkgerrors.New(pkgerrors.CodeInvalidParam, "审计操作者或入口不符合动作注册规则")
}
if !validResult(input.Result) || len(input.Resources) == 0 {
return pkgerrors.New(pkgerrors.CodeInvalidParam, "审计结果非法或缺少资源")
return nil, pkgerrors.New(pkgerrors.CodeInvalidParam, "审计结果非法或缺少资源")
}
resources, err := w.buildResources(input.Resources, action)
if err != nil {
return err
return nil, err
}
metadata, err := safeObject(input.Metadata)
if err != nil {
return err
return nil, err
}
occurredAt := input.OccurredAt
if occurredAt.IsZero() {
@@ -913,7 +919,7 @@ func (w *Writer) Append(ctx context.Context, tx *gorm.DB, input AppendInput) err
}
event.ContentHash, err = contentHash(event, resources)
if err != nil {
return pkgerrors.Wrap(pkgerrors.CodeInvalidParam, err, "计算审计内容哈希失败")
return nil, pkgerrors.Wrap(pkgerrors.CodeInvalidParam, err, "计算审计内容哈希失败")
}
event.EventID = input.EventID
if event.EventID == "" {
@@ -923,19 +929,23 @@ func (w *Writer) Append(ctx context.Context, tx *gorm.DB, input AppendInput) err
Columns: []clause.Column{{Name: "event_id"}}, DoNothing: true,
}).Create(&event)
if create.Error != nil {
return pkgerrors.Wrap(pkgerrors.CodeDatabaseError, create.Error, "写入审计事件失败")
return nil, pkgerrors.Wrap(pkgerrors.CodeDatabaseError, create.Error, "写入审计事件失败")
}
if create.RowsAffected == 0 {
return nil
var existing model.AuditEvent
if err := tx.WithContext(ctx).Where("event_id = ?", event.EventID).First(&existing).Error; err != nil {
return nil, pkgerrors.Wrap(pkgerrors.CodeDatabaseError, err, "读取已存在审计事件失败")
}
return &existing, nil
}
for index := range resources {
resources[index].AuditEventID = event.ID
resources[index].CreatedAt = event.CreatedAt
}
if err := tx.WithContext(ctx).Create(&resources).Error; err != nil {
return pkgerrors.Wrap(pkgerrors.CodeDatabaseError, err, "写入审计事件资源失败")
return nil, pkgerrors.Wrap(pkgerrors.CodeDatabaseError, err, "写入审计事件资源失败")
}
return nil
return &event, nil
}
func actionAllowsOrigin(action ActionDefinition, actor, source string) bool {