package emailtemplates import ( "Yimaru-Backend/internal/domain" "bytes" ) var defaultTemplates = map[string]domain.EmailTemplate{ domain.EmailTemplateSlugOTP: { Slug: domain.EmailTemplateSlugOTP, Name: "One-Time Password", Subject: "Yimaru - One Time Password", BodyText: "Welcome to Yimaru Online Learning Platform{{if .FirstName}}, {{.FirstName}}{{end}}. Your OTP is {{.OTP}}. It expires in {{.ExpiresMinutes}} minutes. Please do not share it with anyone.", BodyHTML: "

Welcome to Yimaru Online Learning Platform{{if .FirstName}}, {{.FirstName}}{{end}}.

Your one-time password is {{.OTP}}.

It expires in {{.ExpiresMinutes}} minutes. Please do not share it with anyone.

", Variables: []string{"OTP", "FirstName", "ExpiresMinutes"}, Status: domain.EmailTemplateStatusActive, }, domain.EmailTemplateSlugInvitation: { Slug: domain.EmailTemplateSlugInvitation, Name: "User Invitation", Subject: "You are invited to join Yimaru", BodyText: "Hi{{if .FirstName}} {{.FirstName}}{{end}}, you have been invited{{if .InviterName}} by {{.InviterName}}{{end}} to join Yimaru Online Learning Platform. Accept your invitation: {{.InviteLink}}", BodyHTML: "

Hi{{if .FirstName}} {{.FirstName}}{{end}},

You have been invited{{if .InviterName}} by {{.InviterName}}{{end}} to join Yimaru Online Learning Platform.

Accept your invitation

", Variables: []string{"FirstName", "InviterName", "InviteLink"}, Status: domain.EmailTemplateStatusActive, }, domain.EmailTemplateSlugPasswordReset: { Slug: domain.EmailTemplateSlugPasswordReset, Name: "Password Reset", Subject: "Reset your Yimaru password", BodyText: "Hi{{if .FirstName}} {{.FirstName}}{{end}}, use this link to reset your password: {{.ResetLink}}. The link expires in {{.ExpiresMinutes}} minutes.", BodyHTML: "

Hi{{if .FirstName}} {{.FirstName}}{{end}},

Use the link below to reset your password. It expires in {{.ExpiresMinutes}} minutes.

Reset your password

", Variables: []string{"FirstName", "ResetLink", "ExpiresMinutes"}, Status: domain.EmailTemplateStatusActive, }, domain.EmailTemplateSlugWelcome: { Slug: domain.EmailTemplateSlugWelcome, Name: "Welcome Email", Subject: "Welcome to Yimaru", BodyText: "Hi{{if .FirstName}} {{.FirstName}}{{end}}, welcome to Yimaru Online Learning Platform! Sign in at {{.LoginURL}} to get started.", BodyHTML: "

Hi{{if .FirstName}} {{.FirstName}}{{end}},

Welcome to Yimaru Online Learning Platform!

Sign in to get started

", Variables: []string{"FirstName", "LoginURL"}, Status: domain.EmailTemplateStatusActive, }, domain.EmailTemplateSlugCustomMessage: { Slug: domain.EmailTemplateSlugCustomMessage, Name: "Custom Message", Subject: "{{.Subject}}", BodyText: "{{.Message}}", BodyHTML: "

{{.Message}}

", Variables: []string{"Subject", "Message"}, Status: domain.EmailTemplateStatusActive, }, } func defaultTemplate(slug string) (domain.EmailTemplate, bool) { tmpl, ok := defaultTemplates[slug] return tmpl, ok } func renderTemplateFields(tmpl domain.EmailTemplate, data map[string]any) (domain.RenderedEmail, error) { if data == nil { data = map[string]any{} } subject, err := executeTextTemplate("subject:"+tmpl.Slug, tmpl.Subject, data) if err != nil { return domain.RenderedEmail{}, err } text, err := executeTextTemplate("text:"+tmpl.Slug, tmpl.BodyText, data) if err != nil { return domain.RenderedEmail{}, err } html, err := executeHTMLTemplate("html:"+tmpl.Slug, tmpl.BodyHTML, data) if err != nil { return domain.RenderedEmail{}, err } return domain.RenderedEmail{ Subject: subject, Text: text, HTML: html, }, nil } func executeTextTemplate(name, content string, data map[string]any) (string, error) { tmpl, err := newTextTemplate(name, content) if err != nil { return "", err } var buf bytes.Buffer if err := tmpl.Execute(&buf, data); err != nil { return "", err } return buf.String(), nil } func executeHTMLTemplate(name, content string, data map[string]any) (string, error) { tmpl, err := newHTMLTemplate(name, content) if err != nil { return "", err } var buf bytes.Buffer if err := tmpl.Execute(&buf, data); err != nil { return "", err } return buf.String(), nil }