package models import ( "database/sql/driver" "encoding/json" "errors" "time" ) // JSONMap is a custom type for JSONB columns that handles JSON serialization type JSONMap map[string]interface{} // Value implements driver.Valuer for database writes func (j JSONMap) Value() (driver.Value, error) { if j == nil { return nil, nil } return json.Marshal(j) } // Scan implements sql.Scanner for database reads func (j *JSONMap) Scan(value interface{}) error { if value == nil { *j = nil return nil } bytes, ok := value.([]byte) if !ok { return errors.New("audit_log: failed to scan JSONMap value") } return json.Unmarshal(bytes, j) } // AuditLog represents the audit_log table for tracking security-relevant events type AuditLog struct { ID uint `gorm:"primaryKey" json:"id"` UserID *uint `gorm:"column:user_id" json:"user_id"` EventType string `gorm:"column:event_type;size:50;not null" json:"event_type"` IPAddress string `gorm:"column:ip_address;size:45" json:"ip_address"` UserAgent string `gorm:"column:user_agent;type:text" json:"user_agent"` Details JSONMap `gorm:"column:details;type:jsonb" json:"details"` CreatedAt time.Time `gorm:"column:created_at;autoCreateTime" json:"created_at"` } // TableName returns the table name for GORM func (AuditLog) TableName() string { return "audit_log" }