verification/internal/controllers/user/verification_user.go

177 lines
4.6 KiB
Go
Raw Normal View History

package user
2023-06-12 14:19:10 +00:00
import (
"errors"
"github.com/gofiber/fiber/v2"
2024-05-27 11:53:34 +00:00
"github.com/themakers/hlog"
"github.com/valyala/fasthttp"
"mime/multipart"
"penahub.gitlab.yandexcloud.net/backend/verification/internal/client"
"penahub.gitlab.yandexcloud.net/backend/verification/internal/models"
"penahub.gitlab.yandexcloud.net/backend/verification/internal/repository"
"penahub.gitlab.yandexcloud.net/backend/verification/pkg/validate_controllers"
2024-05-27 11:53:34 +00:00
"strings"
2023-06-12 14:19:10 +00:00
)
type VerifyUserControllerDeps struct {
Repository *repository.VerificationRepository
Telegram *client.Telegram
2023-06-12 14:19:10 +00:00
}
type VerifyUserController struct {
repository *repository.VerificationRepository
telegram *client.Telegram
2023-06-12 14:19:10 +00:00
}
func NewVerificationUserController(deps VerifyUserControllerDeps) *VerifyUserController {
return &VerifyUserController{
repository: deps.Repository,
telegram: deps.Telegram,
2023-06-12 14:19:10 +00:00
}
}
func (r *VerifyUserController) GetVerification(c *fiber.Ctx) error {
2024-05-27 11:53:34 +00:00
userID := c.Locals(models.UserCtxKey).(string)
2023-06-12 14:19:10 +00:00
if userID == "" {
return fiber.NewError(fiber.StatusUnauthorized)
2023-06-12 14:19:10 +00:00
}
resp, err := r.repository.GetByUserID(c.Context(), userID)
2023-06-12 14:19:10 +00:00
if err != nil {
return c.Status(fiber.StatusInternalServerError).SendString(err.Error())
}
if resp == nil {
return c.SendStatus(fiber.StatusNotFound)
2023-06-12 14:19:10 +00:00
}
return c.Status(fiber.StatusOK).JSON(resp)
}
func (r *VerifyUserController) CreateVerification(c *fiber.Ctx) error {
2023-06-12 14:19:10 +00:00
var req models.ReqCreateVerification
2024-02-11 18:22:37 +00:00
baseURL := c.BaseURL()
2024-05-27 11:53:34 +00:00
hloger := c.Locals(models.HlogCtxKey).(hlog.Logger)
2023-06-12 14:19:10 +00:00
2024-05-27 11:53:34 +00:00
userID := c.Locals(models.UserCtxKey).(string)
2023-06-12 14:19:10 +00:00
if userID == "" {
2024-05-27 11:53:34 +00:00
return fiber.NewError(fiber.StatusUnauthorized)
2023-06-12 14:19:10 +00:00
}
err := c.BodyParser(&req)
if err != nil {
return fiber.NewError(fiber.StatusBadRequest, err.Error())
}
errValidate := validate_controllers.ValidateStruct(&req)
2023-06-12 14:19:10 +00:00
if errValidate != nil {
return c.Status(fiber.StatusBadRequest).JSON(errValidate)
}
// INN FILE
innFH, err := c.FormFile("inn")
if err != nil || innFH.Size == 0 || innFH == nil {
return fiber.NewError(fiber.StatusBadRequest, "inn file required")
}
// RULE FILE
ruleFH, err := c.FormFile("rule")
if err != nil || ruleFH.Size == 0 || ruleFH == nil {
return fiber.NewError(fiber.StatusBadRequest, "rule file required")
}
// EGRULE FILE
egruleFH, err := c.FormFile("egrule")
if err != nil || egruleFH.Size == 0 || egruleFH == nil {
return fiber.NewError(fiber.StatusBadRequest, "egrule file required")
}
// CERTIFICATE FILE
var certFH *multipart.FileHeader
if req.Status == "nko" {
certFH, err = c.FormFile("certificate")
if err != nil || certFH.Size == 0 || certFH == nil {
return fiber.NewError(fiber.StatusBadRequest, "certificate file required")
}
} else {
certFH = nil
}
result, err := r.repository.Insert(c.Context(), userID, &models.Verification{
UserID: userID,
Accepted: false,
Status: req.Status,
Comment: "",
}, innFH, ruleFH, egruleFH, certFH)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
2024-02-11 18:22:37 +00:00
err = r.telegram.SendVerification(result, baseURL, false)
2023-06-12 14:19:10 +00:00
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
2024-05-27 11:53:34 +00:00
hloger.Emit(models.InfoVerificationRequested{
CtxUserIP: c.IP(),
CtxUserPort: c.Port(),
KeyDomain: strings.Join(c.Subdomains(), "/"),
KeyPath: c.Path(),
CtxID: result.ID,
KeyStatus: result.Status,
})
2023-06-12 14:19:10 +00:00
return c.Status(fiber.StatusOK).JSON(result)
}
func (r *VerifyUserController) SetVerificationFile(c *fiber.Ctx) error {
2024-02-11 18:22:37 +00:00
baseURL := c.BaseURL()
2024-05-27 11:53:34 +00:00
hloger := c.Locals(models.HlogCtxKey).(hlog.Logger)
2024-05-27 11:53:34 +00:00
userID := c.Locals(models.UserCtxKey).(string)
if userID == "" {
2024-05-27 11:53:34 +00:00
return fiber.NewError(fiber.StatusUnauthorized)
}
availableFiles := []string{"inn", "rule", "egrule", "certificate"}
var err error
var fileHeader *multipart.FileHeader
var result *models.Verification
for _, fileName := range availableFiles {
fileHeader, err = c.FormFile(fileName)
2023-09-15 13:41:56 +00:00
if errors.Is(err, fasthttp.ErrMissingFile) {
continue
}
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
result, err = r.repository.UpdateFile(c.Context(), userID, fileName, fileHeader)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
}
2024-02-11 18:22:37 +00:00
err = r.telegram.SendVerification(result, baseURL, true)
if err != nil {
return fiber.NewError(fiber.StatusInternalServerError, err.Error())
}
2024-05-27 11:53:34 +00:00
hloger.Emit(models.InfoVerificationRequested{
CtxUserIP: c.IP(),
CtxUserPort: c.Port(),
KeyDomain: strings.Join(c.Subdomains(), "/"),
KeyPath: c.Path(),
CtxID: result.ID,
KeyStatus: result.Status,
})
return c.SendStatus(fiber.StatusOK)
}