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 }