TariffV2RepositoryAdapter.java

package com.github.jenkaby.bikerental.tariff.infrastructure.persistence.adapter;

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.exception.ResourceNotFoundException;
import com.github.jenkaby.bikerental.shared.mapper.PageMapper;
import com.github.jenkaby.bikerental.tariff.domain.model.TariffV2;
import com.github.jenkaby.bikerental.tariff.domain.repository.TariffV2Repository;
import com.github.jenkaby.bikerental.tariff.infrastructure.persistence.entity.TariffV2JpaEntity;
import com.github.jenkaby.bikerental.tariff.infrastructure.persistence.mapper.TariffV2JpaMapper;
import com.github.jenkaby.bikerental.tariff.infrastructure.persistence.repository.TariffV2JpaRepository;
import org.springframework.stereotype.Repository;

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

@Repository
class TariffV2RepositoryAdapter implements TariffV2Repository {

    private final TariffV2JpaRepository jpaRepository;
    private final TariffV2JpaMapper mapper;
    private final PageMapper pageMapper;

    TariffV2RepositoryAdapter(TariffV2JpaRepository jpaRepository, TariffV2JpaMapper mapper, PageMapper pageMapper) {
        this.jpaRepository = jpaRepository;
        this.mapper = mapper;
        this.pageMapper = pageMapper;
    }

    @Override
    public TariffV2 save(TariffV2 tariff) {
        TariffV2JpaEntity entity = mapper.toEntity(tariff);
        TariffV2JpaEntity saved = jpaRepository.save(entity);
        return mapper.toDomain(saved);
    }

    @Override
    public Optional<TariffV2> findById(Long id) {
        return jpaRepository.findById(id).map(mapper::toDomain);
    }

    @Override
    public Page<TariffV2> findAll(PageRequest pageRequest) {
        var pageable = pageMapper.toSpring(pageRequest);
        var page = jpaRepository.findAll(pageable);
        return pageMapper.toDomain(page).map(mapper::toDomain);
    }

    @Override
    public List<TariffV2> findActiveForEquipmentType(String equipmentTypeSlug) {
        return jpaRepository.findActiveByEquipmentType(equipmentTypeSlug).stream()
                .map(mapper::toDomain)
                .toList();
    }

    @Override
    public List<TariffV2> findActiveByEquipmentTypeAndValidOn(String equipmentTypeSlug, LocalDate date) {
        return jpaRepository.findActiveByEquipmentTypeAndValidOn(equipmentTypeSlug, date).stream()
                .map(mapper::toDomain)
                .toList();
    }

    @Override
    public TariffV2 get(Long id) {
        return jpaRepository.findById(id)
                .map(mapper::toDomain)
                .orElseThrow(() -> new ResourceNotFoundException(TariffV2.class, id.toString()));
    }
}