ReservationFileRepository.java

package io.extact.rms.application.persistence.file;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.List;

import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;

import io.extact.rms.application.domain.Reservation;
import io.extact.rms.application.persistence.GenericRepository.ApiType;
import io.extact.rms.application.persistence.ReservationRepository;
import io.extact.rms.application.persistence.file.converter.EntityArrayConverter;
import io.extact.rms.application.persistence.file.io.FileAccessor;
import io.extact.rms.platform.extension.EnabledIfRuntimeConfig;

@ApplicationScoped
@EnabledIfRuntimeConfig(propertyName = ApiType.PROP_NAME, value = ApiType.FILE)
public class ReservationFileRepository extends AbstractFileRepository<Reservation> implements ReservationRepository {

    @Inject
    public ReservationFileRepository(FileAccessor fileAccessor, EntityArrayConverter<Reservation> converter) {
        super(fileAccessor, converter);
    }

    @Override
    public List<Reservation> findByRentalItemAndStartDate(int rentalItemId, LocalDate startDate) {
        return this.load().stream()
                .map(this.getConverter()::toEntity)
                .filter(reservation -> reservation.getStartDateTime().toLocalDate().equals(startDate))
                .filter(reservation -> reservation.getRentalItemId() == rentalItemId)
                .toList();
    }

    @Override
    public List<Reservation> findByReserverId(int reserverId) {
        return this.load().stream()
                .map(this.getConverter()::toEntity)
                .filter(reservation -> reservation.getUserAccountId() == reserverId)
                .toList();
    }

    @Override
    public List<Reservation> findByRentalItemId(int rentalItemId) {
        return this.load().stream()
                .map(this.getConverter()::toEntity)
                .filter(reservation -> reservation.getRentalItemId() == rentalItemId)
                .toList();
    }

    //@Override
    public List<Reservation> findOverlappedReservations(int rentalItemId, LocalDateTime startDateTime, LocalDateTime endDateTime) {
        var conditionOfPeriod = new Reservation.DateTimePeriod(startDateTime, endDateTime);
        return this.load().stream()
                .map(this.getConverter()::toEntity)
                .filter(reservation -> reservation.getRentalItemId() == rentalItemId)
                .filter(reservation -> reservation.getReservePeriod().isOverlappedBy(conditionOfPeriod))
                .toList();
    }

    @Override
    public Reservation findOverlappedReservation(int rentalItemId, LocalDateTime startDateTime, LocalDateTime endDateTime) {
        return this.findOverlappedReservations(rentalItemId, startDateTime, endDateTime).stream()
                .findFirst()
                .orElse(null);
    }

    @Override
    public List<Reservation> findOverlappedReservations(LocalDateTime from, LocalDateTime to) {
        var conditionOfPeriod = new Reservation.DateTimePeriod(from, to);
        return this.load().stream()
                .map(this.getConverter()::toEntity)
                .filter(reservation -> reservation.getReservePeriod().isOverlappedBy(conditionOfPeriod))
                .toList();
    }
}