73 lines
1.7 KiB
Go
73 lines
1.7 KiB
Go
package api
|
||
|
||
import (
|
||
"context"
|
||
"errors"
|
||
"gitea.pena/PenaSide/penadisk/dal"
|
||
"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
|
||
}
|