2024-02-05 08:23:35 +00:00
|
|
|
|
package client
|
|
|
|
|
|
2024-02-05 11:13:36 +00:00
|
|
|
|
import (
|
|
|
|
|
"bytes"
|
|
|
|
|
"fmt"
|
2024-11-26 15:28:42 +00:00
|
|
|
|
"gitea.pena/PenaSide/customer/internal/errors"
|
|
|
|
|
"gitea.pena/PenaSide/customer/internal/models"
|
2024-02-05 11:13:36 +00:00
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
|
"go.uber.org/zap"
|
|
|
|
|
"mime/multipart"
|
|
|
|
|
)
|
2024-02-05 08:23:35 +00:00
|
|
|
|
|
|
|
|
|
type MailClient struct {
|
2024-11-26 15:28:42 +00:00
|
|
|
|
apiUrl string
|
|
|
|
|
sender string
|
|
|
|
|
apiKey string
|
|
|
|
|
fiberClient *fiber.Client
|
|
|
|
|
logger *zap.Logger
|
|
|
|
|
mailAddress string
|
2024-02-05 08:23:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-26 15:28:42 +00:00
|
|
|
|
func NewMailClient(deps models.MailClientCfg, logger *zap.Logger) *MailClient {
|
2024-02-05 11:13:36 +00:00
|
|
|
|
if deps.FiberClient == nil {
|
|
|
|
|
deps.FiberClient = fiber.AcquireClient()
|
|
|
|
|
}
|
|
|
|
|
return &MailClient{
|
2024-11-26 15:28:42 +00:00
|
|
|
|
apiUrl: deps.ApiUrl,
|
|
|
|
|
sender: deps.Sender,
|
|
|
|
|
apiKey: deps.ApiKey,
|
|
|
|
|
fiberClient: deps.FiberClient,
|
|
|
|
|
logger: logger,
|
|
|
|
|
mailAddress: deps.MailAddress,
|
2024-02-05 11:13:36 +00:00
|
|
|
|
}
|
2024-02-05 08:23:35 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-02-22 23:53:53 +00:00
|
|
|
|
func (receiver *MailClient) SendMessage(userEmail string, verification *models.Verification, money float32) errors.Error {
|
2024-02-05 11:13:36 +00:00
|
|
|
|
body := fmt.Sprintf("<p>Поступила заявка на оплату через Р/С от пользователя с почтой %s (%s)</p>"+
|
2024-02-15 09:03:24 +00:00
|
|
|
|
"<p>Вот файлы его верификации:</p>"+
|
2024-10-20 13:40:30 +00:00
|
|
|
|
"<p>Запрос на оплату: %f рублей</p>", userEmail, verification.UserID, money)
|
2024-02-05 11:13:36 +00:00
|
|
|
|
|
|
|
|
|
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{
|
2024-11-26 15:28:42 +00:00
|
|
|
|
"from": receiver.sender,
|
|
|
|
|
"to": receiver.mailAddress,
|
2024-02-05 11:13:36 +00:00
|
|
|
|
"subject": "Новая заявка на оплату через Р/С",
|
|
|
|
|
"html": body,
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for key, value := range fields {
|
|
|
|
|
if err := writer.WriteField(key, value); err != nil {
|
2024-11-26 15:28:42 +00:00
|
|
|
|
return handleError(receiver.logger, "Error writing form field", err)
|
2024-02-05 11:13:36 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := writer.Close(); err != nil {
|
2024-11-26 15:28:42 +00:00
|
|
|
|
return handleError(receiver.logger, "Error closing form writer", err)
|
2024-02-05 11:13:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
2024-11-26 15:28:42 +00:00
|
|
|
|
fmt.Println("SEEEEEND", receiver.apiUrl)
|
|
|
|
|
req := receiver.fiberClient.Post(receiver.apiUrl).Body(form.Bytes()).ContentType(writer.FormDataContentType())
|
|
|
|
|
if receiver.apiKey != "" {
|
|
|
|
|
req.Set("Authorization", receiver.apiKey)
|
2024-02-05 11:13:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
statusCode, _, errs := req.Bytes()
|
|
|
|
|
if errs != nil {
|
2024-11-26 15:28:42 +00:00
|
|
|
|
return handleError(receiver.logger, "Error sending request", errs[0])
|
2024-02-05 11:13:36 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if statusCode != fiber.StatusOK {
|
2024-10-20 13:40:30 +00:00
|
|
|
|
err := fmt.Errorf("the SMTP service returned an error: %d", statusCode)
|
2024-11-26 15:28:42 +00:00
|
|
|
|
return handleError(receiver.logger, "Error sending email", err)
|
2024-02-05 11:13:36 +00:00
|
|
|
|
}
|
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,
|
|
|
|
|
)
|
|
|
|
|
}
|