AuditLogSpecification.java
package com.edtech.repository;
import com.edtech.model.AuditLog;
import jakarta.persistence.criteria.Predicate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import org.springframework.data.jpa.domain.Specification;
/** Documentação para AuditLogSpecification. */
public class AuditLogSpecification {
/** Documentação. */
public static Specification<AuditLog> getFilter(
String search, String action, LocalDateTime startDate, LocalDateTime endDate) {
return (root, query, criteriaBuilder) -> {
List<Predicate> predicates = new ArrayList<>();
if (search != null && !search.isEmpty()) {
String likePattern = "%" + search.toLowerCase() + "%";
Predicate p1 =
criteriaBuilder.like(criteriaBuilder.lower(root.get("details")), likePattern);
Predicate p2 =
criteriaBuilder.like(criteriaBuilder.lower(root.get("ipAddress")), likePattern);
// Note: we can't easily join on User to filter by user name in this simple spec if it's not
// mapped,
// but AuditLog has userId. We will ignore userName search in DB for simplicity,
// or just search in details/IP/action.
predicates.add(criteriaBuilder.or(p1, p2));
}
if (action != null && !action.isEmpty() && !action.equals("Todas as Ações")) {
// action is an Enum
try {
com.edtech.model.AuditAction enumAction = com.edtech.model.AuditAction.valueOf(action);
predicates.add(criteriaBuilder.equal(root.get("action"), enumAction));
} catch (IllegalArgumentException ignored) {
// ignored
}
}
if (startDate != null) {
predicates.add(criteriaBuilder.greaterThanOrEqualTo(root.get("createdAt"), startDate));
}
if (endDate != null) {
predicates.add(criteriaBuilder.lessThanOrEqualTo(root.get("createdAt"), endDate));
}
return criteriaBuilder.and(predicates.toArray(new Predicate[0]));
};
}
}