Cuando se construye una API es habitual necesitar manejar parámetros de consulta complejos. Para proyectos reales, paginación, filtrado y ordenación son fundamentales para una API robusta y escalable. En un proyecto reciente con NestJs me enfrenté a este reto y descubrí que no basta con definir DTOs al vuelo: hay que validar y transformar las consultas adecuadamente para evitar entradas maliciosas y comportamientos inesperados.

Primeros pasos con NestJs: crea un proyecto con el CLI usando el comando nest new complex-query-filters y añade las librerías de validación y transformación con npm i class-validator class-transformer. Con esto tienes una API mínima, pero para aceptar consultas anidadas y complejas hay un ajuste importante en el arranque de la aplicación.

Declara la aplicación como tipo NestExpressApplication al crearla con NestFactory y configura el parser de query para que acepte estructuras extendidas. En otras palabras, en main.ts crea la app como una instancia de NestExpressApplication y luego llama a app.set pasando como clave query parser y como valor extended. Esto permite recibir parámetros como dateRange[lte]=2023-10-26T10:00:00.000Z y sort[category]=asc sin que Express los descarte o transforme de forma inesperada.

Validaciones, siempre incluidas. Para evitar inyecciones o propiedades inesperadas debemos definir DTOs que expresen claramente qué campos aceptamos. Un DTO de campos de búsqueda puede incluir propiedades como category y status con decoradores de class-validator para validar tipo, longitud y formato. Un DateRangeDto puede exponer operadores gte y lte validados como fechas, y un FiltersDto puede combinar status, category y dateRange. Para ordenación definimos un SortFieldsDto que solo permita asc o desc para determinadas columnas, por ejemplo category.

En el ejemplo práctico conviene combinar todo en un QueryDto que extienda FiltersDto e incluya además search, page, limit y sort. De este modo la estructura esperada en la query queda documentada y validada desde el servidor, lo que evita aceptar parámetros inesperados como search[magumbos] o dateRange[lt] que no forman parte del contrato.

La pieza que lo hace todo seguro es ValidationPipe. Antes de llamar a app.listen registra un pipe global con useGlobalPipes pasándole una instancia de ValidationPipe configurada con whitelist true, transform true, forbidNonWhitelisted true y transformOptions con enableImplicitConversion true. Con esto el servidor rechazará propiedades que no estén en los DTOs y convertirá tipos implícitamente cuando sea seguro hacerlo. Por ejemplo una petición con dateRange[lt]=today devolverá un Bad Request indicando que el atributo lt no está permitido.

Ejemplo de uso real de la API: una petición como http://localhost:3000/?dateRange[lte]=2023-10-26T10:00:00.000Z&search[status]=so&page=1&limit=10&sort[category]=asc producirá un objeto Query validado con dateRange.lte, search.status, page, limit y sort.category correctamente tipados y validados.

Lecciones y buenas prácticas: no confíes solo en soluciones mágicas. Leer la documentación y entender una librería permite a veces resolver problemas con cambios mínimos, como declarar el tipo de aplicación y ajustar el parser de consultas. Aun así, combinar esa configuración con DTOs claros y ValidationPipe es lo que garantiza seguridad y robustez en producción.

En Q2BSTUDIO aplicamos este tipo de buenas prácticas en nuestros desarrollos. Si necesitas aplicaciones a medida o software a medida que manejen consultas complejas y validación avanzada, nuestro equipo puede diseñar la arquitectura y los DTOs necesarios. También ofrecemos soluciones de inteligencia artificial e IA para empresas que se integran con APIs seguras y escalables.

Servicios y palabras clave que ofrecemos: desarrollo de aplicaciones a medida, software a medida, inteligencia artificial, ciberseguridad, servicios cloud aws y azure, servicios inteligencia de negocio, ia para empresas, agentes IA y power bi. Además de desarrollar backend robusto usamos prácticas de ciberseguridad y pentesting para proteger tus endpoints y evitar inyecciones o fugas de datos.

Si quieres que te ayudemos a diseñar un endpoint con filtrado avanzado, paginación y ordenación seguros o integrar inteligencia de negocio con Power BI y servicios cloud, en Q2BSTUDIO contamos con experiencia en estas áreas y podemos acompañarte desde el diseño hasta el despliegue y la monitorización.

Conclusión: con un pequeño ajuste en el parser de consultas de NestJs, DTOs bien diseñados y ValidationPipe configurado, puedes exponer endpoints potentes y seguros para filtrado avanzado. Aprende a aplicar estas técnicas y, si prefieres externalizar, nuestro equipo en Q2BSTUDIO está listo para ayudarte a construir soluciones a medida, seguras y escalables.