Skip to content

Multiple validations at one time #1268

@reversersed

Description

@reversersed
  • I have looked at the documentation here first?
  • I have looked at the examples provided that may showcase my question here?

Package version eg. v9, v10:

v10

Issue, Question or Enhancement:

I have several validation tags, but validator works sequently, so I get only one error per field at the time. Is there some way to validate all tags at one time?

Code sample, to showcase or reproduce:

type UserRegisterQuery struct {
	Login    string `json:"login" validate:"required,min=4,max=16" example:"user"`
	Email    string `json:"email" validate:"required,email" example:"[email protected]"`
	Password string `json:"password" validate:"required,min=8,max=32,lowercase,uppercase,digitrequired,specialsymbol" example:"User!1password"`
}

func ValidationError(errors validator.ValidationErrors, dev_message string) *Error {
	var errs []string
	for _, err := range errors {
		switch err.Tag() {
		case "required":
			errs = append(errs, fmt.Sprintf("%s: field is required", err.Field()))
		case "oneof":
			errs = append(errs, fmt.Sprintf("%s: field can only be: %s", err.Field(), err.ActualTag()))
		case "min":
			errs = append(errs, fmt.Sprintf("%s must be at least %s characters length", err.Field(), err.ActualTag()))
		case "max":
			errs = append(errs, fmt.Sprintf("%s can't be more that %s characters length", err.Field(), err.ActualTag()))
		case "email":
			errs = append(errs, fmt.Sprintf("%s must be a valid email", err.Field()))
		case "jwt":
			errs = append(errs, fmt.Sprintf("%s must be a JWT token", err.Field()))
		case "lowercase":
			errs = append(errs, fmt.Sprintf("%s must contain at least one lowercase character", err.Field()))
		case "uppercase":
			errs = append(errs, fmt.Sprintf("%s must contain at least one uppercase character", err.Field()))
		case "digitrequired":
			errs = append(errs, fmt.Sprintf("%s must contain at least one digit", err.Field()))
		case "specialsymbol":
			errs = append(errs, fmt.Sprintf("%s must contain at least one special symbol", err.Field()))
		default:
			errs = append(errs, err.Error())
		}
	}
	return NewError(errs, "IE-0004", dev_message)
}

func Handler() error {
	...
	if err := validator.Struct(query); err != nil {
		return mw.ValidationError(err.(validator.ValidationErrors), "wrong query format")
	}
	...
}

Now I get:

{
  "messages": [
    "Password must contain at least one uppercase character"
  ]
}

But I want it to be:

{
  "messages": [
    "Password must contain at least one uppercase character",
    "Password must contain at least one lowercase character",
    "Password must contain at least one special symbol"
  ]
}

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions