1
resposta

Posso fazer esse método apontando para o outro?

No "Services.js" eu tenho o método "pegaUmRegistro" que dentro dele ele chama o método "pegaTodosOsRegistros" que resolve o problema de pegar um registro somente também, porém ele usa o método "findAll" que retorna um array, então tenho que pegar o resultado na posição zero dentro do método "pegaUmRegistro", isso é um boa prática ou é ruim já que não se utiliza do método "findOne"?

const dataSource = require('../database/models'); //como o arquivo é index.js não precisamos passar o nome do arquivo.

class Services {
    constructor(modelo) {
        this.modelo = modelo;
    }

    async pegaTodosOsRegistros(opts = {}) {
    const { scope, where, ...resto } = opts;

    // 1) Resolve o "model" (com ou sem scope)
    let modelo = dataSource[this.modelo];
    if (scope) {
      modelo = modelo.scope(scope);
    }

    // 2) Monta as opções finais pro findAll
    const opcoes = { ...resto };
    if (where && Object.keys(where).length > 0) {
      opcoes.where = where; // deixa o Sequelize combinar com o que vier do scope
    }
    // 3) Executa
    return modelo.findAll(opcoes);
  }

  async pegaUmRegistro(opts) {
  if (!opts || !opts.where || Object.keys(opts.where).length === 0) {
    throw new Error('Nenhum filtro (where) foi informado para busca única.');
  }

  const registros = await this.pegaTodosOsRegistros(opts);
  return registros[0] || null;
}
}

module.exports = Services;

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
1 resposta

Olá Luidi! Como vai?

A sua abordagem de usar o método pegaTodosOsRegistros dentro do pegaUmRegistro para reutilizar código é interessante, mas pode não ser a mais eficiente ou clara. Vou explicar o porquê.

Quando você usa findAll, o Sequelize retorna um array, mesmo que você esteja buscando apenas um registro. Isso significa que, mesmo que você só queira um item, ele ainda vai buscar todos que correspondem aos critérios e depois você pega o primeiro. Isso pode ser ineficiente, especialmente se houver muitos registros que correspondem ao critério.

Por outro lado, o método findOne do Sequelize é projetado exatamente para o que você está tentando fazer no pegaUmRegistro. Ele retorna o primeiro objeto que corresponde aos critérios de busca, sem precisar retornar um array. Isso pode ser mais eficiente e também torna o código mais claro, pois findOne comunica a intenção de buscar apenas um registro.

Aqui está como você poderia modificar o método pegaUmRegistro para usar findOne:

async pegaUmRegistro(opts) {
  if (!opts || !opts.where || Object.keys(opts.where).length === 0) {
    throw new Error('Nenhum filtro (where) foi informado para busca única.');
  }

  const { scope, where, ...resto } = opts;
  let modelo = dataSource[this.modelo];
  if (scope) {
    modelo = modelo.scope(scope);
  }

  return modelo.findOne({ where, ...resto });
}

Dessa forma, você está utilizando o método mais adequado para a tarefa, o que pode melhorar tanto a performance quanto a legibilidade do seu código.

Espero ter ajudado e bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.