backend/pkg/api/param_validator.go

67 lines
1.6 KiB
Go

package api
import (
"fmt"
"github.com/go-playground/locales/zh_Hans_CN"
ut "github.com/go-playground/universal-translator"
"github.com/go-playground/validator/v10"
zh_translations "github.com/go-playground/validator/v10/translations/zh"
"github.com/gofiber/fiber/v2"
"reflect"
"strings"
)
var Validate *validator.Validate
var trans ut.Translator
func init() {
Validate = validator.New()
zh := zh_Hans_CN.New()
uni := ut.New(zh, zh)
var ok bool
trans, ok = uni.GetTranslator("zh_Hans_CN")
if !ok {
panic(fmt.Errorf("uni.GetTranslator(%s) failed", "zh"))
}
Validate.RegisterTagNameFunc(func(field reflect.StructField) string {
addWarp := func(tag string) string {
return "[" + tag + "]"
}
if labelTag := field.Tag.Get("label"); labelTag != "" {
return addWarp(labelTag)
}
if jsonTag := field.Tag.Get("json"); jsonTag != "" {
return addWarp(jsonTag)
}
return addWarp(field.Name)
})
err := zh_translations.RegisterDefaultTranslations(Validate, trans)
if err != nil {
panic(err)
}
}
func Bind(c *fiber.Ctx, out interface{}) error {
if reflect.TypeOf(out).Kind() != reflect.Ptr {
return NewFError("bind must ptr")
}
if err := c.BodyParser(out); err != nil {
return WarpFError(err)
}
err := Validate.Struct(out)
if err != nil {
if errs, ok := err.(validator.ValidationErrors); ok {
errString := make([]string, 0, len(errs))
for _, fieldError := range errs.Translate(trans) {
errString = append(errString, fieldError)
}
err = fmt.Errorf("%s", strings.Join(errString, ","))
}
return WarpFErrorWithCode(fiber.StatusBadRequest, err)
}
return nil
}