106 lines
2.1 KiB
Go
106 lines
2.1 KiB
Go
package brevo
|
|
|
|
import (
|
|
"bytes"
|
|
"context"
|
|
"enaklo-pos-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
|
|
}
|
|
|
|
tmpl := template.New(param.TemplateName).Funcs(template.FuncMap{
|
|
"range": func(args ...interface{}) []interface{} {
|
|
if len(args) == 0 {
|
|
return nil
|
|
}
|
|
|
|
switch items := args[0].(type) {
|
|
case []map[string]string:
|
|
result := make([]interface{}, len(items))
|
|
for i, item := range items {
|
|
result[i] = item
|
|
}
|
|
return result
|
|
case []interface{}:
|
|
return items
|
|
default:
|
|
if slice, ok := args[0].([]interface{}); ok {
|
|
return slice
|
|
}
|
|
return nil
|
|
}
|
|
},
|
|
})
|
|
|
|
renderedTemplate, err := tmpl.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{
|
|
Name: "Enaklo",
|
|
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}
|
|
}
|