GenderValidator.java

package cl.tica.portfolio.recipeapi.auth.validations;

import cl.tica.portfolio.recipeapi.auth.enums.GenderType;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

import java.util.Arrays;
import java.util.stream.Collectors;

public class GenderValidator implements ConstraintValidator<ValidGender, String> {

    private String genderTypes;

    private static final String INVALID_GENDER_TYPE_MESSAGE =
            "The value provided for GenderType is invalid. Valid values are: [%s]";

    @Override
    public void initialize(ValidGender constraintAnnotation) {
        // Get all gender types at initialization time
        genderTypes = Arrays.stream(GenderType.values())
                .map(Enum::name)
                .collect(Collectors.joining(", "));
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        }

        boolean isValid = Arrays.stream(GenderType.values())
                .anyMatch(genderType -> genderType.name().equalsIgnoreCase(value));

        if (!isValid) {
            context.disableDefaultConstraintViolation();
            context.buildConstraintViolationWithTemplate(String.format(INVALID_GENDER_TYPE_MESSAGE, genderTypes))
                    .addConstraintViolation();
        }

        return isValid;
    }
}