From 77fc17ec8c364e210b9f2c70ebb2f2f2bbe0fdba Mon Sep 17 00:00:00 2001 From: Ryan Halliday Date: Sat, 24 Feb 2024 11:40:41 +1300 Subject: [PATCH 1/2] MailType as email template parameter --- README.md | 10 +++++----- internal/mailer/template.go | 39 ++++++++++++++++++++++++------------- 2 files changed, 31 insertions(+), 18 deletions(-) diff --git a/README.md b/README.md index c54d5b8fc1..823a2eec60 100644 --- a/README.md +++ b/README.md @@ -587,7 +587,7 @@ Email subject to use for email change confirmation. Defaults to `Confirm Email C `MAILER_TEMPLATES_INVITE` - `string` URL path to an email template to use when inviting a user. (e.g. `https://www.example.com/path-to-email-template.html`) -`SiteURL`, `Email`, and `ConfirmationURL` variables are available. +`SiteURL`, `Email`, `MailType`, and `ConfirmationURL` variables are available. Default Content (if template is unavailable): @@ -604,7 +604,7 @@ Default Content (if template is unavailable): `MAILER_TEMPLATES_CONFIRMATION` - `string` URL path to an email template to use when confirming a signup. (e.g. `https://www.example.com/path-to-email-template.html`) -`SiteURL`, `Email`, and `ConfirmationURL` variables are available. +`SiteURL`, `Email`, `MailType`, and `ConfirmationURL` variables are available. Default Content (if template is unavailable): @@ -618,7 +618,7 @@ Default Content (if template is unavailable): `MAILER_TEMPLATES_RECOVERY` - `string` URL path to an email template to use when resetting a password. (e.g. `https://www.example.com/path-to-email-template.html`) -`SiteURL`, `Email`, and `ConfirmationURL` variables are available. +`SiteURL`, `Email`, `MailType`, and `ConfirmationURL` variables are available. Default Content (if template is unavailable): @@ -632,7 +632,7 @@ Default Content (if template is unavailable): `MAILER_TEMPLATES_MAGIC_LINK` - `string` URL path to an email template to use when sending magic link. (e.g. `https://www.example.com/path-to-email-template.html`) -`SiteURL`, `Email`, and `ConfirmationURL` variables are available. +`SiteURL`, `Email`, `MailType`, and `ConfirmationURL` variables are available. Default Content (if template is unavailable): @@ -646,7 +646,7 @@ Default Content (if template is unavailable): `MAILER_TEMPLATES_EMAIL_CHANGE` - `string` URL path to an email template to use when confirming the change of an email address. (e.g. `https://www.example.com/path-to-email-template.html`) -`SiteURL`, `Email`, `NewEmail`, and `ConfirmationURL` variables are available. +`SiteURL`, `Email`, `NewEmail`, `MailType`, and `ConfirmationURL` variables are available. Default Content (if template is unavailable): diff --git a/internal/mailer/template.go b/internal/mailer/template.go index ba6c223350..af47fda5d1 100644 --- a/internal/mailer/template.go +++ b/internal/mailer/template.go @@ -33,6 +33,14 @@ func encodeRedirectURL(referrerURL string) string { return referrerURL } +const ( + magiclinkMailType = "magiclink" + recoveryMailType = "recovery" + inviteMailType = "invite" + signupMailType = "signup" + emailChangeMailType = "email_change" +) + const defaultInviteMail = `

You have been invited

You have been invited to create a user on {{ .SiteURL }}. Follow this link to accept the invite:

