package database import ( "time" "github.com/google/uuid" ) const ( CAMPAIGN_STATS_TABLE = "campaign_stats" ) // CampaignStats is gorm data model for aggregated campaign statistics type CampaignStats struct { ID *uuid.UUID `gorm:"primary_key;not null;unique;type:uuid" json:"id"` CreatedAt *time.Time `gorm:"not null;index;" json:"createdAt"` UpdatedAt *time.Time `gorm:"not null;" json:"updatedAt"` // Campaign reference CampaignID *uuid.UUID `gorm:"index;type:uuid;" json:"campaignId"` CampaignName string `gorm:"not null;" json:"campaignName"` CompanyID *uuid.UUID `gorm:"index;type:uuid;" json:"companyId"` // nullable for global campaigns // Time metrics CampaignStartDate *time.Time `gorm:"index;" json:"campaignStartDate"` CampaignEndDate *time.Time `gorm:"index;" json:"campaignEndDate"` CampaignClosedAt *time.Time `gorm:"index;" json:"campaignClosedAt"` // Volume metrics TotalRecipients int `gorm:"not null;default:0" json:"totalRecipients"` TotalEvents int `gorm:"not null;default:0" json:"totalEvents"` // Event type breakdowns EmailsSent int `gorm:"not null;default:0" json:"emailsSent"` TrackingPixelLoaded int `gorm:"not null;default:0" json:"trackingPixelLoaded"` // Email opens WebsiteVisits int `gorm:"not null;default:0" json:"websiteVisits"` // Link clicks DataSubmissions int `gorm:"not null;default:0" json:"dataSubmissions"` // Form submissions Reported int `gorm:"not null;default:0" json:"reported"` // Reported phishing // Training funnel, populated for training campaigns only TrainingStarted int `gorm:"not null;default:0" json:"trainingStarted"` TrainingCompleted int `gorm:"not null;default:0" json:"trainingCompleted"` // Campaign metadata TemplateName string `gorm:"" json:"templateName"` CampaignType string `gorm:"" json:"campaignType"` // 'scheduled', 'self-managed' // IsTraining marks the snapshot as an awareness training campaign so phishing // trend charts can exclude it from failure rate calculations. IsTraining bool `gorm:"not null;default:false" json:"isTraining"` } func (CampaignStats) TableName() string { return CAMPAIGN_STATS_TABLE }