Files
phishingclub/backend/database/campaignStats.go
Ronni Skansing 77cd13812d update custom stats table and db
Signed-off-by: Ronni Skansing <rskansing@gmail.com>
2025-10-27 19:27:22 +01:00

48 lines
1.7 KiB
Go

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
// Campaign metadata
TemplateName string `gorm:"" json:"templateName"`
CampaignType string `gorm:"" json:"campaignType"` // 'scheduled', 'self-managed'
}
func (CampaignStats) TableName() string {
return CAMPAIGN_STATS_TABLE
}