2023-12-29 11:30:20 +00:00
|
|
|
package client
|
|
|
|
|
2023-12-31 12:22:03 +00:00
|
|
|
import (
|
2024-01-03 13:50:11 +00:00
|
|
|
"bytes"
|
2023-12-31 12:22:03 +00:00
|
|
|
"fmt"
|
2024-01-03 13:50:11 +00:00
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
"go.uber.org/zap"
|
|
|
|
"mime/multipart"
|
2023-12-31 12:22:03 +00:00
|
|
|
)
|
2023-12-29 11:30:20 +00:00
|
|
|
|
2024-01-03 13:50:11 +00:00
|
|
|
type RecoveryEmailSenderDeps struct {
|
|
|
|
SmtpApiUrl string
|
|
|
|
SmtpHost string
|
|
|
|
SmtpPort string
|
|
|
|
SmtpSender string
|
|
|
|
Username string
|
|
|
|
Password string
|
|
|
|
ApiKey string
|
|
|
|
FiberClient *fiber.Client
|
|
|
|
Logger *zap.Logger
|
|
|
|
}
|
|
|
|
|
2023-12-31 12:22:03 +00:00
|
|
|
type RecoveryEmailSender struct {
|
2024-01-03 13:50:11 +00:00
|
|
|
deps RecoveryEmailSenderDeps
|
2023-12-31 12:22:03 +00:00
|
|
|
}
|
2023-12-29 11:30:20 +00:00
|
|
|
|
2024-01-03 13:50:11 +00:00
|
|
|
func NewRecoveryEmailSender(deps RecoveryEmailSenderDeps) *RecoveryEmailSender {
|
|
|
|
if deps.FiberClient == nil {
|
|
|
|
deps.FiberClient = fiber.AcquireClient()
|
|
|
|
}
|
|
|
|
return &RecoveryEmailSender{
|
|
|
|
deps: deps,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (r *RecoveryEmailSender) SendRecoveryEmail(email string, signature []byte) error {
|
|
|
|
url := r.deps.SmtpApiUrl
|
|
|
|
|
|
|
|
fmt.Println(email, signature)
|
|
|
|
|
2023-12-31 12:22:03 +00:00
|
|
|
message := fmt.Sprintf("To: %s\r\n"+
|
|
|
|
"Subject: Восстановление доступа\r\n"+
|
|
|
|
"\r\n"+
|
|
|
|
"Чтобы восстановить доступ, пожалуйста, перейдите по ссылке ниже:\r\n"+
|
|
|
|
" https://hub.pena.digital/codeword/restore/%s\r\n", email, signature)
|
|
|
|
|
2024-01-03 13:50:11 +00:00
|
|
|
form := new(bytes.Buffer)
|
|
|
|
writer := multipart.NewWriter(form)
|
|
|
|
defer writer.Close()
|
|
|
|
|
|
|
|
fields := map[string]string{
|
|
|
|
"from": r.deps.SmtpSender,
|
|
|
|
"to": "pashamullin202@gmail.com",
|
|
|
|
"subject": "Восстановление доступа",
|
|
|
|
"html": message,
|
|
|
|
}
|
|
|
|
|
|
|
|
for key, value := range fields {
|
|
|
|
if err := writer.WriteField(key, value); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
2023-12-31 12:22:03 +00:00
|
|
|
|
2024-01-03 13:50:11 +00:00
|
|
|
if err := writer.Close(); err != nil {
|
2023-12-31 12:22:03 +00:00
|
|
|
return err
|
|
|
|
}
|
2023-12-29 11:30:20 +00:00
|
|
|
|
2024-01-03 13:50:11 +00:00
|
|
|
req := r.deps.FiberClient.Post(url).Body(form.Bytes()).ContentType(writer.FormDataContentType())
|
|
|
|
if r.deps.ApiKey != "" {
|
|
|
|
req.Set("Authorization", r.deps.ApiKey)
|
|
|
|
}
|
|
|
|
|
|
|
|
statusCode, body, errs := req.Bytes()
|
|
|
|
if errs != nil {
|
|
|
|
r.deps.Logger.Error("Ошибка при отправке запроса", zap.Error(errs[0]))
|
|
|
|
return errs[0]
|
|
|
|
}
|
|
|
|
|
|
|
|
if statusCode != fiber.StatusOK {
|
|
|
|
err := fmt.Errorf("SMTP сервис вернул ошибку: %s Тело ответа: %s", statusCode, body)
|
|
|
|
r.deps.Logger.Error("Ошибка при отправке электронной почты", zap.Error(err))
|
|
|
|
return err
|
|
|
|
}
|
2023-12-29 11:30:20 +00:00
|
|
|
|
2024-01-03 13:50:11 +00:00
|
|
|
r.deps.Logger.Info("Письмо для восстановления отправлено", zap.String("email", email))
|
2023-12-29 11:30:20 +00:00
|
|
|
return nil
|
|
|
|
}
|