veza/veza-backend-api/internal/errors/validation.go
2025-12-03 20:29:37 +01:00

63 lines
2 KiB
Go

package errors
import (
"github.com/go-playground/validator/v10"
)
// FromValidatorError convertit une erreur de validation en AppError
func FromValidatorError(err error) *AppError {
if validationErrors, ok := err.(validator.ValidationErrors); ok {
details := make([]ErrorDetail, 0, len(validationErrors))
for _, fieldError := range validationErrors {
details = append(details, ErrorDetail{
Field: fieldError.Field(),
Message: getValidationMessage(fieldError),
})
}
return &AppError{
Code: ErrCodeValidation,
Message: "Validation failed",
Details: details,
}
}
return New(ErrCodeValidation, err.Error())
}
// getValidationMessage génère un message d'erreur lisible à partir d'une FieldError
func getValidationMessage(fieldError validator.FieldError) string {
switch fieldError.Tag() {
case "required":
return fieldError.Field() + " is required"
case "email":
return fieldError.Field() + " must be a valid email"
case "min":
return fieldError.Field() + " must be at least " + fieldError.Param()
case "max":
return fieldError.Field() + " must be at most " + fieldError.Param()
case "len":
return fieldError.Field() + " must be exactly " + fieldError.Param() + " characters"
case "gte":
return fieldError.Field() + " must be greater than or equal to " + fieldError.Param()
case "lte":
return fieldError.Field() + " must be less than or equal to " + fieldError.Param()
case "gt":
return fieldError.Field() + " must be greater than " + fieldError.Param()
case "lt":
return fieldError.Field() + " must be less than " + fieldError.Param()
case "url":
return fieldError.Field() + " must be a valid URL"
case "alphanum":
return fieldError.Field() + " must contain only alphanumeric characters"
case "alpha":
return fieldError.Field() + " must contain only alphabetic characters"
case "numeric":
return fieldError.Field() + " must be numeric"
case "oneof":
return fieldError.Field() + " must be one of: " + fieldError.Param()
default:
return fieldError.Field() + " is invalid"
}
}