package models import ( "encoding/json" ) // VisitorEvent stores client-side analytics events // TableName: visitor_events // Common events: "page_view", "click", "interaction" // Fields kept generic to avoid rigid schema changes // Metadata stores arbitrary event payload (e.g., element details) type VisitorEvent struct { BaseModel EventType string `gorm:"index;size:50" json:"event_type"` Page string `gorm:"index;size:512" json:"page"` // Short page path PagePath string `gorm:"index;size:512" json:"page_path"` // Full page path (alias for Page) PageName string `gorm:"size:512" json:"page_name"` // Human-readable page name Element string `gorm:"size:256" json:"element"` // Element identifier (for clicks/interactions) Referrer string `gorm:"size:512" json:"referrer"` UserAgent string `gorm:"size:512" json:"user_agent"` IPAddress string `gorm:"size:64" json:"ip_address"` SessionID string `gorm:"size:128;index" json:"session_id"` UserID *uint `gorm:"index" json:"user_id,omitempty"` Data json.RawMessage `gorm:"type:jsonb" json:"data"` // Generic event data Metadata json.RawMessage `gorm:"type:jsonb" json:"metadata"` // Legacy metadata field } func (VisitorEvent) TableName() string { return "visitor_events" }