|
|
@@ -2,15 +2,19 @@ package com.pharmacopoeia.service;
|
|
|
|
|
|
import com.pharmacopoeia.entity.UserEvent;
|
|
|
import com.pharmacopoeia.repository.UserEventRepository;
|
|
|
+import jakarta.persistence.criteria.Predicate;
|
|
|
import org.slf4j.Logger;
|
|
|
import org.slf4j.LoggerFactory;
|
|
|
import org.springframework.data.domain.PageRequest;
|
|
|
+import org.springframework.data.domain.Sort;
|
|
|
+import org.springframework.data.jpa.domain.Specification;
|
|
|
import org.springframework.scheduling.annotation.Async;
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
|
import java.time.Instant;
|
|
|
import java.time.LocalDate;
|
|
|
import java.time.ZoneOffset;
|
|
|
+import java.util.ArrayList;
|
|
|
import java.util.LinkedHashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
@@ -54,10 +58,22 @@ public class AnalyticsService {
|
|
|
? LocalDate.parse(endDate).plusDays(1).atStartOfDay(ZoneOffset.UTC).toInstant()
|
|
|
: null;
|
|
|
|
|
|
- var pageable = PageRequest.of(page - 1, pageSize);
|
|
|
- var result = repo.findWithFilters(
|
|
|
- eventType != null && !eventType.isBlank() ? eventType : null,
|
|
|
- startTime, endTime, pageable);
|
|
|
+ Specification<UserEvent> spec = (root, query, cb) -> {
|
|
|
+ List<Predicate> predicates = new ArrayList<>();
|
|
|
+ if (eventType != null && !eventType.isBlank()) {
|
|
|
+ predicates.add(cb.equal(root.get("eventType"), eventType));
|
|
|
+ }
|
|
|
+ if (startTime != null) {
|
|
|
+ predicates.add(cb.greaterThanOrEqualTo(root.get("createdAt"), startTime));
|
|
|
+ }
|
|
|
+ if (endTime != null) {
|
|
|
+ predicates.add(cb.lessThan(root.get("createdAt"), endTime));
|
|
|
+ }
|
|
|
+ return cb.and(predicates.toArray(new Predicate[0]));
|
|
|
+ };
|
|
|
+
|
|
|
+ var pageable = PageRequest.of(page - 1, pageSize, Sort.by(Sort.Direction.DESC, "createdAt"));
|
|
|
+ var result = repo.findAll(spec, pageable);
|
|
|
|
|
|
List<Map<String, Object>> items = result.getContent().stream()
|
|
|
.map(e -> {
|