Files
2026-06-02 21:40:23 +08:00

57 lines
1.1 KiB
Go

package auditlog
import (
"encoding/json"
"hfb_sys/backend/internal/model"
"gorm.io/datatypes"
"gorm.io/gorm"
)
type Meta struct {
IP string
UserAgent string
RequestID string
}
type Entry struct {
ActorType string
ActorID uint64
Action string
BizType string
BizID *uint64
Meta Meta
Detail map[string]any
}
// Append 在业务事务内写入审计日志,确保审计和业务状态一起提交或回滚。
func Append(tx *gorm.DB, entry Entry) error {
raw, err := marshalDetail(entry.Detail, entry.Meta.RequestID)
if err != nil {
return err
}
row := model.AuditLog{
ActorType: entry.ActorType,
ActorID: entry.ActorID,
Action: entry.Action,
BizType: entry.BizType,
BizID: entry.BizID,
IP: entry.Meta.IP,
UserAgent: entry.Meta.UserAgent,
Detail: datatypes.JSON(raw),
}
return tx.Create(&row).Error
}
func marshalDetail(detail map[string]any, requestID string) ([]byte, error) {
copied := make(map[string]any, len(detail)+1)
for key, value := range detail {
copied[key] = value
}
if requestID != "" {
copied["request_id"] = requestID
}
return json.Marshal(copied)
}