BaseRequestedEquipmentValidator.java

package com.github.jenkaby.bikerental.rental.application.service.validator;

import com.github.jenkaby.bikerental.equipment.EquipmentInfo;
import com.github.jenkaby.bikerental.shared.exception.EquipmentNotAvailableException;
import com.github.jenkaby.bikerental.shared.exception.ReferenceNotFoundException;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Component
public class BaseRequestedEquipmentValidator implements RequestedEquipmentValidator {

    @Override
    public void validateAvailability(List<EquipmentInfo> equipments) {
        List<EquipmentInfo> notAvailable = equipments.stream().filter(eq -> !eq.isAvailable()).toList();
        if (!CollectionUtils.isEmpty(notAvailable)) {
            throw new EquipmentNotAvailableException(notAvailable.getFirst().id(), notAvailable.getFirst().statusSlug());
        }
    }

    @Override
    public void validateSize(List<Long> requestedEquipmentIds, List<EquipmentInfo> equipments) {
        if (equipments.size() != requestedEquipmentIds.size()) {
            var foundIds = equipments.stream()
                    .map(EquipmentInfo::id)
                    .collect(Collectors.toCollection(ArrayList::new));
            var missingIds = new ArrayList<>(requestedEquipmentIds);
            missingIds.removeAll(foundIds);
            throw new ReferenceNotFoundException("Equipment", missingIds.toString());
        }
    }
}