@@ -78,7 +86,7 @@ func (m TemplateMailer) ValidateEmail(email string) error { func (m *TemplateMailer) InviteMail(user *models.User, otp, referrerURL string, externalURL *url.URL) error { path, err := getPath(m.Config.Mailer.URLPaths.Invite, &EmailParams{ Token: user.ConfirmationToken, - Type: "invite", + Type: inviteMailType, RedirectTo: referrerURL, }) @@ -94,6 +102,7 @@ func (m *TemplateMailer) InviteMail(user *models.User, otp, referrerURL string, "TokenHash": user.ConfirmationToken, "Data": user.UserMetaData, "RedirectTo": referrerURL, + "MailType": inviteMailType, } return m.Mailer.Mail( @@ -109,7 +118,7 @@ func (m *TemplateMailer) InviteMail(user *models.User, otp, referrerURL string, func (m *TemplateMailer) ConfirmationMail(user *models.User, otp, referrerURL string, externalURL *url.URL) error { path, err := getPath(m.Config.Mailer.URLPaths.Confirmation, &EmailParams{ Token: user.ConfirmationToken, - Type: "signup", + Type: signupMailType, RedirectTo: referrerURL, }) if err != nil { @@ -124,6 +133,7 @@ func (m *TemplateMailer) ConfirmationMail(user *models.User, otp, referrerURL st "TokenHash": user.ConfirmationToken, "Data": user.UserMetaData, "RedirectTo": referrerURL, + "MailType": signupMailType, } return m.Mailer.Mail( @@ -189,7 +199,7 @@ func (m *TemplateMailer) EmailChangeMail(user *models.User, otpNew, otpCurrent, m.Config.Mailer.URLPaths.EmailChange, &EmailParams{ Token: email.TokenHash, - Type: "email_change", + Type: emailChangeMailType, RedirectTo: referrerURL, }, ) @@ -207,6 +217,7 @@ func (m *TemplateMailer) EmailChangeMail(user *models.User, otpNew, otpCurrent, "SendingTo": address, "Data": user.UserMetaData, "RedirectTo": referrerURL, + "MailType": emailChangeMailType, } errors <- m.Mailer.Mail( address, @@ -232,7 +243,7 @@ func (m *TemplateMailer) EmailChangeMail(user *models.User, otpNew, otpCurrent, func (m *TemplateMailer) RecoveryMail(user *models.User, otp, referrerURL string, externalURL *url.URL) error { path, err := getPath(m.Config.Mailer.URLPaths.Recovery, &EmailParams{ Token: user.RecoveryToken, - Type: "recovery", + Type: recoveryMailType, RedirectTo: referrerURL, }) if err != nil { @@ -246,6 +257,7 @@ func (m *TemplateMailer) RecoveryMail(user *models.User, otp, referrerURL string "TokenHash": user.RecoveryToken, "Data": user.UserMetaData, "RedirectTo": referrerURL, + "MailType": recoveryMailType, } return m.Mailer.Mail( @@ -261,7 +273,7 @@ func (m *TemplateMailer) RecoveryMail(user *models.User, otp, referrerURL string func (m *TemplateMailer) MagicLinkMail(user *models.User, otp, referrerURL string, externalURL *url.URL) error { path, err := getPath(m.Config.Mailer.URLPaths.Recovery, &EmailParams{ Token: user.RecoveryToken, - Type: "magiclink", + Type: magiclinkMailType, RedirectTo: referrerURL, }) if err != nil { @@ -276,6 +288,7 @@ func (m *TemplateMailer) MagicLinkMail(user *models.User, otp, referrerURL strin "TokenHash": user.RecoveryToken, "Data": user.UserMetaData, "RedirectTo": referrerURL, + "MailType": magiclinkMailType, } return m.Mailer.Mail( @@ -304,28 +317,28 @@ func (m TemplateMailer) GetEmailActionLink(user *models.User, actionType, referr var path *url.URL switch actionType { - case "magiclink": + case magiclinkMailType: path, err = getPath(m.Config.Mailer.URLPaths.Recovery, &EmailParams{ Token: user.RecoveryToken, - Type: "magiclink", + Type: magiclinkMailType, RedirectTo: referrerURL, }) - case "recovery": + case recoveryMailType: path, err = getPath(m.Config.Mailer.URLPaths.Recovery, &EmailParams{ Token: user.RecoveryToken, - Type: "recovery", + Type: recoveryMailType, RedirectTo: referrerURL, }) - case "invite": + case inviteMailType: path, err = getPath(m.Config.Mailer.URLPaths.Invite, &EmailParams{ Token: user.ConfirmationToken, - Type: "invite", + Type: inviteMailType, RedirectTo: referrerURL, }) - case "signup": + case signupMailType: path, err = getPath(m.Config.Mailer.URLPaths.Confirmation, &EmailParams{ Token: user.ConfirmationToken, - Type: "signup", + Type: signupMailType, RedirectTo: referrerURL, }) case "email_change_current": From 54b4658a27081ef0f477e3eb4fbb4e8e5e3d2410 Mon Sep 17 00:00:00 2001 From: Ryan Halliday Date: Thu, 14 Mar 2024 17:35:22 +1300 Subject: [PATCH 2/2] Change consts to start with uppercase --- internal/mailer/template.go | 46 ++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/internal/mailer/template.go b/internal/mailer/template.go index af47fda5d1..da3693c34c 100644 --- a/internal/mailer/template.go +++ b/internal/mailer/template.go @@ -34,11 +34,11 @@ func encodeRedirectURL(referrerURL string) string { } const ( - magiclinkMailType = "magiclink" - recoveryMailType = "recovery" - inviteMailType = "invite" - signupMailType = "signup" - emailChangeMailType = "email_change" + MagiclinkMailType = "magiclink" + RecoveryMailType = "recovery" + InviteMailType = "invite" + SignupMailType = "signup" + EmailChangeMailType = "email_change" ) const defaultInviteMail = `

You have been invited

@@ -86,7 +86,7 @@ func (m TemplateMailer) ValidateEmail(email string) error { func (m *TemplateMailer) InviteMail(user *models.User, otp, referrerURL string, externalURL *url.URL) error { path, err := getPath(m.Config.Mailer.URLPaths.Invite, &EmailParams{ Token: user.ConfirmationToken, - Type: inviteMailType, + Type: InviteMailType, RedirectTo: referrerURL, }) @@ -102,7 +102,7 @@ func (m *TemplateMailer) InviteMail(user *models.User, otp, referrerURL string, "TokenHash": user.ConfirmationToken, "Data": user.UserMetaData, "RedirectTo": referrerURL, - "MailType": inviteMailType, + "MailType": InviteMailType, } return m.Mailer.Mail( @@ -118,7 +118,7 @@ func (m *TemplateMailer) InviteMail(user *models.User, otp, referrerURL string, func (m *TemplateMailer) ConfirmationMail(user *models.User, otp, referrerURL string, externalURL *url.URL) error { path, err := getPath(m.Config.Mailer.URLPaths.Confirmation, &EmailParams{ Token: user.ConfirmationToken, - Type: signupMailType, + Type: SignupMailType, RedirectTo: referrerURL, }) if err != nil { @@ -133,7 +133,7 @@ func (m *TemplateMailer) ConfirmationMail(user *models.User, otp, referrerURL st "TokenHash": user.ConfirmationToken, "Data": user.UserMetaData, "RedirectTo": referrerURL, - "MailType": signupMailType, + "MailType": SignupMailType, } return m.Mailer.Mail( @@ -199,7 +199,7 @@ func (m *TemplateMailer) EmailChangeMail(user *models.User, otpNew, otpCurrent, m.Config.Mailer.URLPaths.EmailChange, &EmailParams{ Token: email.TokenHash, - Type: emailChangeMailType, + Type: EmailChangeMailType, RedirectTo: referrerURL, }, ) @@ -217,7 +217,7 @@ func (m *TemplateMailer) EmailChangeMail(user *models.User, otpNew, otpCurrent, "SendingTo": address, "Data": user.UserMetaData, "RedirectTo": referrerURL, - "MailType": emailChangeMailType, + "MailType": EmailChangeMailType, } errors <- m.Mailer.Mail( address, @@ -243,7 +243,7 @@ func (m *TemplateMailer) EmailChangeMail(user *models.User, otpNew, otpCurrent, func (m *TemplateMailer) RecoveryMail(user *models.User, otp, referrerURL string, externalURL *url.URL) error { path, err := getPath(m.Config.Mailer.URLPaths.Recovery, &EmailParams{ Token: user.RecoveryToken, - Type: recoveryMailType, + Type: RecoveryMailType, RedirectTo: referrerURL, }) if err != nil { @@ -257,7 +257,7 @@ func (m *TemplateMailer) RecoveryMail(user *models.User, otp, referrerURL string "TokenHash": user.RecoveryToken, "Data": user.UserMetaData, "RedirectTo": referrerURL, - "MailType": recoveryMailType, + "MailType": RecoveryMailType, } return m.Mailer.Mail( @@ -273,7 +273,7 @@ func (m *TemplateMailer) RecoveryMail(user *models.User, otp, referrerURL string func (m *TemplateMailer) MagicLinkMail(user *models.User, otp, referrerURL string, externalURL *url.URL) error { path, err := getPath(m.Config.Mailer.URLPaths.Recovery, &EmailParams{ Token: user.RecoveryToken, - Type: magiclinkMailType, + Type: MagiclinkMailType, RedirectTo: referrerURL, }) if err != nil { @@ -288,7 +288,7 @@ func (m *TemplateMailer) MagicLinkMail(user *models.User, otp, referrerURL strin "TokenHash": user.RecoveryToken, "Data": user.UserMetaData, "RedirectTo": referrerURL, - "MailType": magiclinkMailType, + "MailType": MagiclinkMailType, } return m.Mailer.Mail( @@ -317,28 +317,28 @@ func (m TemplateMailer) GetEmailActionLink(user *models.User, actionType, referr var path *url.URL switch actionType { - case magiclinkMailType: + case MagiclinkMailType: path, err = getPath(m.Config.Mailer.URLPaths.Recovery, &EmailParams{ Token: user.RecoveryToken, - Type: magiclinkMailType, + Type: MagiclinkMailType, RedirectTo: referrerURL, }) - case recoveryMailType: + case RecoveryMailType: path, err = getPath(m.Config.Mailer.URLPaths.Recovery, &EmailParams{ Token: user.RecoveryToken, - Type: recoveryMailType, + Type: RecoveryMailType, RedirectTo: referrerURL, }) - case inviteMailType: + case InviteMailType: path, err = getPath(m.Config.Mailer.URLPaths.Invite, &EmailParams{ Token: user.ConfirmationToken, - Type: inviteMailType, + Type: InviteMailType, RedirectTo: referrerURL, }) - case signupMailType: + case SignupMailType: path, err = getPath(m.Config.Mailer.URLPaths.Confirmation, &EmailParams{ Token: user.ConfirmationToken, - Type: signupMailType, + Type: SignupMailType, RedirectTo: referrerURL, }) case "email_change_current":