// internal/models/audit_log.go package models import ( "time" "gorm.io/gorm" ) // AuditLog represents an audit log entry type AuditLog struct { ID uint `gorm:"primaryKey" json:"id"` UserID *uint `json:"user_id"` // Nullable for system actions User *User `gorm:"foreignKey:UserID" json:"user,omitempty"` Action string `gorm:"type:varchar(50);not null" json:"action"` // create, update, delete, verify, login, etc. EntityType string `gorm:"type:varchar(50)" json:"entity_type"` // item, claim, user, etc. EntityID *uint `json:"entity_id"` Details string `gorm:"type:text" json:"details"` IPAddress string `gorm:"type:varchar(50)" json:"ip_address"` UserAgent string `gorm:"type:varchar(255)" json:"user_agent"` CreatedAt time.Time `json:"created_at"` DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` } // TableName specifies the table name for AuditLog model func (AuditLog) TableName() string { return "audit_logs" } // Action constants const ( ActionCreate = "create" ActionUpdate = "update" ActionDelete = "delete" ActionVerify = "verify" ActionLogin = "login" ActionLogout = "logout" ActionBlock = "block" ActionUnblock = "unblock" ActionApprove = "approve" ActionReject = "reject" ActionExport = "export" ) // Entity type constants const ( EntityItem = "item" EntityLostItem = "lost_item" EntityClaim = "claim" EntityUser = "user" EntityCategory = "category" EntityArchive = "archive" ) // AuditLogResponse represents audit log data for API responses type AuditLogResponse struct { ID uint `json:"id"` UserName string `json:"user_name,omitempty"` Action string `json:"action"` EntityType string `json:"entity_type"` EntityID *uint `json:"entity_id"` Details string `json:"details"` IPAddress string `json:"ip_address"` CreatedAt time.Time `json:"created_at"` } // ToResponse converts AuditLog to AuditLogResponse func (a *AuditLog) ToResponse() AuditLogResponse { userName := "System" if a.User != nil && a.User.ID != 0 { userName = a.User.Name } return AuditLogResponse{ ID: a.ID, UserName: userName, Action: a.Action, EntityType: a.EntityType, EntityID: a.EntityID, Details: a.Details, IPAddress: a.IPAddress, CreatedAt: a.CreatedAt, } } // CreateAuditLog creates a new audit log entry func CreateAuditLog(db *gorm.DB, userID *uint, action, entityType string, entityID *uint, details, ipAddress, userAgent string) error { log := &AuditLog{ UserID: userID, Action: action, EntityType: entityType, EntityID: entityID, Details: details, IPAddress: ipAddress, UserAgent: userAgent, } return db.Create(log).Error }