template-monorepo/internal/model/notification/template/registry.go

93 lines
2.8 KiB
Go
Raw Permalink Normal View History

package template
import (
"fmt"
"gateway/internal/model/notification/domain/enum"
domtpl "gateway/internal/model/notification/domain/template"
)
// DefaultRegistry returns built-in templates (content loaded from go:embed files).
func DefaultRegistry() domtpl.Registry {
return domtpl.Registry{
enum.NotifyVerifyEmail: localeSpecs(otpEmailVars(),
emailFiles("verify_email"),
nil,
),
enum.NotifyVerifyRegistrationEmail: localeSpecs(otpEmailVars(),
emailFiles("verify_registration_email"),
nil,
),
enum.NotifyVerifyPhone: localeSpecs(otpSMSVars(),
nil,
smsFiles("verify_phone"),
),
enum.NotifyStepUpEmail: localeSpecs(otpEmailVars(),
emailFiles("step_up_email"),
nil,
),
enum.NotifyStepUpPhone: localeSpecs(otpSMSVars(),
nil,
smsFiles("step_up_phone"),
),
enum.NotifyAccountSuspended: {
domtpl.LocaleZhTW: {
RequiredVars: []string{},
EmailSubjectFile: fmt.Sprintf("subjects/account_suspended.%s.txt", domtpl.LocaleZhTW),
EmailBodyFile: fmt.Sprintf("html/account_suspended.%s.html", domtpl.LocaleZhTW),
},
},
enum.NotifyTenantWelcome: {
domtpl.LocaleZhTW: {
RequiredVars: []string{"tenant_name"},
EmailSubjectFile: fmt.Sprintf("subjects/tenant_welcome.%s.txt", domtpl.LocaleZhTW),
EmailBodyFile: fmt.Sprintf("html/tenant_welcome.%s.html", domtpl.LocaleZhTW),
},
},
}
}
func otpEmailVars() []string { return []string{domtpl.VarCode, domtpl.VarExpiresIn} }
func otpSMSVars() []string { return []string{domtpl.VarCode, domtpl.VarExpiresIn} }
func emailFiles(base string) map[string]domtpl.Spec {
return map[string]domtpl.Spec{
domtpl.LocaleZhTW: {
EmailSubjectFile: fmt.Sprintf("subjects/%s.%s.txt", base, domtpl.LocaleZhTW),
EmailBodyFile: fmt.Sprintf("html/%s.%s.html", base, domtpl.LocaleZhTW),
},
domtpl.LocaleEnUS: {
EmailSubjectFile: fmt.Sprintf("subjects/%s.%s.txt", base, domtpl.LocaleEnUS),
EmailBodyFile: fmt.Sprintf("html/%s.%s.html", base, domtpl.LocaleEnUS),
},
}
}
func smsFiles(base string) map[string]domtpl.Spec {
return map[string]domtpl.Spec{
domtpl.LocaleZhTW: {SMSTextFile: fmt.Sprintf("sms/%s.%s.txt", base, domtpl.LocaleZhTW)},
domtpl.LocaleEnUS: {SMSTextFile: fmt.Sprintf("sms/%s.%s.txt", base, domtpl.LocaleEnUS)},
}
}
func localeSpecs(required []string, email, sms map[string]domtpl.Spec) map[string]domtpl.Spec {
locales := []string{domtpl.LocaleZhTW, domtpl.LocaleEnUS}
out := make(map[string]domtpl.Spec, len(locales))
for _, loc := range locales {
spec := domtpl.Spec{RequiredVars: required}
if email != nil {
if e, ok := email[loc]; ok {
spec.EmailSubjectFile = e.EmailSubjectFile
spec.EmailBodyFile = e.EmailBodyFile
}
}
if sms != nil {
if s, ok := sms[loc]; ok {
spec.SMSTextFile = s.SMSTextFile
}
}
out[loc] = spec
}
return out
}