Yimaru-BackEnd/internal/web_server/validator/validatord.go
2025-03-29 06:25:19 +03:00

66 lines
1.4 KiB
Go

package customvalidator
import (
"strings"
"github.com/go-playground/validator/v10"
"github.com/gofiber/fiber/v2"
)
type CustomValidator struct {
validate *validator.Validate
}
func NewCustomValidator(validate *validator.Validate) *CustomValidator {
return &CustomValidator{
validate: validate,
}
}
func (v *CustomValidator) Validate(c *fiber.Ctx, input interface{}) (map[string]string, bool) {
err := v.validate.Struct(input)
if err != nil {
if validationErrors, ok := err.(validator.ValidationErrors); ok {
errors := ValidateModel(validationErrors)
return errors, false
}
}
return nil, true
}
type ValidationErrorResponse struct {
StatusCode int `json:"statusCode"`
Errors interface{} `json:"errors"`
}
func ValidateModel(err validator.ValidationErrors) map[string]string {
errors := make(map[string]string)
for _, err := range err {
errors[strings.ToLower(err.Field())] = errorMsgs(err.Tag(), err.Param())
}
return errors
}
func errorMsgs(tag string, value string) string {
switch tag {
case "required":
return "This field is required"
case "numeric":
return "must be numeric " + value
case "lte":
return "can not be greater than " + value
case "gte":
return "can not be less than " + value
case "len":
return "length should be equal to " + value
case "email":
return "must be a valid email address"
}
return ""
}