package mailimp import ( "maps" "github.com/tech/sendico/notification/interface/api/localizer" "github.com/tech/sendico/notification/internal/server/notificationimp/mail/internal/mailkey" mmail "github.com/tech/sendico/notification/internal/server/notificationimp/mail/messagebuilder" "github.com/tech/sendico/pkg/domainprovider" "github.com/tech/sendico/pkg/localization" ) type EmailNotificationTemplate struct { dp domainprovider.DomainProvider l localizer.Localizer data localization.LocData unsubscribable bool hasButton bool } func (m *EmailNotificationTemplate) AddData(key, value string) { localization.AddLocData(m.data, key, value) } // content: // Greeting: Welcome, Gregory // Content: You're receiving this message because you recently signed up for an account.

Confirm your email address by clicking the button below. This step adds extra security to your business by verifying you own this email. // LogoLink: link to a logo // Privacy: Privacy Policy // PolicyLink: link to a privacy policy // Unsubscribe: Unsubscribe // UnsubscribeLink: link to an unsubscribe command // MessageTitle: message title func (m *EmailNotificationTemplate) prepareUnsubscribe(msg mmail.Message) error { var block string if m.unsubscribable { var d localization.LocData unsubscribe, err := m.l.LocalizeString("mail.template.unsubscribe", msg.Locale()) if err != nil { return err } localization.AddLocData(d, "Unsubscribe", unsubscribe) unsLink, err := m.dp.GetFullLink("account", "unsubscribe", msg.AccountID()) if err != nil { return err } localization.AddLocData(d, "UnsubscribeLink", unsLink) if block, err = renderUnsubscribeBlock(d); err != nil { return err } } m.AddData("UnsubscribeBlock", block) return nil } func (m *EmailNotificationTemplate) prepareButton(_ mmail.Message) error { var block string if m.hasButton { var err error if block, err = renderButtonBlock(m.data); err != nil { return err } } m.AddData("ButtonBlock", block) return nil } func (m *EmailNotificationTemplate) SignatureData(msg mmail.Message, content, subj string) (string, error) { m.AddData("Content", content) m.AddData("MessageTitle", subj) logoLink, err := m.dp.GetAPILink("logo", msg.AccountID(), msg.TemplateID()) if err != nil { return "", err } m.AddData("LogoLink", logoLink) privacy, err := m.l.LocalizeString("mail.template.privacy", msg.Locale()) if err != nil { return "", err } m.AddData("Privacy", privacy) ppLink, err := m.dp.GetFullLink("/privacy-policy") if err != nil { return "", err } m.AddData("PolicyLink", ppLink) if err := m.prepareButton(msg); err != nil { return "", err } if err := m.prepareUnsubscribe(msg); err != nil { return "", err } return renderOneButtonEmail(m.data) } func (m *EmailNotificationTemplate) putOnHTMLTemplate(msg mmail.Message, content, subj string) (string, error) { greeting, err := m.l.LocalizeTemplate(mailkey.Get(msg.TemplateID(), "greeting"), m.data, nil, msg.Locale()) if err != nil { return "", err } m.AddData("Greeting", greeting) return m.SignatureData(msg, content, subj) } func (m *EmailNotificationTemplate) Build(msg mmail.Message) (string, error) { if m.data != nil { m.data["ServiceName"] = m.l.ServiceName() m.data["SupportMail"] = m.l.SupportMail() var err error if m.data["ServiceOwner"], err = m.l.LocalizeString("service.owner", msg.Locale()); err != nil { return "", err } if m.data["OwnerAddress"], err = m.l.LocalizeString("service.address", msg.Locale()); err != nil { return "", err } if m.data["OwnerPhone"], err = m.l.LocalizeString("service.phone", msg.Locale()); err != nil { return "", err } maps.Copy(m.data, msg.Parameters()) } content, err := mailkey.Body(m.l, m.data, msg.TemplateID(), msg.Locale()) if err != nil { return "", err } subject, err := mailkey.Subject(m.l, m.data, msg.TemplateID(), msg.Locale()) if err != nil { return "", err } return m.putOnHTMLTemplate(msg, content, subject) } func (t *EmailNotificationTemplate) SetUnsubscribable(isUnsubscribable bool) { t.unsubscribable = isUnsubscribable } func (t *EmailNotificationTemplate) SetButton(hasButton bool) { t.hasButton = hasButton } func NewEmailNotification(l localizer.Localizer, dp domainprovider.DomainProvider) *EmailNotificationTemplate { p := &EmailNotificationTemplate{ dp: dp, l: l, data: localization.LocData{}, } p.unsubscribable = false p.hasButton = false return p }