package models import ( "time" ) // OnboardingEmailType represents the type of onboarding email type OnboardingEmailType string const ( // OnboardingEmailNoResidence is sent when a user has not created a residence after 2 days OnboardingEmailNoResidence OnboardingEmailType = "no_residence" // OnboardingEmailNoTasks is sent when a user has created a residence but no tasks after 5 days OnboardingEmailNoTasks OnboardingEmailType = "no_tasks" ) // OnboardingEmail tracks sent onboarding emails per user // Each email type can only be sent once per user (enforced by unique constraint on user_id + email_type) type OnboardingEmail struct { ID uint `gorm:"primaryKey" json:"id"` UserID uint `gorm:"not null;index" json:"user_id"` User User `gorm:"foreignKey:UserID" json:"user,omitempty"` EmailType OnboardingEmailType `gorm:"type:varchar(50);not null;index" json:"email_type"` SentAt time.Time `gorm:"not null" json:"sent_at"` OpenedAt *time.Time `json:"opened_at"` TrackingID string `gorm:"type:varchar(64);uniqueIndex" json:"tracking_id"` CreatedAt time.Time `json:"created_at"` UpdatedAt time.Time `json:"updated_at"` } // TableName returns the table name for OnboardingEmail func (OnboardingEmail) TableName() string { return "onboarding_emails" }