goploy/core/Validate.go

106 lines
2.6 KiB
Go
Raw Normal View History

2020-08-04 14:28:25 +08:00
package core
import (
"github.com/go-playground/locales/en"
ut "github.com/go-playground/universal-translator"
"gopkg.in/go-playground/validator.v9"
en_translations "gopkg.in/go-playground/validator.v9/translations/en"
"reflect"
"strings"
"unicode"
)
2020-08-15 13:38:06 +08:00
2020-08-04 14:28:25 +08:00
// Validate use a single instance of Validate, it caches struct info
var Validate *validator.Validate
2020-08-15 13:38:06 +08:00
2020-08-04 14:28:25 +08:00
// Trans Translator
var Trans ut.Translator
// CreateValidator create a single Validator
func CreateValidator() {
english := en.New()
uni := ut.New(english, english)
Trans, _ = uni.GetTranslator("english")
Validate = validator.New()
en_translations.RegisterDefaultTranslations(Validate, Trans)
registerTagName()
registerPassword()
registerRole()
}
func registerTagName() {
Validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
if name == "-" {
return ""
}
return name
})
}
func registerPassword() {
Validate.RegisterValidation("password", func(fl validator.FieldLevel) bool {
// 8到16个字符至少包含字母、数字、特殊符号中的两种
password := fl.Field().String()
if len(password) < 8 || len(password) > 16 {
return false
}
var (
hasLetter = false
hasNumber = false
hasSpecial = false
)
for _, char := range password {
switch {
case unicode.IsLetter(char):
hasLetter = true
case unicode.IsNumber(char):
hasNumber = true
case unicode.IsPunct(char) || unicode.IsSymbol(char):
hasSpecial = true
}
}
if hasLetter && hasNumber {
return true
} else if hasLetter && hasSpecial {
return true
} else if hasNumber && hasSpecial {
return true
} else {
return false
}
})
Validate.RegisterTranslation("password", Trans, func(ut ut.Translator) error {
return ut.Add("password", "{0} policy is min:8, max:16 and at least one alpha and at least one special char!", true) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("password", fe.Field())
return t
})
}
func registerRole() {
Validate.RegisterValidation("role", func(fl validator.FieldLevel) bool {
// 8到16个字符至少包含字母、数字、特殊符号中的两种
role := fl.Field().String()
for _, v := range Roles {
if role == v {
return true
}
}
return false
})
Validate.RegisterTranslation("role", Trans, func(ut ut.Translator) error {
return ut.Add("role", "{0} is invalid", true) // see universal-translator for details
}, func(ut ut.Translator, fe validator.FieldError) string {
t, _ := ut.T("role", fe.Field())
return t
})
2020-08-15 13:38:06 +08:00
}