DonationRequestValidator.java

package org.petify.funding.dto;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

public class DonationRequestValidator implements ConstraintValidator<DonationRequestValid, DonationRequest> {
    @Override
    public boolean isValid(DonationRequest dto, ConstraintValidatorContext ctx) {
        if (dto.getDonationType() == null) {
            return true;
        }

        boolean valid = true;
        ctx.disableDefaultConstraintViolation();

        switch (dto.getDonationType()) {
            case MONEY -> {
                if (dto.getAmount() == null) {
                    valid = false;
                    ctx.buildConstraintViolationWithTemplate("Amount is required for monetary donations")
                            .addPropertyNode("amount").addConstraintViolation();
                }
            }
            case MATERIAL -> {
                if (dto.getItemName() == null || dto.getItemName().trim().isEmpty()) {
                    valid = false;
                    ctx.buildConstraintViolationWithTemplate("Item name is required for material donations")
                            .addPropertyNode("itemName").addConstraintViolation();
                }
                if (dto.getUnitPrice() == null) {
                    valid = false;
                    ctx.buildConstraintViolationWithTemplate("Unit price is required for material donations")
                            .addPropertyNode("unitPrice").addConstraintViolation();
                }
                if (dto.getQuantity() == null || dto.getQuantity() < 1) {
                    valid = false;
                    ctx.buildConstraintViolationWithTemplate("Quantity must be at least 1 for material donations")
                            .addPropertyNode("quantity").addConstraintViolation();
                }
            }

            default -> {
            }
        }

        return valid;
    }
}