AdditionalSkillProgressDatabaseRepository.java

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

import fr.avenirsesr.portfolio.additionalskill.domain.model.AdditionalSkillProgress;
import fr.avenirsesr.portfolio.additionalskill.domain.port.output.repository.AdditionalSkillProgressRepository;
import fr.avenirsesr.portfolio.additionalskill.infrastructure.adapter.mapper.AdditionalSkillProgressMapper;
import fr.avenirsesr.portfolio.additionalskill.infrastructure.adapter.model.AdditionalSkillProgressEntity;
import fr.avenirsesr.portfolio.additionalskill.infrastructure.adapter.specification.AdditionalSkillProgressSpecification;
import fr.avenirsesr.portfolio.common.data.domain.model.PageCriteria;
import fr.avenirsesr.portfolio.common.data.domain.model.PageInfo;
import fr.avenirsesr.portfolio.common.data.domain.model.PagedResult;
import fr.avenirsesr.portfolio.common.data.infrastructure.adapter.repository.GenericJpaRepositoryAdapter;
import fr.avenirsesr.portfolio.user.domain.model.Student;
import fr.avenirsesr.portfolio.user.infrastructure.adapter.mapper.StudentMapper;
import java.util.List;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Repository;

@Repository
public class AdditionalSkillProgressDatabaseRepository
    extends GenericJpaRepositoryAdapter<AdditionalSkillProgress, AdditionalSkillProgressEntity>
    implements AdditionalSkillProgressRepository {
  private final AdditionalSkillProgressJpaRepository jpaRepository;

  public AdditionalSkillProgressDatabaseRepository(
      AdditionalSkillProgressJpaRepository jpaRepository) {
    super(
        jpaRepository,
        jpaRepository,
        AdditionalSkillProgressMapper::fromDomain,
        AdditionalSkillProgressMapper::toDomain);
    this.jpaRepository = jpaRepository;
  }

  public void saveAllEntities(List<AdditionalSkillProgressEntity> entities) {
    if (entities != null && !entities.isEmpty()) {
      jpaRepository.saveAll(entities);
    }
  }

  @Override
  public boolean additionalSkillProgressAlreadyExists(
      AdditionalSkillProgress additionalSkillProgress) {
    return jpaRepository.exists(
        AdditionalSkillProgressSpecification.additionalSkillProgressAlreadyExists(
            additionalSkillProgress.getSkill(), additionalSkillProgress.getStudent().getId()));
  }

  @Override
  public List<AdditionalSkillProgress> findAllByStudent(Student student) {
    return jpaRepository
        .findAll(AdditionalSkillProgressSpecification.hasStudent(StudentMapper.fromDomain(student)))
        .stream()
        .map(AdditionalSkillProgressMapper::toDomain)
        .toList();
  }

  @Override
  public PagedResult<AdditionalSkillProgress> findAllByStudent(
      Student student, PageCriteria pageCriteria) {
    var specification =
        AdditionalSkillProgressSpecification.hasStudent(StudentMapper.fromDomain(student));
    return findAllByStudent(specification, pageCriteria);
  }

  @Override
  public PagedResult<AdditionalSkillProgress> findAllByStudent(
      Student student, PageCriteria pageCriteria, String keyword) {
    var specification =
        AdditionalSkillProgressSpecification.hasStudent(StudentMapper.fromDomain(student))
            .and(AdditionalSkillProgressSpecification.search(keyword));
    return findAllByStudent(specification, pageCriteria);
  }

  private PagedResult<AdditionalSkillProgress> findAllByStudent(
      Specification<AdditionalSkillProgressEntity> specification, PageCriteria pageCriteria) {

    Page<AdditionalSkillProgressEntity> entities =
        jpaRepository.findAll(
            specification, PageRequest.of(pageCriteria.page(), pageCriteria.pageSize()));

    List<AdditionalSkillProgress> progresses =
        entities.stream().map(AdditionalSkillProgressMapper::toDomain).toList();
    return new PagedResult<>(
        progresses,
        new PageInfo(pageCriteria.page(), pageCriteria.pageSize(), entities.getTotalElements()));
  }
}