GenericDeletableJpaRepositoryAdapter.java

package fr.avenirsesr.portfolio.shared.infrastructure.adapter.repository;

import fr.avenirsesr.portfolio.shared.domain.model.DeletableAvenirsBaseModel;
import fr.avenirsesr.portfolio.shared.domain.port.output.repository.GenericDeletableRepositoryPort;
import fr.avenirsesr.portfolio.shared.infrastructure.adapter.model.DeletableAvenirsBaseEntity;
import java.util.UUID;
import java.util.function.Function;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;

public abstract class GenericDeletableJpaRepositoryAdapter<
        D extends DeletableAvenirsBaseModel, E extends DeletableAvenirsBaseEntity>
    extends GenericJpaRepositoryAdapter<D, E> implements GenericDeletableRepositoryPort<D> {
  protected final JpaRepository<E, UUID> jpaRepository;
  protected final JpaSpecificationExecutor<E> jpaSpecificationExecutor;
  private final Function<D, E> fromDomain;
  private final Function<E, D> toDomain;

  protected GenericDeletableJpaRepositoryAdapter(
      JpaRepository<E, UUID> jpaRepository,
      JpaSpecificationExecutor<E> jpaSpecificationExecutor,
      Function<D, E> fromDomain,
      Function<E, D> toDomain) {
    super(jpaRepository, jpaSpecificationExecutor, fromDomain, toDomain);
    this.jpaRepository = jpaRepository;
    this.jpaSpecificationExecutor = jpaSpecificationExecutor;
    this.fromDomain = fromDomain;
    this.toDomain = toDomain;
  }

  @Override
  public void delete(D domain) {
    jpaRepository.delete(fromDomain.apply(domain));
  }
}