5
respostas

Devemos deletar o que encontrarmos ou não deletar nenhum caso um filtro não bata?

Se passarmos para a rota de deletar esses filtros: "?id=1&&id=5&&id=10" e não existir o "id=5" devemos deletar os registros de "id=1" e "id=10" ou não devemos deletar nada e devemos apresentar uma mensagem informando que não foi possível deletar devido que não existe um registro com "id=5"? Se formos apresentar uma mensagem informando o pq de não ser possível, se for uma deleção muito grande tipo 1000 registros e 900 deles não existem, a mensagem ficaria extremamente grande informando cada um q não existe. Oq é melhor fazer?

5 respostas

Olá, Luidi! Como vai?

Essa é uma questão interessante e depende muito do comportamento que você deseja para sua aplicação. Vou te apresentar duas abordagens, e você pode escolher a que melhor se adapta às suas necessidades:

  1. Deletar apenas os registros existentes: Neste caso, você deletaria os registros que existem no banco de dados, mesmo que alguns dos IDs fornecidos não existam. Isso pode ser mais eficiente, especialmente em casos onde a lista de IDs é longa e você não quer sobrecarregar a resposta com uma lista de IDs inexistentes. Você pode retornar uma mensagem simples informando quantos registros foram deletados com sucesso.

    Exemplo de resposta:

    {
      "message": "Deleção concluída. 2 registros foram deletados com sucesso."
    }
    
  2. Não deletar nada se algum ID não existir: Esta abordagem é mais restritiva e garante que a operação só seja realizada se todos os IDs existirem. Isso pode ser útil em situações onde a consistência dos dados é crítica. Neste caso, você pode retornar uma mensagem de erro informando que a operação não foi realizada porque um ou mais IDs não foram encontrados.

    Exemplo de resposta:

    {
      "error": "Deleção não realizada. Os seguintes IDs não foram encontrados: 5."
    }
    

Para a questão de mensagens muito grandes, uma solução seria limitar a quantidade de IDs ausentes que você reporta na resposta, ou simplesmente informar que alguns IDs não foram encontrados sem listar todos.

Espero ter ajudado e bons estudos!

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

Mas qual seria a melhor escolha em termos de boas práticas? Ou seria melhor escolher um query string para informar qual tipo a pessoa quer e deixar como padrão alguma das abordagens(mas qual daí?)?

Oi, Luidi!

A melhor prática em APIs é não bloquear a operação inteira só porque alguns IDs não existem. O problema aqui é que, em APIs reais, filtros grandes são comuns e impedir a deleção inteira pode gerar frustração e retrabalho. Resolva fazendo o seguinte: delete apenas os registros que existem e retorne uma resposta clara informando quantos foram removidos e quantos não foram encontrados, sem listar tudo.

Veja este exemplo:


const ids = req.query.id; // ex: ['1','5','10']

const encontrados = await Model.findAll({ where: { id: ids }});
const idsEncontrados = encontrados.map(r => r.id);

await Model.destroy({ where: { id: idsEncontrados }});

return res.json({
  deletados: idsEncontrados.length,
  naoEncontrados: ids.filter(id => !idsEncontrados.includes(Number(id))).length
});

Importante: se quiser dar opção ao usuário, adicione um query param como ?strict=true.

  • Com strict=true: não deletar nada quando um ID não existir.
  • Sem strict: deletar só os existentes (padrão mais usado em APIs REST).

Fico à disposição!

Então é bom ter a opção "?strict=true", pois dá mais liberdade para o usuário mesmo q ele nunca use, né? Mas é bom deixar como padrão caso ele não informe, deletar apenas os encontrados, né?

Oi, Luidi!

Siga com a ideia de incluir ?strict=true. Isso dá liberdade ao usuário e mantém um comportamento padrão seguro e previsível. O caminho mais comum em APIs REST é deletar apenas os registros existentes quando o usuário não informa nada — assim a operação continua eficiente e não exige que todos os IDs estejam presentes.

Quando strict=true, você força a validação completa e evita deletar parcialmente. Quando o parâmetro não é enviado, use o modo padrão: deletar somente os encontrados.

Veja este exemplo:


const ids = req.query.id;
const strict = req.query.strict === 'true';

const encontrados = await Model.findAll({ where: { id: ids }});
const idsEncontrados = encontrados.map(item => item.id);

if (strict && idsEncontrados.length !== ids.length) {
  return res.status(400).json({
    erro: 'Nem todos os IDs existem para deleção completa.'
  });
}

await Model.destroy({ where: { id: idsEncontrados }});

return res.json({
  deletados: idsEncontrados.length,
  naoEncontrados: ids.length - idsEncontrados.length
});

Fico à disposição.