RentalReservationClientLocalApi.java

package io.extact.rms.client.api.adaptor.local;

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

import jakarta.inject.Inject;

import io.extact.rms.application.RentalReservationApplication;
import io.extact.rms.application.common.LoginUserUtils;
import io.extact.rms.client.api.RentalReservationClientApi;
import io.extact.rms.client.api.adaptor.local.BindLoginUser.LoginAction;
import io.extact.rms.client.api.adaptor.local.dto.RentalItemDtoConverter;
import io.extact.rms.client.api.adaptor.local.dto.ReservationDtoConverter;
import io.extact.rms.client.api.adaptor.local.dto.UserAccountDtoConverter;
import io.extact.rms.client.api.dto.RentalItemClientDto;
import io.extact.rms.client.api.dto.ReservationClientDto;
import io.extact.rms.client.api.dto.UserAccountClientDto;
import io.extact.rms.client.api.exception.BusinessFlowClientException;
import io.extact.rms.platform.extension.ConfiguableScoped;

@ConfiguableScoped
@HandleExceptions
@BindLoginUser
public class RentalReservationClientLocalApi implements RentalReservationClientApi {

    @Inject
    private RentalReservationApplication application;

    @LoginAction
    @Override
    public UserAccountClientDto authenticate(String loginId, String password)
            throws BusinessFlowClientException {
        return application.authenticate(loginId, password).transform(UserAccountDtoConverter::toDto);
    }

    @Override
    public List<ReservationClientDto> findReservationByRentalItemAndStartDate(Integer itemId, LocalDate startDate)
            throws BusinessFlowClientException {
        return application.findReservationByRentalItemAndStartDate(itemId, startDate).stream()
                    .map(ReservationDtoConverter::toDto)
                    .toList();
    }

    @Override
    public List<ReservationClientDto> findReservationByReserverId(int reserverId) {
        return application.findReservationByReserverId(reserverId).stream()
                    .map(ReservationDtoConverter::toDto)
                    .toList();
    }

    @Override
    public List<ReservationClientDto> getOwnReservations() {
        return findReservationByReserverId(LoginUserUtils.get().getUserId());
    }

    @Override
    public List<RentalItemClientDto> getAllRentalItems() {
        return application.getAllRentalItems().stream()
                    .map(RentalItemDtoConverter::toDto)
                    .toList();
    }

    @Override
    public List<UserAccountClientDto> getAllUserAccounts() {
        return application.getAllUserAccounts().stream()
                    .map(UserAccountDtoConverter::toDto)
                    .toList();
    }

    @Override
    public ReservationClientDto addReservation(ReservationClientDto addReservationDto) throws BusinessFlowClientException {
        var newReservation = application.addReservation(addReservationDto.to(ReservationDtoConverter::toEntity));
        return newReservation.transform(ReservationDtoConverter::toDto);
    }

    @Override
    public RentalItemClientDto addRentalItem(RentalItemClientDto addRentalItemDto) throws BusinessFlowClientException {
        var newRentalItem = application.addRentalItem(addRentalItemDto.to(RentalItemDtoConverter::toEntity));
        return newRentalItem.transform(RentalItemDtoConverter::toDto);
    }

    @Override
    public UserAccountClientDto addUserAccount(UserAccountClientDto addUserDto) throws BusinessFlowClientException {
        var newUserAccount = application.addUserAccount(addUserDto.to(UserAccountDtoConverter::toEntity));
        return newUserAccount.transform(UserAccountDtoConverter::toDto);
    }

    @Override
    public void cancelReservation(int reservationId) throws BusinessFlowClientException {
        application.cancelReservation(reservationId);
    }

    @Override
    public UserAccountClientDto updateUserAccount(UserAccountClientDto updateUserAccountDto) {
        var updatedUser = application.updateUserAccount(updateUserAccountDto.to(UserAccountDtoConverter::toEntity));
        return updatedUser.transform(UserAccountDtoConverter::toDto);
    }
}