worker/senders/senders.go
2024-06-11 19:56:32 +03:00

88 lines
2.0 KiB
Go

package senders
import (
"bytes"
_ "embed"
"fmt"
"html/template"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/clients"
"penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model"
)
type LeadSender interface {
SendLead(leadData LeadData) error
Name() string
}
type LeadData struct {
To interface{}
Subject string
Template string
TemplateData TemplateData
}
type TemplateData struct {
QuizConfig model.ResultInfo
AnswerContent model.ResultContent
AllAnswers []model.ResultAnswer
QuestionsMap map[uint64]string
AnswerTime string
}
type MailLeadSender struct {
client *clients.SmtpClient
}
func NewMailLeadSender(client *clients.SmtpClient) *MailLeadSender {
return &MailLeadSender{client: client}
}
func (m *MailLeadSender) SendLead(data LeadData) error {
err := m.SendMailWithAttachment(data.To.(string), data.Subject, data.Template, data.TemplateData, nil)
if err != nil {
return err
}
return nil
}
func (m *MailLeadSender) Name() string {
return "mail"
}
func (m *MailLeadSender) SendMailWithAttachment(recipient, subject string, emailTemplate string, data TemplateData, attachments []clients.Attachment) error {
text, err := m.generateTextFromTemplate(data, emailTemplate)
if err != nil {
return err
}
msg := clients.Message{
To: recipient,
Subject: subject,
HtmlBody: text,
Attachments: attachments,
}
return m.client.MailSender(msg)
}
func (m *MailLeadSender) generateTextFromTemplate(data TemplateData, tpl string) (string, error) {
t, err := template.New("email").Parse(tpl)
if err != nil {
return "", fmt.Errorf("error parsing template: %w", err)
}
var text bytes.Buffer
if err := t.Execute(&text, TemplateData{
QuizConfig: data.QuizConfig,
AnswerContent: data.AnswerContent,
AllAnswers: data.AllAnswers,
QuestionsMap: data.QuestionsMap,
AnswerTime: data.AnswerTime,
}); err != nil {
return "", fmt.Errorf("error executing template: %w", err)
}
return text.String(), nil
}