Files
breakpilot-core/consent-service/internal/models/email_templates.go
Benjamin Admin 92c86ec6ba [split-required] [guardrail-change] Enforce 500 LOC budget across all services
Install LOC guardrails (check-loc.sh, architecture.md, pre-commit hook)
and split all 44 files exceeding 500 LOC into domain-focused modules:

- consent-service (Go): models, handlers, services, database splits
- backend-core (Python): security_api, rbac_api, pdf_service, auth splits
- admin-core (TypeScript): 5 page.tsx + sidebar extractions
- pitch-deck (TypeScript): 6 slides, 3 UI components, engine.ts splits
- voice-service (Python): enhanced_task_orchestrator split

Result: 0 violations, 36 exempted (pipeline, tests, pure-data files).
Go build verified clean. No behavior changes — pure structural splits.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-27 00:09:30 +02:00

192 lines
8.5 KiB
Go

package models
import (
"time"
"github.com/google/uuid"
)
// EmailTemplateType defines the types of transactional emails
const (
// Auth & Security
EmailTypeWelcome = "welcome"
EmailTypeEmailVerification = "email_verification"
EmailTypePasswordReset = "password_reset"
EmailTypePasswordChanged = "password_changed"
EmailType2FAEnabled = "2fa_enabled"
EmailType2FADisabled = "2fa_disabled"
EmailTypeNewDeviceLogin = "new_device_login"
EmailTypeSuspiciousActivity = "suspicious_activity"
EmailTypeAccountLocked = "account_locked"
EmailTypeAccountUnlocked = "account_unlocked"
// Account Lifecycle
EmailTypeDeletionRequested = "deletion_requested"
EmailTypeDeletionConfirmed = "deletion_confirmed"
EmailTypeDataExportReady = "data_export_ready"
EmailTypeEmailChanged = "email_changed"
EmailTypeEmailChangeVerify = "email_change_verify"
// Consent-related
EmailTypeNewVersionPublished = "new_version_published"
EmailTypeConsentReminder = "consent_reminder"
EmailTypeConsentDeadlineWarning = "consent_deadline_warning"
EmailTypeAccountSuspended = "account_suspended"
)
// EmailTemplate represents a template for transactional emails (like LegalDocument)
type EmailTemplate struct {
ID uuid.UUID `json:"id" db:"id"`
Type string `json:"type" db:"type"` // One of EmailType constants
Name string `json:"name" db:"name"` // Human-readable name
Description *string `json:"description" db:"description"`
IsActive bool `json:"is_active" db:"is_active"`
SortOrder int `json:"sort_order" db:"sort_order"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
}
// EmailTemplateVersion represents a specific version of an email template (like DocumentVersion)
type EmailTemplateVersion struct {
ID uuid.UUID `json:"id" db:"id"`
TemplateID uuid.UUID `json:"template_id" db:"template_id"`
Version string `json:"version" db:"version"` // Semver: 1.0.0
Language string `json:"language" db:"language"` // ISO 639-1: de, en
Subject string `json:"subject" db:"subject"` // Email subject line
BodyHTML string `json:"body_html" db:"body_html"` // HTML version
BodyText string `json:"body_text" db:"body_text"` // Plain text version
Summary *string `json:"summary" db:"summary"` // Change summary
Status string `json:"status" db:"status"` // draft, review, approved, published, archived
PublishedAt *time.Time `json:"published_at" db:"published_at"`
ScheduledPublishAt *time.Time `json:"scheduled_publish_at" db:"scheduled_publish_at"`
CreatedBy *uuid.UUID `json:"created_by" db:"created_by"`
ApprovedBy *uuid.UUID `json:"approved_by" db:"approved_by"`
ApprovedAt *time.Time `json:"approved_at" db:"approved_at"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
}
// EmailTemplateApproval tracks approval workflow for email templates
type EmailTemplateApproval struct {
ID uuid.UUID `json:"id" db:"id"`
VersionID uuid.UUID `json:"version_id" db:"version_id"`
ApproverID uuid.UUID `json:"approver_id" db:"approver_id"`
Action string `json:"action" db:"action"` // submitted_for_review, approved, rejected, published
Comment *string `json:"comment,omitempty" db:"comment"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
}
// EmailSendLog tracks sent emails for audit purposes
type EmailSendLog struct {
ID uuid.UUID `json:"id" db:"id"`
UserID *uuid.UUID `json:"user_id,omitempty" db:"user_id"`
VersionID uuid.UUID `json:"version_id" db:"version_id"`
Recipient string `json:"recipient" db:"recipient"` // Email address
Subject string `json:"subject" db:"subject"`
Status string `json:"status" db:"status"` // queued, sent, delivered, bounced, failed
ErrorMsg *string `json:"error_msg,omitempty" db:"error_msg"`
Variables *string `json:"variables,omitempty" db:"variables"` // JSON of template variables used
SentAt *time.Time `json:"sent_at,omitempty" db:"sent_at"`
DeliveredAt *time.Time `json:"delivered_at,omitempty" db:"delivered_at"`
CreatedAt time.Time `json:"created_at" db:"created_at"`
}
// EmailTemplateSettings stores global email settings (logo, signature, etc.)
type EmailTemplateSettings struct {
ID uuid.UUID `json:"id" db:"id"`
LogoURL *string `json:"logo_url" db:"logo_url"`
LogoBase64 *string `json:"logo_base64" db:"logo_base64"` // For embedding in emails
CompanyName string `json:"company_name" db:"company_name"`
SenderName string `json:"sender_name" db:"sender_name"`
SenderEmail string `json:"sender_email" db:"sender_email"`
ReplyToEmail *string `json:"reply_to_email" db:"reply_to_email"`
FooterHTML *string `json:"footer_html" db:"footer_html"`
FooterText *string `json:"footer_text" db:"footer_text"`
PrimaryColor string `json:"primary_color" db:"primary_color"` // Hex color
SecondaryColor string `json:"secondary_color" db:"secondary_color"` // Hex color
UpdatedAt time.Time `json:"updated_at" db:"updated_at"`
UpdatedBy *uuid.UUID `json:"updated_by" db:"updated_by"`
}
// ========================================
// E-Mail Template DTOs
// ========================================
// CreateEmailTemplateRequest for creating a new email template type
type CreateEmailTemplateRequest struct {
Type string `json:"type" binding:"required"`
Name string `json:"name" binding:"required"`
Description *string `json:"description"`
}
// CreateEmailTemplateVersionRequest for creating a new version of an email template
type CreateEmailTemplateVersionRequest struct {
TemplateID string `json:"template_id" binding:"required"`
Version string `json:"version" binding:"required"`
Language string `json:"language" binding:"required"`
Subject string `json:"subject" binding:"required"`
BodyHTML string `json:"body_html" binding:"required"`
BodyText string `json:"body_text" binding:"required"`
Summary *string `json:"summary"`
}
// UpdateEmailTemplateVersionRequest for updating a version
type UpdateEmailTemplateVersionRequest struct {
Subject *string `json:"subject"`
BodyHTML *string `json:"body_html"`
BodyText *string `json:"body_text"`
Summary *string `json:"summary"`
Status *string `json:"status"`
}
// UpdateEmailTemplateSettingsRequest for updating global settings
type UpdateEmailTemplateSettingsRequest struct {
LogoURL *string `json:"logo_url"`
LogoBase64 *string `json:"logo_base64"`
CompanyName *string `json:"company_name"`
SenderName *string `json:"sender_name"`
SenderEmail *string `json:"sender_email"`
ReplyToEmail *string `json:"reply_to_email"`
FooterHTML *string `json:"footer_html"`
FooterText *string `json:"footer_text"`
PrimaryColor *string `json:"primary_color"`
SecondaryColor *string `json:"secondary_color"`
}
// EmailTemplateWithVersion combines template info with its latest published version
type EmailTemplateWithVersion struct {
Template EmailTemplate `json:"template"`
LatestVersion *EmailTemplateVersion `json:"latest_version,omitempty"`
}
// SendTestEmailRequest for sending a test email
type SendTestEmailRequest struct {
VersionID string `json:"version_id" binding:"required"`
Recipient string `json:"recipient" binding:"required,email"`
Variables map[string]string `json:"variables"` // Template variable overrides
}
// EmailPreviewResponse for previewing an email
type EmailPreviewResponse struct {
Subject string `json:"subject"`
BodyHTML string `json:"body_html"`
BodyText string `json:"body_text"`
}
// EmailTemplateVariables defines available variables for each template type
type EmailTemplateVariables struct {
TemplateType string `json:"template_type"`
Variables []string `json:"variables"`
Descriptions map[string]string `json:"descriptions"`
}
// EmailStats represents statistics about email sends
type EmailStats struct {
TotalSent int `json:"total_sent"`
Delivered int `json:"delivered"`
Bounced int `json:"bounced"`
Failed int `json:"failed"`
DeliveryRate float64 `json:"delivery_rate"`
RecentSent int `json:"recent_sent"` // Last 7 days
}