generated from pkg/go-template
147 lines
3.8 KiB
Go
147 lines
3.8 KiB
Go
|
package handler
|
|||
|
|
|||
|
import (
|
|||
|
"git.icechen.cn/monorepo/backend/app/brahma/api/murder/internal/error_process"
|
|||
|
"git.icechen.cn/monorepo/backend/app/brahma/api/murder/internal/model"
|
|||
|
"github.com/gofiber/fiber/v2"
|
|||
|
"github.com/google/uuid"
|
|||
|
"github.com/pkg/errors"
|
|||
|
"github.com/spf13/cast"
|
|||
|
"reflect"
|
|||
|
"strings"
|
|||
|
)
|
|||
|
|
|||
|
type pluginFunc func(interface{}) error
|
|||
|
|
|||
|
func checkParam(body interface{}, ctx *fiber.Ctx, plugins ...pluginFunc) error {
|
|||
|
//第一次执行解析body,并且调用插件方法
|
|||
|
if ctx != nil {
|
|||
|
err := ctx.BodyParser(body)
|
|||
|
if err != nil {
|
|||
|
return error_process.CommonErr(err)
|
|||
|
}
|
|||
|
for _, plugin := range plugins {
|
|||
|
if err = plugin(body); err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//step1 校验是否是指针
|
|||
|
typ := reflect.TypeOf(body)
|
|||
|
val := reflect.ValueOf(body)
|
|||
|
if val.Kind().String() != reflect.Ptr.String() {
|
|||
|
return errors.New(error_process.NoPointError)
|
|||
|
}
|
|||
|
if val.IsNil() {
|
|||
|
return errors.New(error_process.NilPointError)
|
|||
|
}
|
|||
|
num := val.Elem().NumField()
|
|||
|
for i := 0; i < num; i++ {
|
|||
|
kind := val.Elem().Field(i).Kind().String()
|
|||
|
switch kind {
|
|||
|
case reflect.Ptr.String():
|
|||
|
//显示指定某些指针跳过校验
|
|||
|
if tag := typ.Elem().Field(i).Tag.Get("valid"); tag == "omitempty" {
|
|||
|
continue
|
|||
|
}
|
|||
|
//递归调用
|
|||
|
if err := checkParam(val.Elem().Field(i).Interface(), nil); err != nil {
|
|||
|
return err
|
|||
|
}
|
|||
|
default:
|
|||
|
//非空值验证
|
|||
|
if tag := typ.Elem().Field(i).Tag.Get("valid"); tag == "no_empty" {
|
|||
|
switch kind {
|
|||
|
case reflect.Ptr.String():
|
|||
|
if val.Elem().Field(i).IsNil() == true {
|
|||
|
return error_process.EmptyValueErr(typ.Elem().Field(i).Tag.Get("json"))
|
|||
|
}
|
|||
|
case reflect.Slice.String():
|
|||
|
if val.Elem().Field(i).IsNil() == true || val.Elem().Field(i).Len() == 0 {
|
|||
|
return error_process.EmptyValueErr(typ.Elem().Field(i).Tag.Get("json"))
|
|||
|
}
|
|||
|
default:
|
|||
|
if val.Elem().Field(i).IsZero() {
|
|||
|
return error_process.EmptyValueErr(typ.Elem().Field(i).Tag.Get("json"))
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
//指定制验证
|
|||
|
if values := typ.Elem().Field(i).Tag.Get("value"); values != "" {
|
|||
|
eles := make([]string, 0)
|
|||
|
if eles = strings.Split(values, "|"); len(eles) == 0 {
|
|||
|
continue
|
|||
|
}
|
|||
|
switch kind {
|
|||
|
case reflect.Int.String():
|
|||
|
for _, v := range eles {
|
|||
|
if b := val.Elem().Field(i).Int(); b == cast.ToInt64(v) {
|
|||
|
//匹配到值定制跳出此次tag处理方法
|
|||
|
goto LOOP
|
|||
|
}
|
|||
|
}
|
|||
|
return errors.New(error_process.IllegalValueError)
|
|||
|
default:
|
|||
|
return errors.New(error_process.BodyParserErr)
|
|||
|
}
|
|||
|
}
|
|||
|
LOOP:
|
|||
|
}
|
|||
|
return nil
|
|||
|
}
|
|||
|
|
|||
|
//tag uuid 覆盖写
|
|||
|
func tagUuidPlugin(body interface{}) error {
|
|||
|
if req, ok := body.(*TagReq); ok {
|
|||
|
if req.Tag == nil {
|
|||
|
return errors.New(error_process.BodyParserErr)
|
|||
|
}
|
|||
|
//if req.Tag.Uuid == "" {
|
|||
|
// req.Tag.Uuid = xid.New().String()
|
|||
|
//}
|
|||
|
return nil
|
|||
|
}
|
|||
|
return errors.New(error_process.BodyParserErr)
|
|||
|
}
|
|||
|
|
|||
|
//category uuid 覆盖写
|
|||
|
func categoryUuidPlugin(body interface{}) error {
|
|||
|
if req, ok := body.(*CategoryReq); ok {
|
|||
|
if req.Category == nil {
|
|||
|
return errors.New(error_process.BodyParserErr)
|
|||
|
}
|
|||
|
if req.Category.Uuid == "" {
|
|||
|
req.Category.Uuid = uuid.New().String()
|
|||
|
}
|
|||
|
return nil
|
|||
|
}
|
|||
|
return errors.New(error_process.BodyParserErr)
|
|||
|
}
|
|||
|
|
|||
|
//script uuid 覆盖写
|
|||
|
func scriptUuidPlugin(body interface{}) error {
|
|||
|
if req, ok := body.(*model.Scripts); ok {
|
|||
|
if req == nil {
|
|||
|
return errors.New(error_process.BodyParserErr)
|
|||
|
}
|
|||
|
if req.Uuid == "" {
|
|||
|
req.Uuid = uuid.New().String()
|
|||
|
}
|
|||
|
return nil
|
|||
|
}
|
|||
|
return errors.New(error_process.BodyParserErr)
|
|||
|
}
|
|||
|
|
|||
|
func createTagParamCheck(body interface{}, ctx *fiber.Ctx) error {
|
|||
|
return checkParam(body, ctx, tagUuidPlugin)
|
|||
|
}
|
|||
|
|
|||
|
func createCategoryParamCheck(body interface{}, ctx *fiber.Ctx) error {
|
|||
|
return checkParam(body, ctx, categoryUuidPlugin)
|
|||
|
}
|
|||
|
|
|||
|
func createScriptParamCheck(body interface{}, ctx *fiber.Ctx) error {
|
|||
|
return checkParam(body, ctx, scriptUuidPlugin)
|
|||
|
}
|