Files
warmbly/internal/tasks/template_sender.go
T
Matthew MeszarosandDevin AI d807aa2852 feat: expose typed sender mailbox details in campaign templates, previews and email editor variables
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-10-05 15:15:12 +00:00

130 lines
4.8 KiB
Go

package tasks
import (
"strings"
"time"
"github.com/warmbly/warmbly/internal/models"
)
// TemplateSender is an explicit allowlist: never embed the mailbox model or its methods.
type TemplateSender struct {
Name string
Email string
MailboxEmail string
SendAsEmail string
ReplyTo string
SignaturePlain string
SignatureHTML string
SignatureSync bool
SignatureCode bool
Provider string
Status string
MailHost string
AuthMethod string
Vendor string
AvatarURL string
Tags []string
Timezone string
CampaignLimit int
MinWaitTime int
SaveToSent bool
RelayFolderMoves bool
TrackingDomain string
TrackingDomainVerified bool
TrackingDomainVerifiedAt string
TrackDirectMail bool
AuthState string
AuthSPF bool
AuthDKIM bool
AuthDMARC bool
AuthDMARCPolicy string
AuthReason string
AuthCheckedAt string
AuthFailingSince string
Warmup string
WarmupPausedAt string
WarmupBase int
WarmupMax int
WarmupIncrease int
WarmupReplyRate int
WarmupTag string
WarmupPoolType string
WarmupStartTime string
WarmupEndTime string
WarmupDays int
WarmupPlacement string
WarmupFolder string
WarmupRetentionDays int
LastSyncedAt string
CreatedAt string
UpdatedAt string
}
func templateContext(account *models.Email, unsubscribeURL string) TemplateContext {
context := TemplateContext{UnsubscribeLink: unsubscribeURL}
if account == nil {
return context
}
context.Sender = TemplateSender{
Name: strings.TrimSpace(account.Name),
Email: account.SendFrom(),
MailboxEmail: account.Email,
SendAsEmail: strings.TrimSpace(account.SendAsEmail),
ReplyTo: account.ReplyToHeader(),
SignaturePlain: account.SignaturePlain,
SignatureHTML: account.SignatureHTML,
SignatureSync: account.SignatureSync,
SignatureCode: account.SignatureCode,
Provider: account.Provider,
Status: account.Status,
MailHost: account.MailHost,
AuthMethod: account.AuthMethod,
Vendor: account.Vendor,
AvatarURL: account.AvatarURL,
Tags: append([]string(nil), account.Tags...),
Timezone: account.ClockTimezone(),
CampaignLimit: account.CampaignLimit,
MinWaitTime: account.MinWaitTime,
SaveToSent: account.SaveToSent,
RelayFolderMoves: account.RelayFolderMoves,
TrackingDomain: account.TrackingDomain,
TrackingDomainVerified: account.TrackingDomainVerified,
TrackingDomainVerifiedAt: templateTime(account.TrackingDomainVerifiedAt),
TrackDirectMail: account.TrackDirectMail,
AuthState: account.AuthState,
AuthSPF: account.AuthSPF,
AuthDKIM: account.AuthDKIM,
AuthDMARC: account.AuthDMARC,
AuthDMARCPolicy: account.AuthDMARCPolicy,
AuthReason: account.AuthReason,
AuthCheckedAt: templateTime(account.AuthCheckedAt),
AuthFailingSince: templateTime(account.AuthFailingSince),
Warmup: templateTime(account.Warmup),
WarmupPausedAt: templateTime(account.WarmupPausedAt),
WarmupBase: account.WarmupBase,
WarmupMax: account.WarmupMax,
WarmupIncrease: account.WarmupIncrease,
WarmupReplyRate: account.WarmupReplyRate,
WarmupTag: account.WarmupTag,
WarmupPoolType: account.WarmupPoolType,
WarmupStartTime: account.WarmupStartTime,
WarmupEndTime: account.WarmupEndTime,
WarmupDays: account.WarmupDays,
WarmupPlacement: account.WarmupPlacement,
WarmupFolder: account.WarmupFolder,
WarmupRetentionDays: account.WarmupRetentionDays,
LastSyncedAt: templateTime(&account.LastSyncedAt),
CreatedAt: templateTime(&account.CreatedAt),
UpdatedAt: templateTime(&account.UpdatedAt),
}
return context
}
func templateTime(value *time.Time) string {
if value == nil || value.IsZero() {
return ""
}
return value.UTC().Format(time.RFC3339)
}