Class GenericFilterController<T,D,C,U>

java.lang.Object
com.aceelv.utilsmongodb.pagination.GenericFilterController<T,D,C,U>
Type Parameters:
T - Tipo de entidad de dominio (ej: User, Product, Order)
D - Tipo de DTO de respuesta (ej: UserResponseDto, ProductDto)
C - Tipo de DTO de creación (ej: UserCreateDto, CreateProductRequest)
U - Tipo de DTO de actualización (ej: UserUpdateDto, UpdateProductRequest)

public abstract class GenericFilterController<T,D,C,U> extends Object
Controlador genérico base para operaciones de filtrado y paginación con MongoDB.

Esta clase abstracta proporciona un endpoint REST estándar para operaciones de filtrado y paginación. Maneja automáticamente la validación, transformación de DTOs, y formateo de respuestas usando ResultResponse.

Características Principales:

  • Endpoint POST /filter para consultas complejas
  • Manejo automático de errores con códigos HTTP apropiados
  • Transformación automática de entidades a DTOs de respuesta
  • Respuestas estandarizadas con ResultResponse
  • Validación automática de parámetros de entrada
  • Manejo de excepciones con mensajes informativos

Ejemplo de Implementación:


 @RestController
 @RequestMapping("/api/users")
 public class UserController extends GenericFilterController<User, UserResponseDto, UserCreateDto, UserUpdateDto> {

     public UserController(
             GenericPaginationService<User, String> paginationService,
             UserMapper userMapper) {
         super(paginationService, userMapper);
     }

     // El endpoint /filter ya está implementado automáticamente
     // Puedes agregar endpoints adicionales específicos para usuarios

     @GetMapping("/{id}")
     public ResponseEntity<ResultResponse<UserResponseDto, String>> getUser(@PathVariable String id) {
         // Implementación específica
         return ResponseEntity.ok(ResultResponse.success(userMapper.toResponse(user)));
     }
 }
 

Configuración del Bean:


 @Configuration
 public class UserConfig {

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

Ejemplo de Petición HTTP:


 POST /api/users/filter
 Content-Type: application/json

 {
   "page": 1,
   "pageSize": 10,
   "searchString": "john",
   "searchFields": [
     {"fieldName": "name", "value": null},
     {"fieldName": "email", "value": null}
   ],
   "uuids": [
     {"fieldName": "status", "value": "ACTIVE"}
   ],
   "sortOrders": [
     {"fieldName": "createdAt", "direction": -1}
   ]
 }
 

Ejemplo de Respuesta Exitosa:


 {
   "result": {
     "content": [
       {
         "id": "507f1f77bcf86cd799439011",
         "name": "John Doe",
         "email": "john@example.com",
         "status": "ACTIVE",
         "createdAt": "2024-01-15T10:30:00"
       }
     ],
     "totalElements": 150,
     "totalPages": 15,
     "size": 10,
     "number": 0,
     "numberOfElements": 10,
     "first": true,
     "last": false
   },
   "isSuccess": true,
   "errors": null,
   "message": "Se encontraron 10 resultados de 150 totales",
   "messageCode": "PAGINATION_SUCCESS",
   "timestamp": "2025-06-28T15:30:45.123",
   "code": 200
 }
 

Ejemplo de Respuesta de Error:


 {
   "result": null,
   "isSuccess": false,
   "errors": [
     "El tamaño de página debe ser al menos 1",
     "String de búsqueda demasiado largo (máximo 200 caracteres)"
   ],
   "message": "validation error",
   "messageCode": "VALIDATION_ERROR",
   "timestamp": "2025-06-28T15:30:45.123",
   "code": 400
 }
 
Since:
1.0
See Also:
  • Field Details

    • paginationService

      protected final GenericPaginationService<T,String> paginationService
      Servicio de paginación que maneja todas las operaciones de consulta.
    • mapper

      protected final EntityDtoMapper<T,D,C,U> mapper
      Mapper para convertir entre entidades y DTOs.
  • Constructor Details

    • GenericFilterController

      protected GenericFilterController(GenericPaginationService<T,String> paginationService, EntityDtoMapper<T,D,C,U> mapper)
      Constructor que inicializa el controlador con sus dependencias.
      Parameters:
      paginationService - Servicio que maneja las operaciones de paginación y filtrado
      mapper - Mapper para convertir entre entidades y DTOs
      Throws:
      IllegalArgumentException - si algún parámetro es null
  • Method Details

    • filter

      @PostMapping("/filter") public org.springframework.http.ResponseEntity<ResultResponse<org.springframework.data.domain.Page<D>,String>> filter(@RequestBody FilteredRequest request)
      Endpoint para realizar consultas con filtros, búsqueda y paginación.

      Este endpoint acepta una petición con todos los criterios de filtrado y retorna una página de resultados transformados a DTOs de respuesta.

      Procesamiento de la Petición:

      1. Valida automáticamente todos los parámetros de entrada
      2. Ejecuta la consulta con filtros y paginación
      3. Transforma las entidades a DTOs de respuesta
      4. Formatea la respuesta con metadatos adicionales
      5. Maneja errores y excepciones apropiadamente

      Códigos de Respuesta HTTP:

      • 200 OK: Consulta ejecutada exitosamente
      • 400 Bad Request: Errores de validación en los parámetros
      • 500 Internal Server Error: Errores internos del servidor
      Parameters:
      request - Petición con criterios de filtrado, búsqueda y paginación
      Returns:
      Respuesta con página de resultados o información de error

      Nota: Este endpoint utiliza POST en lugar de GET para permitir peticiones complejas con múltiples filtros que excedan los límites de longitud de URL en peticiones GET.

    • getMapper

      protected EntityDtoMapper<T,D,C,U> getMapper()
      Método auxiliar protegido para obtener el mapper.

      Permite a las clases hijas acceder al mapper para operaciones adicionales de transformación de datos.

      Returns:
      El mapper configurado para este controlador