0
respostas

Problemas na validação do REMOVER

Segundo o código apresentado no "Faça como eu fiz: Removendo um post do blog",

async remover (req, res) {
    try {
        let post
        if (req.acesso.todos.permitido === true) {
            post = await Post.buscaPorId(req.params.id)
        } else if (req.acesso.apenasSeu.permitido === true) {
            post = await Post.buscaPorIdAutor(req.params.id, req.user.id)
        }

        post.remover()
        res.status(204)
        res.end()
    } catch (erro) {
        return res.status(500).json({ erro: erro.message })
    }
}

Ao tentar remover um post que não é do editor (por exemplo, post 1 pertence ao autor 1, logo com a pessoa 2 (que é um editor) e tento excluir o post 1, ele cai na função de buscar por autor (passando 1 no id e 2 no idAutor). Essa consulta não encontrará nenhum resultado, gerando um erro ao executar "post.remover()", do status 500 (que é do catch), pois ele não pode executar "remover" de um null, óbviamente porque não existe no banco um post de id 1 do autor 2.

Ok, ele não exclui nada, mas também não gera o erro esperado, que seria um erro de validação, mas sim um erro de NÃO ENCONTRAR esse post!

Qual seria a melhor forma de solução para esse caso? Procurar o post sempre e validar manualmente se ele é o mesmo id que o do Autor, ai gerar um erro de 403 'Forbidden'? Foi como fiz no código aqui...

async remover (req, res) {
    try {
      let post 
      post = await Post.buscaPorId(req.params.id)
      if(!req.acesso.todos.permitido){
        if(req.acesso.apenasSeu.permitido === true){
          if (!post || post.autor !== req.user.id){
            return res.status(403).json()
          }          
        }
      }

      post.remover()
      res.status(204)
      res.end()
    } catch (erro) {
      return res.status(500).json({ erro: erro.message })
    }
  }