RentalRepositoryAdapter.java
package com.github.jenkaby.bikerental.rental.infrastructure.persistence.adapter;
import com.github.jenkaby.bikerental.rental.domain.model.Rental;
import com.github.jenkaby.bikerental.rental.domain.model.RentalStatus;
import com.github.jenkaby.bikerental.rental.domain.repository.RentalRepository;
import com.github.jenkaby.bikerental.rental.infrastructure.persistence.mapper.RentalJpaMapper;
import com.github.jenkaby.bikerental.rental.infrastructure.persistence.repository.RentalJpaRepository;
import com.github.jenkaby.bikerental.shared.domain.CustomerRef;
import com.github.jenkaby.bikerental.shared.domain.model.vo.Page;
import com.github.jenkaby.bikerental.shared.domain.model.vo.PageRequest;
import com.github.jenkaby.bikerental.shared.mapper.PageMapper;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
@Repository
@Transactional(readOnly = true)
class RentalRepositoryAdapter implements RentalRepository {
private final RentalJpaRepository repository;
private final RentalJpaMapper mapper;
private final PageMapper pageMapper;
RentalRepositoryAdapter(RentalJpaRepository repository, RentalJpaMapper mapper, PageMapper pageMapper) {
this.repository = repository;
this.mapper = mapper;
this.pageMapper = pageMapper;
}
@Override
@Transactional
public Rental save(Rental rental) {
var entity = mapper.toEntity(rental);
var savedEntity = repository.save(entity);
return mapper.toDomain(savedEntity);
}
@Override
public Optional<Rental> findById(Long id) {
return repository.findById(id).map(mapper::toDomain);
}
@Override
public boolean existsById(Long id) {
return repository.existsById(id);
}
@Override
public Page<Rental> findByStatus(RentalStatus status, PageRequest pageRequest) {
var springPageRequest = pageMapper.toSpring(pageRequest);
var page = repository.findByStatus(status, springPageRequest);
return pageMapper.toDomain(page)
.map(mapper::toDomain);
}
@Override
public Page<Rental> findByStatusAndCustomerId(RentalStatus status, UUID customerId, PageRequest pageRequest) {
var springPageRequest = pageMapper.toSpring(pageRequest);
var page = repository.findByStatusAndCustomerId(status, customerId, springPageRequest);
return pageMapper.toDomain(page)
.map(mapper::toDomain);
}
@Override
public Page<Rental> findByCustomerId(UUID customerId, PageRequest pageRequest) {
var springPageRequest = pageMapper.toSpring(pageRequest);
var page = repository.findByCustomerId(customerId, springPageRequest);
return pageMapper.toDomain(page)
.map(mapper::toDomain);
}
@Override
public Page<Rental> findByStatusAndEquipmentUid(RentalStatus status, String equipmentUid, PageRequest pageRequest) {
var springPageRequest = pageMapper.toSpring(pageRequest);
var page = repository.findByStatusAndEquipmentUid(status, equipmentUid, springPageRequest);
return pageMapper.toDomain(page)
.map(mapper::toDomain);
}
@Override
public List<Rental> getCustomerDebtRentals(CustomerRef customerRef) {
return repository
.findAllByCustomerIdAndStatusOrderByCreatedAtAsc(customerRef.id(), RentalStatus.DEBT)
.stream()
.map(mapper::toDomain)
.toList();
}
}