2
respostas

Filtro fincionando apenas quando a data_inicial é exatamente igual a data que consta no banco.

O filtro não busca as turmas com data_inico entre um range de datas ex: http://localhost:3000/turmas?data_inicial=2020-06-01&data_final=2023-07-28

Dado no banco: [ { "id": 1, "data_inicio": "2020-07-01", "createdAt": "2023-06-28T21:16:47.000Z", "updatedAt": "2023-06-28T21:16:47.000Z", "deletedAt": null, "nivel_id": 1, "docente_id": 1 }, { "id": 2, "data_inicio": "2021-07-01", "createdAt": "2023-06-28T21:16:47.000Z", "updatedAt": "2023-06-28T21:16:47.000Z", "deletedAt": null, "nivel_id": 2, "docente_id": 3 }, { "id": 3, "data_inicio": "2022-07-01", "createdAt": "2023-06-28T21:16:47.000Z", "updatedAt": "2023-06-28T21:16:47.000Z", "deletedAt": null, "nivel_id": 3, "docente_id": 2 } ]

Minha função para buscar todas as turmas:

static async buscaTodasAsTurmas(req, res) {
    const { data_inicial, data_final } = req.query;
    const where = {};
    data_inicial || data_final ? (where.data_inicio = {}) : null;
    data_inicial ? (where.data_inicio[Op.gte] = data_inicial) : null;
    data_final ? (where.data_inicio[Op.lte] = data_final) : null;

    try {
      const turmas = await database.Turmas.findAll({ where });
      return res.status(200).json(turmas);
    } catch (error) {
      return res.status(500).json(error.message);
    }
  }
2 respostas

Oi Jaison, tudo bem?

Analisando o código que você compartilhou, percebo que a lógica do filtro está correta. No entanto, acredito que você esteja encontrando dificuldades porque está utilizando o operador Op.gte (greater than or equal to) e Op.lte (less than or equal to) para comparar as datas.

Porém, as datas estão sendo passadas como strings na query, o que pode causar problemas na comparação. Para resolver isso, sugiro que você utilize a função new Date() para criar objetos de data a partir das strings que você recebe na query.

Vou te mostrar como ficaria a função buscaTodasAsTurmas com essa modificação:

static async buscaTodasAsTurmas(req, res) {
  const { data_inicial, data_final } = req.query;
  const where = {};

  if (data_inicial || data_final) {
    where.data_inicio = {};
  }

  if (data_inicial) {
    where.data_inicio[Op.gte] = new Date(data_inicial);
  }

  if (data_final) {
    where.data_inicio[Op.lte] = new Date(data_final);
  }

  try {
    const turmas = await database.Turmas.findAll({ where });
    return res.status(200).json(turmas);
  } catch (error) {
    return res.status(500).json(error.message);
  }
}

Dessa forma, as datas serão comparadas corretamente, considerando o range definido na query.

Espero que essa solução te ajude a resolver o problema! Se tiver mais alguma dúvida, é só perguntar.

Espero ter ajudado e bons estudos!

Muito obrigado Sarah.