penadisk/api/api.go

73 lines
1.7 KiB
Go
Raw Permalink Normal View History

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
}