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 }