Aún no tienes acceso a esta clase

Crea una cuenta y continúa viendo este curso

Agregando un filtro de rango para precios

16/24
Recursos
// src/products/dtos/products.dtos.ts

import {
  ...,
  ValidateIf // 👈 new decorator
} from 'class-validator';

export class FilterProductsDto {
  ...
  @IsOptional()
  @Min(0)
  minPrice: number; // 👈 new field

  @ValidateIf((params) => params.minPrice)
  @IsPositive()
  maxPrice: number;  // 👈 new field
}
// src/products/services/products.service.ts
import { Model, FilterQuery } from 'mongoose';

@Injectable()
export class ProductsService {
  ... 

  findAll(params?: FilterProductsDto) {
    if (params) {
      const filters: FilterQuery<Product> = {}; // 👈 create filters
      const { limit, offset } = params;
      const { minPrice, maxPrice } = params; // 👈
      if (minPrice && maxPrice) {
        filters.price = { $gte: minPrice, $lte: maxPrice };
      }
      return this.productModel.find(filters).skip(offset).limit(limit).exec();
    }
    return this.productModel.find().exec();
  }
  ..
}

Aportes 5

Preguntas 4

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesión.

En general los cursos de NestJs son excelentes me están gustando mucho espero creen más con todo el tema de los test.
El profesor lo explica todo muy claro.

Excelente clase, todo se entiende, todo funciona de lo más bien 😃

findAll(params?: FilterProductsDto) {
    if (params) {
      const filters: FilterQuery<Product> = {};
      const limit = params.limit || 10;
      const offset = params.offset || 0;
      const { minPrice, maxPrice } = params;
      if (minPrice && maxPrice) {
        filters.price = { $gte: minPrice, $lte: maxPrice };
      }
      return this.productModel
        .find(filters)
        .skip(offset * limit)
        .limit(limit)
        .exec();
    }
    return this.productModel.find().exec();
  }

Cuando se didiregen a la ruta de docs para poder probar la documentación con swagger, me di cuenta que los parámetros están en

*required 

, cuando estos deberian ser opcionales. En el FilterDto le agregué esto para que no sean obligatorios pasarlos. ¿Será la única solución?

export class FilterProductsDto {
@ApiProperty({ required: false })
@IsOptional()
@IsPositive()
limit: number;

@ApiProperty({ required: false })
@IsOptional()
@Min(0)
offset: number;
} 

Se podría validad en ambos datos

@IsOptional()
  @ValidateIf((params) => params.maxPrice)
  @Min(0)
  minPrice: number;  

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