69 lines
1.2 KiB
Go
69 lines
1.2 KiB
Go
package validators
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/go-playground/validator/v10"
|
|
"github.com/gofiber/fiber/v2"
|
|
)
|
|
|
|
type (
|
|
ErrorResponse struct {
|
|
Error bool
|
|
FailedField string
|
|
Tag string
|
|
}
|
|
XValidator struct {
|
|
validator *validator.Validate
|
|
}
|
|
)
|
|
|
|
var Validator *XValidator
|
|
var validate = validator.New()
|
|
|
|
func RegisterValidators() {
|
|
Validator = &XValidator{
|
|
validator: validate,
|
|
}
|
|
regPassword(Validator)
|
|
}
|
|
|
|
func Validate(c *fiber.Ctx, data interface{}) error {
|
|
if errs := Validator.validateFields(data); len(errs) > 0 && errs[0].Error {
|
|
errMsgs := make([]string, 0)
|
|
|
|
for _, err := range errs {
|
|
errMsgs = append(errMsgs, fmt.Sprintf(
|
|
"field '%s' needs to implement '%s' rule",
|
|
err.FailedField,
|
|
err.Tag,
|
|
))
|
|
}
|
|
|
|
return errors.New(strings.Join(errMsgs, " || "))
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (v XValidator) validateFields(data interface{}) []ErrorResponse {
|
|
validationErrors := []ErrorResponse{}
|
|
|
|
errs := validate.Struct(data)
|
|
if errs != nil {
|
|
for _, err := range errs.(validator.ValidationErrors) {
|
|
elem := ErrorResponse{
|
|
FailedField: err.Field(),
|
|
Tag: err.ActualTag(),
|
|
Error: true,
|
|
}
|
|
|
|
validationErrors = append(validationErrors, elem)
|
|
}
|
|
}
|
|
|
|
return validationErrors
|
|
}
|