Filtrado de Precios con Rango Usando Between en Time Wareham

Clase 28 de 36Curso de NestJS: Persistencia de Datos con TypeORM

Contenido del curso

Relaciones

Resumen

Cuando necesitas filtrar productos dentro de un rango de precios específico, TypeORM ofrece operadores avanzados que simplifican esta tarea de forma elegante. Aprender a utilizar el operador Between y a construir condiciones dinámicas en tus consultas es fundamental para crear APIs robustas y flexibles.

¿Cómo funcionan las opciones avanzadas de búsqueda en TypeORM?

TypeORM proporciona dos niveles de búsqueda en sus repositorios. El nivel básico permite usar la cláusula where para filtrar por condiciones simples. Sin embargo, la parte avanzada incluye operadores SQL como Not, MoreThan, LessThan, MoreThanOrEqual y, el protagonista aquí, Between [01:10].

El operador Between permite definir un rango con un valor mínimo y un valor máximo. TypeORM traduce esto directamente a una sentencia SQL BETWEEN, lo que resulta ideal para filtrar precios, fechas o cualquier campo numérico.

¿Cómo configurar los DTOs para recibir un rango de precios?

El primer paso es agregar dos nuevos parámetros al DTO de filtros: minPrice y maxPrice [01:48]. Ambos se definen como positivos usando el decorador IsPositive() de class-validator, lo que impide enviar valores como cero o negativos.

¿Qué es ValidateIf y cómo garantiza que ambos valores lleguen juntos?

Una situación común es que si el usuario envía un precio mínimo, obligatoriamente debe enviar también el precio máximo para que el rango tenga sentido. Para esto se utiliza el decorador @ValidateIf() de class-validator [02:30]:

typescript @ValidateIf((item) => item.minPrice) @IsPositive() maxPrice: number;

Este decorador recibe una función que evalúa los atributos del DTO. En este caso, indica que maxPrice solo será validado (y por tanto requerido) cuando minPrice esté presente. Si no se envía minPrice, maxPrice tampoco será obligatorio.

¿Cómo construir un where dinámico en el servicio?

En lugar de tener un where fijo, la mejor práctica es construirlo de forma dinámica [03:30]. Esto permite agregar condiciones según los filtros que lleguen, ya sea por precio, marca, categoría u otro atributo:

typescript import { Between, FindOptionsWhere } from 'typeorm';

const where: FindOptionsWhere<Product> = {};

if (minPrice && maxPrice) { where.price = Between(minPrice, maxPrice); }

return this.productRepository.find({ where });

El tipo FindOptionsWhere (referido en la clase como FindConditions) permite tipar correctamente el objeto where con base en los atributos de la entidad Product [04:00]. Gracias a este tipado, al escribir where. el autocompletado mostrará únicamente las propiedades válidas del producto, lo que reduce errores.

Si ningún filtro está presente, el objeto where se envía vacío y la consulta retorna todos los registros sin restricciones.

¿Cómo probar el filtrado por rango en la práctica?

Al realizar pruebas con un cliente HTTP como Insomnia, se puede verificar el comportamiento del filtro [05:18]:

  • Enviar solo minPrice sin maxPrice: la validación con @ValidateIf() impide la petición y devuelve un error indicando que maxPrice es obligatorio.
  • Enviar minPrice=1 y maxPrice=20: retorna todos los productos con precio entre 1 y 20.
  • Enviar minPrice=0: el decorador @IsPositive() rechaza la petición porque cero no es un número positivo [06:10].
  • Enviar minPrice=200 y maxPrice=250: retorna únicamente los productos dentro de ese rango específico [07:20].

Estos resultados confirman que tanto las validaciones del DTO como el operador Between funcionan correctamente en conjunto.

Para depuración, se puede agregar un console.log que muestre los valores de minPrice y maxPrice tal como llegan al servicio, lo cual ayuda a identificar problemas rápidamente [07:40].

TypeORM ofrece muchos más operadores avanzados además de Between, como In, Like, IsNull o Raw. Te invito a revisar la documentación oficial y experimentar con diferentes combinaciones para construir filtros cada vez más potentes en tus APIs. ¿Qué otros operadores te parecen útiles para tus proyectos?