From 5e528f234b0549dbe6818ef65d540eda2236a348 Mon Sep 17 00:00:00 2001 From: gabrielb Date: Mon, 25 May 2026 18:59:41 -0300 Subject: [PATCH] =?UTF-8?q?feat(auth):=20adicionar=20tratamento=20de=20err?= =?UTF-8?q?o=20ao=20salvar=20estado=20PKCE=20feat(proxy):=20melhorar=20tra?= =?UTF-8?q?tamento=20de=20erro=20para=20backend=20inacess=C3=ADvel=20feat(?= =?UTF-8?q?certidao):=20adicionar=20valida=C3=A7=C3=A3o=20de=20CPF=20e=20C?= =?UTF-8?q?NPJ=20feat(iptu):=20ajustar=20manipula=C3=A7=C3=A3o=20de=20dado?= =?UTF-8?q?s=20de=20im=C3=B3veis=20retornados=20feat(error):=20criar=20com?= =?UTF-8?q?ponente=20de=20erro=20para=20exibi=C3=A7=C3=A3o=20de=20mensagen?= =?UTF-8?q?s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/api/auth/login.post.ts | 15 ++++-- server/api/proxy/[...path].ts | 5 +- src/error.vue | 58 +++++++++++++++++++++ src/pages/portal/debitos.vue | 3 +- src/pages/portal/guias.vue | 18 +++---- src/pages/servicos/certidao.vue | 90 +++++++++++++++++++++++++++++++-- src/pages/servicos/iptu.vue | 16 +++++- src/utils/formatador.js | 27 ++++++++++ 8 files changed, 211 insertions(+), 21 deletions(-) create mode 100644 src/error.vue diff --git a/server/api/auth/login.post.ts b/server/api/auth/login.post.ts index 2004b14..8dc90c4 100644 --- a/server/api/auth/login.post.ts +++ b/server/api/auth/login.post.ts @@ -16,11 +16,16 @@ export default defineEventHandler(async (event) => { const { codeVerifier, codeChallenge, state } = await generatePkce() const returnTo = body.data.returnTo ?? '/portal/painel' - await savePkceState(state, { - codeVerifier, - returnTo, - createdAt: Date.now(), - }) + try { + await savePkceState(state, { + codeVerifier, + returnTo, + createdAt: Date.now(), + }) + } catch (err) { + console.error('[auth/login] falha ao salvar estado PKCE (Redis indisponível?):', (err as Error).message) + throw createError({ statusCode: 503, statusMessage: 'Serviço temporariamente indisponível. Tente novamente em instantes.' }) + } const redirectUri = callbackUrlFromEvent(event) const authUrl = buildAuthUrl({ diff --git a/server/api/proxy/[...path].ts b/server/api/proxy/[...path].ts index bb915bf..88a6c86 100644 --- a/server/api/proxy/[...path].ts +++ b/server/api/proxy/[...path].ts @@ -97,6 +97,9 @@ export default defineEventHandler(async (event) => { setResponseHeader(event, 'content-type', 'application/json; charset=utf-8') return body } - throw err + + // Erro de rede (backend inacessível — ECONNREFUSED, timeout, etc.) + console.error(`[proxy] backend inacessível: ${url}`, (err as Error).message) + throw createError({ statusCode: 503, statusMessage: 'Sistema temporariamente indisponível.' }) } }) diff --git a/src/error.vue b/src/error.vue new file mode 100644 index 0000000..f7235f1 --- /dev/null +++ b/src/error.vue @@ -0,0 +1,58 @@ + + + diff --git a/src/pages/portal/debitos.vue b/src/pages/portal/debitos.vue index 602ab98..fdf8ab0 100644 --- a/src/pages/portal/debitos.vue +++ b/src/pages/portal/debitos.vue @@ -108,6 +108,7 @@ function getSegundoNome(texto) { size="small" show-gridlines selection-mode="multiple" + :is-row-selectable="({ data }) => data.codigoEstadoConta === 1" scrollable class="mt-2" > @@ -196,7 +197,7 @@ function getSegundoNome(texto) { :loading="isLoadingExtrato" @click="gerarExtratoPdf(false)" /> -