88 lines
2.0 KiB
Go
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
|
|
}
|