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
}