2024-01-30 00:02:28 +00:00
|
|
|
package utils
|
|
|
|
|
|
|
|
import (
|
|
|
|
"github.com/go-playground/validator/v10"
|
|
|
|
"regexp"
|
|
|
|
"strings"
|
|
|
|
)
|
|
|
|
|
|
|
|
type OpengistValidator struct {
|
|
|
|
v *validator.Validate
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewValidator() *OpengistValidator {
|
|
|
|
v := validator.New()
|
|
|
|
_ = v.RegisterValidation("notreserved", validateReservedKeywords)
|
|
|
|
_ = v.RegisterValidation("alphanumdash", validateAlphaNumDash)
|
|
|
|
_ = v.RegisterValidation("alphanumdashorempty", validateAlphaNumDashOrEmpty)
|
|
|
|
return &OpengistValidator{v}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cv *OpengistValidator) Validate(i interface{}) error {
|
|
|
|
return cv.v.Struct(i)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (cv *OpengistValidator) Var(field interface{}, tag string) error {
|
|
|
|
return cv.v.Var(field, tag)
|
|
|
|
}
|
|
|
|
|
|
|
|
func ValidationMessages(err *error) string {
|
|
|
|
errs := (*err).(validator.ValidationErrors)
|
|
|
|
messages := make([]string, len(errs))
|
|
|
|
for i, e := range errs {
|
|
|
|
switch e.Tag() {
|
|
|
|
case "max":
|
|
|
|
messages[i] = e.Field() + " is too long"
|
|
|
|
case "required":
|
|
|
|
messages[i] = e.Field() + " should not be empty"
|
|
|
|
case "excludes":
|
|
|
|
messages[i] = e.Field() + " should not include a sub directory"
|
|
|
|
case "alphanum":
|
|
|
|
messages[i] = e.Field() + " should only contain alphanumeric characters"
|
|
|
|
case "alphanumdash":
|
|
|
|
case "alphanumdashorempty":
|
|
|
|
messages[i] = e.Field() + " should only contain alphanumeric characters and dashes"
|
|
|
|
case "min":
|
|
|
|
messages[i] = "Not enough " + e.Field()
|
|
|
|
case "notreserved":
|
|
|
|
messages[i] = "Invalid " + e.Field()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return strings.Join(messages, " ; ")
|
|
|
|
}
|
|
|
|
|
|
|
|
func validateReservedKeywords(fl validator.FieldLevel) bool {
|
|
|
|
name := fl.Field().String()
|
|
|
|
|
|
|
|
restrictedNames := map[string]struct{}{}
|
2024-02-24 17:09:23 +00:00
|
|
|
for _, restrictedName := range []string{"assets", "register", "login", "logout", "settings", "admin-panel", "all", "search", "init", "healthcheck", "preview"} {
|
2024-01-30 00:02:28 +00:00
|
|
|
restrictedNames[restrictedName] = struct{}{}
|
|
|
|
}
|
|
|
|
|
|
|
|
// if the name is not in the restricted names, it is valid
|
|
|
|
_, ok := restrictedNames[name]
|
|
|
|
return !ok
|
|
|
|
}
|
|
|
|
|
|
|
|
func validateAlphaNumDash(fl validator.FieldLevel) bool {
|
|
|
|
return regexp.MustCompile(`^[a-zA-Z0-9-]+$`).MatchString(fl.Field().String())
|
|
|
|
}
|
|
|
|
|
|
|
|
func validateAlphaNumDashOrEmpty(fl validator.FieldLevel) bool {
|
|
|
|
return regexp.MustCompile(`^$|^[a-zA-Z0-9-]+$`).MatchString(fl.Field().String())
|
|
|
|
}
|