ActivityDatabaseRepository.java
package fr.avenirsesr.portfolio.activity.infrastructure.adapter.repository;
import fr.avenirsesr.portfolio.activity.domain.model.Activity;
import fr.avenirsesr.portfolio.activity.domain.model.enums.EActivityThematic;
import fr.avenirsesr.portfolio.activity.domain.port.output.repository.ActivityRepository;
import fr.avenirsesr.portfolio.activity.infrastructure.adapter.mapper.ActivityMapper;
import fr.avenirsesr.portfolio.activity.infrastructure.adapter.model.ActivityEntity;
import fr.avenirsesr.portfolio.activity.infrastructure.adapter.specification.ActivitySpecification;
import fr.avenirsesr.portfolio.common.data.domain.model.PageCriteria;
import fr.avenirsesr.portfolio.common.data.domain.model.PagedResult;
import fr.avenirsesr.portfolio.common.data.infrastructure.adapter.repository.GenericJpaRepositoryAdapter;
import java.time.Duration;
import java.util.List;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Repository;
@Repository
public class ActivityDatabaseRepository
extends GenericJpaRepositoryAdapter<Activity, ActivityEntity> implements ActivityRepository {
protected ActivityDatabaseRepository(ActivityJpaRepository jpaRepository) {
super(jpaRepository, jpaRepository, ActivityEntity.class, ActivityMapper.INSTANCE);
}
@Override
public PagedResult<Activity> findAll(EActivityThematic thematic, PageCriteria pageCriteria) {
var specification = thematic != null ? ActivitySpecification.withThematic(thematic) : null;
var sort = Sort.by(Sort.Direction.DESC, "createdAt");
return findAll(
specification, PageRequest.of(pageCriteria.page(), pageCriteria.pageSize(), sort));
}
@Override
public PagedResult<Activity> findLatest(
Duration durationForLate, List<Activity> activityToExclude, PageCriteria pageCriteria) {
var sort = Sort.by(Sort.Direction.DESC, "createdAt");
var specification =
ActivitySpecification.latest(durationForLate)
.and(
ActivitySpecification.exclude(
activityToExclude.stream().map(ActivityMapper.INSTANCE::fromDomain).toList()));
return findAll(
specification, PageRequest.of(pageCriteria.page(), pageCriteria.pageSize(), sort));
}
}