2024-08-30 17:14:35 +07:00

81 lines
1.6 KiB
Go

package brevo
import (
"bytes"
"context"
"furtuna-be/internal/entity"
"html/template"
"io/ioutil"
"log"
brevo "github.com/getbrevo/brevo-go/lib"
)
type Config interface {
GetApiKey() string
}
type ServiceImpl struct {
brevoConn *brevo.APIClient
}
func (s ServiceImpl) SendEmailTransactional(ctx context.Context, param entity.SendEmailNotificationParam) error {
templateFile, err := ioutil.ReadFile(param.TemplatePath)
if err != nil {
log.Println(err)
return err
}
renderedTemplate, err := template.New(param.TemplateName).Parse(string(templateFile))
if err != nil {
log.Println(err)
return err
}
return s.sendEmail(ctx, renderedTemplate, param)
}
func (s ServiceImpl) sendEmail(ctx context.Context, tmpl *template.Template, param entity.SendEmailNotificationParam) error {
var body bytes.Buffer
err := tmpl.Execute(&body, param.Data)
if err != nil {
log.Println(err)
return err
}
payload := brevo.SendSmtpEmail{
Sender: &brevo.SendSmtpEmailSender{
Email: param.Sender,
},
To: []brevo.SendSmtpEmailTo{
{
Email: param.Recipient,
},
},
Subject: param.Subject,
HtmlContent: body.String(),
}
if len(param.CcEmails) != 0 {
for _, email := range param.CcEmails {
payload.Cc = append(payload.Cc, brevo.SendSmtpEmailCc{
Email: email,
})
}
}
_, _, err = s.brevoConn.TransactionalEmailsApi.SendTransacEmail(ctx, payload)
if err != nil {
return err
}
return nil
}
func New(conf Config) *ServiceImpl {
cfg := brevo.NewConfiguration()
cfg.AddDefaultHeader("api-key", conf.GetApiKey())
client := brevo.NewAPIClient(cfg)
return &ServiceImpl{brevoConn: client}
}