package utils import ( "encoding/json" "strings" "github.com/LoveLosita/smartflow/backend/model" ) const ( // AuditOperationCreate 表示系统新建一条记忆。 AuditOperationCreate = "create" // AuditOperationUpdate 表示决策层更新已有记忆的内容。 AuditOperationUpdate = "update" // AuditOperationArchive 表示治理层把重复记忆归档。 AuditOperationArchive = "archive" // AuditOperationDelete 表示对已有记忆做软删除。 AuditOperationDelete = "delete" // AuditOperationRestore 表示把已删除/归档记忆恢复为 active。 AuditOperationRestore = "restore" ) // BuildItemAuditLog 构造记忆变更审计日志。 // // 职责边界: // 1. 负责把 before/after 快照统一序列化为审计日志结构; // 2. 不负责决定“是否应该写审计”,该决策由上层 service/worker 控制; // 3. 不负责落库,调用方仍需显式调用 AuditRepo。 func BuildItemAuditLog( memoryID int64, userID int, operation string, operatorType string, reason string, before *model.MemoryItem, after *model.MemoryItem, ) model.MemoryAuditLog { return model.MemoryAuditLog{ MemoryID: memoryID, UserID: userID, Operation: strings.TrimSpace(operation), OperatorType: NormalizeOperatorType(operatorType), Reason: strings.TrimSpace(reason), BeforeJSON: marshalMemoryItemSnapshot(before), AfterJSON: marshalMemoryItemSnapshot(after), } } // NormalizeOperatorType 统一规整审计操作者类型。 // // 规则说明: // 1. 目前只接受 user/system 两类固定值; // 2. 空值或未知值统一回退为 user,避免把脏值直接写进审计表; // 3. 若后续扩展 admin/tool 等类型,再在这里集中放开即可。 func NormalizeOperatorType(raw string) string { switch strings.ToLower(strings.TrimSpace(raw)) { case "system": return "system" default: return "user" } } func marshalMemoryItemSnapshot(item *model.MemoryItem) *string { if item == nil { return nil } raw, err := json.Marshal(item) if err != nil { empty := "{}" return &empty } value := string(raw) return &value }