EquipmentRepositoryAdapter.java

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

import com.github.jenkaby.bikerental.equipment.domain.model.Equipment;
import com.github.jenkaby.bikerental.equipment.domain.repository.EquipmentRepository;
import com.github.jenkaby.bikerental.equipment.infrastructure.persistence.entity.EquipmentJpaEntity;
import com.github.jenkaby.bikerental.equipment.infrastructure.persistence.mapper.EquipmentJpaMapper;
import com.github.jenkaby.bikerental.equipment.infrastructure.persistence.repository.EquipmentJpaRepository;
import com.github.jenkaby.bikerental.equipment.shared.domain.model.vo.SerialNumber;
import com.github.jenkaby.bikerental.equipment.shared.domain.model.vo.Uid;
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 org.springframework.util.CollectionUtils;

import java.util.Collection;
import java.util.List;
import java.util.Optional;

@Repository
class EquipmentRepositoryAdapter implements EquipmentRepository {

    private final EquipmentJpaRepository jpaRepository;
    private final EquipmentJpaMapper mapper;
    private final PageMapper pageMapper;

    EquipmentRepositoryAdapter(
            EquipmentJpaRepository jpaRepository,
            EquipmentJpaMapper mapper, PageMapper pageMapper) {
        this.jpaRepository = jpaRepository;
        this.mapper = mapper;
        this.pageMapper = pageMapper;
    }

    @Override
    @Transactional
    public Equipment save(Equipment equipment) {
        var jpaEntity = mapper.toEntity(equipment);
        var savedEntity = jpaRepository.save(jpaEntity);
        return mapper.toDomain(savedEntity);
    }

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

    @Override
    public List<Equipment> findByIds(Collection<Long> ids) {
        if (CollectionUtils.isEmpty(ids)) {
            return List.of();
        }
        return jpaRepository.findAllByIdIn(ids).stream()
                .map(mapper::toDomain)
                .toList();
    }

    @Override
    public Page<Equipment> findAll(String statusSlug, String typeSlug, PageRequest request) {
        var pageRequest = pageMapper.toSpring(request);

        org.springframework.data.domain.Page<EquipmentJpaEntity> page = jpaRepository.findAllByFilters(statusSlug, typeSlug, pageRequest);
        return pageMapper.toDomain(page)
                .map(mapper::toDomain);
    }

    @Override
    public boolean existsBySerialNumber(SerialNumber serialNumber) {
        return jpaRepository.existsBySerialNumber(serialNumber.value());
    }

    @Override
    public boolean existsByUid(Uid uid) {
        return jpaRepository.existsByUid(uid.value());
    }

    @Override
    public Optional<Equipment> findBySerialNumber(SerialNumber serialNumber) {
        return jpaRepository.findBySerialNumber(serialNumber.value()).map(mapper::toDomain);
    }

    @Override
    public Optional<Equipment> findByUid(Uid uid) {
        return jpaRepository.findByUid(uid.value()).map(mapper::toDomain);
    }
}