package brevo import ( "bytes" "context" "enaklo-pos-be/internal/common/logger" "enaklo-pos-be/internal/entity" "go.uber.org/zap" "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 { logger.ContextLogger(ctx).Error("error when reading file template", zap.Error(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 { logger.ContextLogger(ctx).Error("error when sending email", zap.Error(err)) return err } logger.ContextLogger(ctx).Info("sending email success") return nil } func New(conf Config) *ServiceImpl { cfg := brevo.NewConfiguration() cfg.AddDefaultHeader("api-key", conf.GetApiKey()) client := brevo.NewAPIClient(cfg) return &ServiceImpl{brevoConn: client} }