QuoteServiceImpl.java

package cl.prgm.portaltrip.application.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import cl.prgm.portaltrip.domain.exception.ResourceNotFoundException;
import cl.prgm.portaltrip.domain.model.Location;
import cl.prgm.portaltrip.domain.model.Quote;
import cl.prgm.portaltrip.domain.service.QuoteCalculator;
import cl.prgm.portaltrip.infrastructure.persistence.LocationEntity;
import cl.prgm.portaltrip.infrastructure.persistence.repository.LocationJpaRepository;

@Service
public class QuoteServiceImpl implements QuoteService {

	private final LocationJpaRepository locationJpaRepository;
	private final QuoteCalculator quoteCalculator = new QuoteCalculator();

	public QuoteServiceImpl(LocationJpaRepository locationJpaRepository) {
		this.locationJpaRepository = locationJpaRepository;
	}

	@Override
	@Transactional(readOnly = true)
	public Quote quote(QuoteQuery query) {
		Location destination = locationJpaRepository.findDetailedById(query.destinationId())
				.map(LocationEntity::toDomain)
				.orElseThrow(() -> new ResourceNotFoundException("Location", query.destinationId()));
		boolean insurance = quoteCalculator.requiresInsurance(destination.dimension()) || query.insurance();
		return quoteCalculator.calculate(
				query.passengers(),
				query.tripType(),
				insurance,
				destination.type(),
				destination.dimension(),
				destination.residentIds().size());
	}

}