Skip to content

Instantly share code, notes, and snippets.

@koddr
Last active May 10, 2020 11:44
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save koddr/d509f7bdd7511919043b6e586b1fa609 to your computer and use it in GitHub Desktop.
Save koddr/d509f7bdd7511919043b6e586b1fa609 to your computer and use it in GitHub Desktop.
// ...
// Create new validator
validate := utils.Validate(map[string]string{
"uuid": user.ID.String(),
"email": user.Email,
"username": user.Username,
})
// Check fields validation
if errValidate := validate.Struct(user); errValidate != nil {
// Return invalid fields
c.Status(500).JSON(fiber.Map{"error": true, "msg": utils.ValidateErrors(errValidate)})
return
}
// ...
package utils
import (
"reflect"
"regexp"
"strings"
"github.com/go-playground/validator/v10"
"github.com/google/uuid"
)
// Validate create a new validator for expected fields,
// register function to get tag name from `json` tags
// and add validation to expected fields
func Validate(fields map[string]string) *validator.Validate {
// Create a new validator
validate := validator.New()
// Get tag name from `json`
validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
if name == "-" {
return ""
}
return name
})
// Add fields validation
for tag, field := range fields {
_ = validate.RegisterValidation(tag, func(fl validator.FieldLevel) bool {
// Check each field
return ValidateField(tag, field)
})
}
return validate
}
// ValidateField switched field tag for right validation
func ValidateField(tag, field string) bool {
switch tag {
case "uuid":
// Check for valid UUID
if _, errParseUUID := uuid.Parse(field); errParseUUID != nil {
return false
}
case "email":
// Check for regexp parrtern, length (varchar(255)) and empty string
if !regexp.MustCompile("^.+@.+\\..+$").MatchString(field) || len(field) > 254 || field == "" {
return false
}
case "username":
// Check for length (varchar(13)) and empty string
if len(field) > 13 || field == "" {
return false
}
}
return true
}
// ValidateErrors show validation error for each invalid fields
func ValidateErrors(err error) map[string]string {
errorFields := map[string]string{}
for _, err := range err.(validator.ValidationErrors) {
// Make error message
errorFields[err.Field()] = "field " + err.StructField() + " is not valid"
}
return errorFields
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment