ActivitySpecification.java
package fr.avenirsesr.portfolio.activity.infrastructure.adapter.specification;
import fr.avenirsesr.portfolio.activity.domain.model.enums.EActivityThematic;
import fr.avenirsesr.portfolio.activity.infrastructure.adapter.model.ActivityEntity;
import java.time.Duration;
import java.time.Instant;
import java.util.List;
import org.springframework.data.jpa.domain.Specification;
public class ActivitySpecification {
public static Specification<ActivityEntity> withThematic(EActivityThematic thematic) {
return (root, query, criteriaBuilder) -> criteriaBuilder.equal(root.get("thematic"), thematic);
}
public static Specification<ActivityEntity> latest(Duration duration) {
return (root, query, criteriaBuilder) -> {
Instant threshold = Instant.now().minus(duration);
return criteriaBuilder.greaterThan(root.get("createdAt"), threshold);
};
}
public static Specification<ActivityEntity> exclude(List<ActivityEntity> activities) {
return (root, query, criteriaBuilder) -> {
if (activities == null || activities.isEmpty()) {
return criteriaBuilder.conjunction();
}
return root.in(activities).not();
};
}
}