Class GenericPaginationService<T,ID>

java.lang.Object
com.aceelv.utilsmongodb.pagination.GenericPaginationService<T,ID>
Type Parameters:
T - Tipo de entidad de dominio (ej: User, Product, Order)
ID - Tipo del identificador de la entidad (típicamente String para MongoDB)

public class GenericPaginationService<T,ID> extends Object
Servicio genérico para operaciones de paginación, filtrado y búsqueda en MongoDB.

Esta clase proporciona funcionalidad completa para realizar consultas paginadas con filtros complejos, búsqueda de texto, ordenamiento y validaciones automáticas.

Características Principales:

  • Paginación eficiente con conteo total de documentos
  • Filtros por campos específicos (ID, estados, etc.)
  • Búsqueda de texto case-insensitive con regex
  • Filtros de fecha con operadores de comparación
  • Filtros de rango de fechas
  • Ordenamiento múltiple por cualquier campo
  • Validaciones automáticas de entrada
  • Soporte para campos anidados con notación punto

Ejemplo de Configuración:


 @Configuration
 public class PaginationConfig {

     @Bean
     public GenericPaginationService<User, String> userPaginationService(
             UserRepository userRepository,
             MongoTemplate mongoTemplate) {
         return new GenericPaginationService<>(userRepository, mongoTemplate, User.class);
     }
 }
 

Ejemplo de Uso Básico:


 @Service
 public class UserService {

     private final GenericPaginationService<User, String> paginationService;

     public Page<User> searchUsers(String searchTerm, int page, int size) {
         FilteredRequest request = new FilteredRequest();
         request.setPage(page);
         request.setPageSize(size);
         request.setSearchString(searchTerm);
         request.setSearchFields(Arrays.asList(
             new FilteredRequest.SearchField("name", null),
             new FilteredRequest.SearchField("email", null)
         ));

         return paginationService.getFilteredPage(request);
     }
 }
 

Ejemplo de Uso Avanzado:


 // Búsqueda con múltiples filtros y ordenamiento
 FilteredRequest request = new FilteredRequest();
 request.setPage(1);
 request.setPageSize(20);

 // Buscar "admin" en nombre y email
 request.setSearchString("admin");
 request.setSearchFields(Arrays.asList(
     new FilteredRequest.SearchField("name", null),
     new FilteredRequest.SearchField("email", null)
 ));

 // Filtrar solo usuarios activos
 request.setUuids(Arrays.asList(
     new FilteredRequest.FieldFilter("status", "ACTIVE")
 ));

 // Usuarios creados en los últimos 30 días
 request.setDateFilters(Optional.of(Arrays.asList(
     new FilteredRequest.DateFilter("createdAt", "2024-05-29", 1)
 )));

 // Ordenar por fecha de creación (más recientes primero)
 request.setSortOrders(Arrays.asList(
     new FilteredRequest.SortOrder("createdAt", -1)
 ));

 Page<User> results = paginationService.getFilteredPage(request);
 
Since:
1.0
See Also:
  • Constructor Summary

    Constructors
    Constructor
    Description
    GenericPaginationService(org.springframework.data.mongodb.repository.MongoRepository<T,ID> repository, org.springframework.data.mongodb.core.MongoTemplate mongoTemplate, Class<T> entityClass)
    Constructor para crear una instancia del servicio de paginación.
  • Method Summary

    Modifier and Type
    Method
    Description
    org.springframework.data.domain.Page<T>
    Ejecuta una consulta paginada con filtros, búsqueda y ordenamiento.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • GenericPaginationService

      public GenericPaginationService(org.springframework.data.mongodb.repository.MongoRepository<T,ID> repository, org.springframework.data.mongodb.core.MongoTemplate mongoTemplate, Class<T> entityClass)
      Constructor para crear una instancia del servicio de paginación.
      Parameters:
      repository - Repositorio MongoDB para la entidad específica
      mongoTemplate - Template de MongoDB para consultas personalizadas
      entityClass - Clase de la entidad para operaciones de tipo
      Throws:
      IllegalArgumentException - si algún parámetro es null
  • Method Details

    • getFilteredPage

      public org.springframework.data.domain.Page<T> getFilteredPage(FilteredRequest request)
      Ejecuta una consulta paginada con filtros, búsqueda y ordenamiento.

      Este método realiza las siguientes operaciones:

      1. Valida automáticamente la petición de entrada
      2. Construye la consulta MongoDB con todos los filtros especificados
      3. Aplica ordenamiento según los criterios especificados
      4. Ejecuta la consulta paginada
      5. Cuenta el total de documentos para la paginación
      6. Retorna una página con metadatos completos

      Validaciones Automáticas:

      • Límites de página: 1-10,000
      • Límites de tamaño: 1-1,000 elementos
      • Validación de nombres de campos
      • Validación de formatos de fecha
      • Límites de longitud en strings de búsqueda
      Parameters:
      request - Petición con todos los criterios de filtrado y paginación
      Returns:
      Página con los resultados y metadatos de paginación
      Throws:
      ValidationException - si la petición no pasa las validaciones
      RuntimeException - si ocurre un error al construir o ejecutar la consulta MongoDB

      Ejemplo:

      
       FilteredRequest request = new FilteredRequest();
       request.setPage(1);
       request.setPageSize(10);
       request.setSearchString("john");
      
       try {
           Page<User> users = paginationService.getFilteredPage(request);
           System.out.println("Encontrados: " + users.getTotalElements());
           users.getContent().forEach(user -> System.out.println(user.getName()));
       } catch (ValidationException e) {
           System.err.println("Errores de validación: " + e.getValidationErrors());
       }