2023-03-27 15:15:03 +00:00
|
|
|
|
package api
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"context"
|
|
|
|
|
"errors"
|
2024-12-16 08:59:11 +00:00
|
|
|
|
"gitea.pena/PenaSide/penadisk/dal"
|
2023-03-27 15:15:03 +00:00
|
|
|
|
"github.com/go-playground/validator/v10"
|
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
|
|
|
"go.uber.org/zap"
|
|
|
|
|
"reflect"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
var validate = validator.New()
|
|
|
|
|
|
|
|
|
|
type API struct {
|
|
|
|
|
logger *zap.Logger
|
|
|
|
|
minio *dal.MinioOptions
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewAPI(logger *zap.Logger, minio *dal.MinioOptions) *API {
|
|
|
|
|
return &API{logger: logger, minio: minio}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (a *API) ErrorHandler(ctx *fiber.Ctx, err error) error {
|
|
|
|
|
var e *fiber.Error
|
|
|
|
|
|
|
|
|
|
if !errors.As(err, &e) {
|
|
|
|
|
a.logger.Info("not fiber err")
|
|
|
|
|
e = fiber.NewError(fiber.StatusInternalServerError, err.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ctx.Set(fiber.HeaderContentType, fiber.MIMETextPlainCharsetUTF8)
|
|
|
|
|
|
|
|
|
|
a.logger.Error("API", zap.String("path", ctx.Path()), zap.Int("status", e.Code), zap.Error(e))
|
|
|
|
|
|
|
|
|
|
return ctx.Status(e.Code).SendString(e.Error())
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type RespErrorValidate struct {
|
|
|
|
|
Field string `json:"field"`
|
|
|
|
|
Tag string `json:"tag"`
|
|
|
|
|
Value string `json:"value"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ValidateStruct - возвращает строку с ошибкой, если структура не прошла валидацию
|
|
|
|
|
func ValidateStruct(ctx context.Context, s any) []*RespErrorValidate {
|
|
|
|
|
err := validate.StructCtx(ctx, s)
|
|
|
|
|
|
|
|
|
|
var errorsValidate []*RespErrorValidate
|
|
|
|
|
if err != nil {
|
|
|
|
|
err := err.(validator.ValidationErrors)
|
|
|
|
|
for _, err := range err {
|
|
|
|
|
field := err.Field()
|
|
|
|
|
|
|
|
|
|
r, _ := reflect.TypeOf(s).Elem().FieldByName(err.Field())
|
|
|
|
|
if queryTag := r.Tag.Get("query"); queryTag != "" {
|
|
|
|
|
field = queryTag
|
|
|
|
|
}
|
|
|
|
|
if jsonTag := r.Tag.Get("json"); jsonTag != "" {
|
|
|
|
|
field = jsonTag
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
errorsValidate = append(errorsValidate, &RespErrorValidate{
|
|
|
|
|
Field: field,
|
|
|
|
|
Tag: err.Tag(),
|
|
|
|
|
Value: err.Param(),
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return errorsValidate
|
|
|
|
|
}
|