A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

Filtrando precios con operadores

24/27
Recursos

Aportes 9

Preguntas 0

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

Si intentas realizar un query con limit y offset, o solo con price, veras que tendras el error de price_max is required, para poder utilizar las demas queries solo tienes que agregar required() en la opci贸n is de price_max

price_max: price_max.when('price_min', {
    is: Joi.number().integer().required(),
    then: Joi.required(),
  }),

Tambi茅n puedes simplificar un poco la opci贸n is

const price_min = Joi.number().integer();

price_max: price_max.when('price_min', {
    is: price_min.required(),
    then: Joi.required(),
  }),

Leyendo un poco la documentaci贸n, encontr茅 otro operador que puede funcionar para este momento y es el operador Op.between:
.

options.where.price = {
  [Op.between]: [price_min, price_max],
};

Fuente: Variable | Sequelize


.
Adem谩s, en la documentaci贸n de Joi encontr茅 una manera de validar que el valor que se env铆e en price_max sea mayor a price_min ya que por defecto si se env铆a estos datos, se retornara un array vac铆o y probablemente sea mejor manera el error:

const queryProductSchema = Joi.object({
  limit,
  offset,
  price,
  price_min,
  price_max: price_max.greater(Joi.ref('price_min')),
})
  .with('price_min', 'price_max')
  .with('price_max', 'price_min');


,


Y por 煤ltimo, with() es una condicional donde el primer par谩metro demanda la presencia de los par谩metros siguientes para ser v谩lida. Este segundo par谩metro puede ser un string o un array.
Fuente: API Reference | joi.dev

A煤n con la validaci贸n de price_max cuando se env铆a el par谩metro price_min, se requiere otra validaci贸n para solicitar el par谩metro price_min cuando se env铆a price_max, la opci贸n que viene en la misma documentaci贸n es la siguiente:

Recuerden guardar la data si hacen cambios directamente en pgAdmin:

En product.schema reemplace:

is: Joi.number().integer(),

Por:

is: Joi.exist()

Esto debido a que al hacer un GET sin querys, me daba el error de que price_max era obligatorio.

est谩 ch茅vere la implementaci贸n del filtrado, pero creo que se le est谩 agregando mucha responsabilidad y complejidad al m茅todo find, tal vez si de pronto se a铆sla la l贸gica del where en otro lugar podr铆amos bajar tanto la responsabilidad y complejidad.
Para finalizar el m茅todo find si le sigui茅ramos agregando m谩s l贸gica se nos podr铆a volver un todo poderoso(anti patr贸n) 馃槄

Esto del filtro estuvo super!!!

Hermosa documentaci贸n la de sequelize

https://sequelize.org/docs/v6/getting-started/

Se hace el uso de operadores para hacer un filtrado de precios. Los operadores sirven para hacer >, <, =, 鈮, etc. Los operadores se requieren de la siguiente manera: const { Op } = require('sequelize');.

Tambi茅n se puede hacer uso de WHERE utilizando la instrucci贸n where con los atributos deseados.

El filtrado de precios tambi茅n se hace con query params. Para recibir el precio se hace un ajuste en el schema.

product.schema.js Se hace la validaci贸n para que si se env铆a un precio m铆nimo, tambi茅n se env铆e un precio m谩ximo.:

const price = Joi.number().integer().min(10);
const price_min = Joi.number().integer();
const price_max = Joi.number().integer();

const limit = Joi.number().integer();
const offset = Joi.number().integer();

const queryProductSchema = Joi.object({
  limit,
  offset,
  price,
  price_min,
  price_max: price_max.when('price_min', {
    is: Joi.number().integer().required(),
    then: Joi.required(),
  }),
});

Tambi茅n se hace la modificaci贸n correspondiente en el servicio, en las options se agrega where con un objeto vac铆o. Si viene un price en la query params, entonces se agrega a las options. De esta manera se har谩 un filtrado de productos con el precio exacto que venga en los par谩metros query.

En el caso de precio m铆nimo y m谩ximo, se hace una validaci贸n por si vienen en los query params. Se hace el uso de los operadores de sequelize usando Op.gte para 鈮 al precio m铆nimo y Op.lte para 鈮 al precio m谩ximo.

product.service.js:

async find(query) {
    const options = {
      include: ['category'],
      where: {},
    };
    const { limit, offset } = query;
    if (limit && offset) {
      options.limit = limit;
      options.offset = offset;
    }

    const { price } = query;
    if (price) {
      options.where.price = price;
    }

    const { price_min, price_max } = query;
    if (price_min && price_max) {
      options.where.price = {
        [Op.gte]: price_min,
        [Op.lte]: price_max,
      };
    }

    const products = await models.Product.findAll(options);
    return products;
  }