customer/internal/interface/client/mail.go

89 lines
2.5 KiB
Go
Raw Normal View History

2024-02-05 08:23:35 +00:00
package client
2024-02-05 11:13:36 +00:00
import (
"bytes"
"fmt"
"github.com/gofiber/fiber/v2"
"go.uber.org/zap"
"mime/multipart"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/errors"
"penahub.gitlab.yandexcloud.net/pena-services/customer/internal/models"
)
2024-02-05 08:23:35 +00:00
type MailClientDeps struct {
2024-02-05 11:13:36 +00:00
ApiUrl string
Sender string
Auth *models.PlainAuth
ApiKey string
FiberClient *fiber.Client
Logger *zap.Logger
2024-02-05 08:23:35 +00:00
}
type MailClient struct {
2024-02-05 11:13:36 +00:00
deps MailClientDeps
2024-02-05 08:23:35 +00:00
}
func NewMailClient(deps MailClientDeps) *MailClient {
2024-02-05 11:13:36 +00:00
if deps.FiberClient == nil {
deps.FiberClient = fiber.AcquireClient()
}
return &MailClient{
deps: deps,
}
2024-02-05 08:23:35 +00:00
}
2024-02-05 11:13:36 +00:00
func (receiver *MailClient) SendMessage(userEmail string, verification *models.Verification) errors.Error {
body := fmt.Sprintf("<p>Поступила заявка на оплату через Р/С от пользователя с почтой %s (%s)</p>"+
"<p>Вот файлы его верификации:</p>", userEmail, verification.UserID)
for _, file := range verification.Files {
body += fmt.Sprintf("<p>%s: <a href=\"%s\">%s</a></p>", file.Name, file.URL, file.URL)
}
form := new(bytes.Buffer)
writer := multipart.NewWriter(form)
defer writer.Close()
fields := map[string]string{
"from": receiver.deps.Sender,
2024-02-05 12:24:56 +00:00
"to": "pashamullin202@gmail.com",
2024-02-05 11:13:36 +00:00
"subject": "Новая заявка на оплату через Р/С",
"html": body,
}
for key, value := range fields {
if err := writer.WriteField(key, value); err != nil {
return handleError(receiver.deps.Logger, "Error writing form field", err)
}
}
if err := writer.Close(); err != nil {
return handleError(receiver.deps.Logger, "Error closing form writer", err)
}
req := receiver.deps.FiberClient.Post(receiver.deps.ApiUrl).Body(form.Bytes()).ContentType(writer.FormDataContentType())
if receiver.deps.ApiKey != "" {
req.Set("Authorization", receiver.deps.ApiKey)
}
statusCode, _, errs := req.Bytes()
if errs != nil {
return handleError(receiver.deps.Logger, "Error sending request", errs[0])
}
if statusCode != fiber.StatusOK {
err := fmt.Errorf("the SMTP service returned an error: %s", statusCode)
return handleError(receiver.deps.Logger, "Error sending email", err)
}
2024-02-05 08:23:35 +00:00
return nil
}
2024-02-05 11:13:36 +00:00
func handleError(logger *zap.Logger, message string, err error) errors.Error {
logger.Error(message, zap.Error(err))
return errors.New(
fmt.Errorf("failed to send email on <SendMessage> of <MailClient>: %w", err),
errors.ErrInternalError,
)
}