core/validators/validator.go
2024-05-10 13:17:18 +07:00

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
}