fix: excluir KB (e qualquer erro nao tratado) mostrava mensagem inutil - #13
Merged
Conversation
Causa raiz, sistemica: o error handler global do Fastify respondia
{ error: true, message, statusCode } - o campo error era um booleano,
nao a mensagem. Todo o frontend le error.response?.data?.error
esperando uma string (53 pontos no codigo). Resultado: qualquer
excecao nao tratada em QUALQUER rota vira "...: true" pra quem le o
campo direto, ou "Erro desconhecido" pra quem tem fallback - nos dois
casos, escondendo a causa real do erro.
Corrigido o campo `error` para ser a mensagem de fato.
Tambem: a rota DELETE /records/:id nao tinha try/catch nenhum (unica
rota de mutacao de KB sem isso), nao verificava se o registro existia
antes de considerar sucesso, e nao registrava audit log - diferente do
padrao usado nas outras rotas do mesmo arquivo. Adicionado tudo isso.
E no KBView.jsx, os 9 alerts de erro (excluir, aprovar, rejeitar,
publicar, exportar) caiam direto em "Erro desconhecido" sempre que
data.error nao vinha preenchido. Agora tentam data.error, depois
data.message, depois o status HTTP, e so por ultimo o generico -
diagnosticavel mesmo quando o servidor nao manda uma mensagem.
Contributor
There was a problem hiding this comment.
Pull request overview
Corrige a forma como erros do backend são serializados e exibidos no frontend, evitando a mensagem genérica “Erro desconhecido” e tornando falhas (incluindo exceções não tratadas) mais diagnosticáveis durante ações de KB (ex.: excluir, publicar, exportar).
Changes:
- Ajusta o error handler global do Fastify para retornar
errorcomo mensagem (string) em vez de boolean. - Fortalece a rota
DELETE /:recordIdde records comtry/catch, validação de existência e criação de audit log. - Centraliza a extração de mensagem de erro no
KBView.jsxcom fallback em cadeia para cobrir casos semresponse/sem payload esperado.
Reviewed changes
Copilot reviewed 3 out of 3 changed files in this pull request and generated 5 comments.
| File | Description |
|---|---|
| frontend/src/pages/kb/KBView.jsx | Adiciona helper de fallback para mensagens de erro e aplica nos fluxos de ação da tela de KB. |
| backend/src/server.js | Corrige o payload padrão do error handler global para compatibilizar com o consumo do frontend. |
| backend/src/modules/records/records.routes.js | Melhora o delete de KB com tratamento de erro, 404 quando não encontrado e audit log. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Comment on lines
+22
to
+26
| // A API sempre manda { error: '<mensagem>' } em erros tratados, mas uma | ||
| // excecao nao tratada no servidor, ou uma falha de rede (sem response | ||
| // nenhum, ex.: CORS, timeout, servidor fora do ar) nao tem esse campo. Sem | ||
| // esses fallbacks, tudo isso virava um "Erro desconhecido" que escondia a | ||
| // causa real - inclusive de quem for depurar o problema depois. |
Comment on lines
+255
to
+259
| // `error` precisa ser a mensagem (string): todo o frontend le | ||
| // `error.response?.data?.error` esperando texto. Mandar `error: true` | ||
| // (booleano) fazia qualquer excecao nao tratada, em qualquer rota, | ||
| // aparecer como "...: true" para quem usa esse campo - ou, quando o | ||
| // fallback e usado, mascarava a causa real como "Erro desconhecido". |
Comment on lines
+721
to
+723
| if (deleteResult.deletedCount === 0) { | ||
| return reply.status(404).send({ error: 'KB não encontrado' }); | ||
| } |
| await db.collection('audit_logs').insertOne({ | ||
| tenant_id: request.tenantId, | ||
| user_id: request.currentUser._id, | ||
| action: 'kb.deleted', |
Comment on lines
+744
to
+747
| } catch (error) { | ||
| fastify.log.error({ err: error }, 'Falha ao excluir KB'); | ||
| return reply.status(500).send({ error: 'Falha ao excluir KB', details: error.message }); | ||
| } |
3 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
O problema relatado
Ao tentar excluir um KB:
Falha ao excluir: Erro desconhecido.Causa raiz (sistêmica, não só do delete)
O error handler global do Fastify (
server.js) respondia:{ "error": true, "message": "...", "statusCode": 500 }errorera um booleano, não a mensagem. O frontend inteiro lêerror.response?.data?.erroresperando uma string — são 53 pontos no código fazendo isso. Resultado: qualquer exceção não tratada em qualquer rota do backend virava"...: true"para quem usa o campo direto, ou"Erro desconhecido"para quem tem fallback (como oKBView.jsx) — nos dois casos escondendo a causa real.O que mudou
server.js:erroragora é a mensagem de fato, nãotrue.records.routes.js: a rotaDELETE /:recordIdnão tinha nenhumtry/catch— era a única rota de mutação de KB nesse arquivo sem isso. Também não conferia se o registro existia antes de responder sucesso, e não gerava audit log. Adicionei os três.KBView.jsx: os 9alert()de erro (excluir, aprovar, rejeitar, publicar, 5 variantes de exportar) caíam direto em "Erro desconhecido" sempre quedata.errornão vinha preenchido. Criei umgetErrorMessage()com fallback em cadeia:data.error→data.message→ status HTTP →error.message(nível de rede) → só por último o texto genérico. Fica diagnosticável mesmo quando o servidor não manda uma mensagem estruturada.Test plan
npm run build(validado localmente, sem erros)