From 6a970120583e6b0f0be93f7c7b2613c6db6a5b4c Mon Sep 17 00:00:00 2001 From: Marcio Bevervanso Date: Tue, 16 Jun 2026 11:07:02 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20revelar=20erro=20real=20do=20Supabase=20?= =?UTF-8?q?no=20hist=C3=B3rico=20de=20campanhas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erros do Supabase (PostgrestError) não são Error, então o catch caía no fallback genérico "Erro ao listar campanhas salvas" e escondia a causa (tabela ausente, projeto pausado, key inválida). Agora extrai message/code/details/hint. Co-Authored-By: Claude Opus 4.8 --- src/app/api/campaigns/draft/route.ts | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/app/api/campaigns/draft/route.ts b/src/app/api/campaigns/draft/route.ts index cc330f9..c5b517b 100644 --- a/src/app/api/campaigns/draft/route.ts +++ b/src/app/api/campaigns/draft/route.ts @@ -1,6 +1,19 @@ import { NextRequest, NextResponse } from 'next/server'; import { getSupabaseServerClient } from '@/lib/supabase/server'; +// Erros do Supabase (PostgrestError) não são instâncias de Error — têm +// message/code/details/hint. Sem isso, o catch caía no fallback genérico e +// escondia a causa real (tabela ausente, projeto pausado, key inválida...). +function describeError(error: unknown, fallback: string): string { + if (error instanceof Error) return error.message; + if (error && typeof error === 'object') { + const e = error as { message?: string; code?: string; details?: string; hint?: string }; + const parts = [e.message, e.code ? `(code ${e.code})` : '', e.details, e.hint].filter(Boolean); + if (parts.length) return parts.join(' '); + } + return fallback; +} + const ALLOWED_FIELDS = [ 'product', 'audience', @@ -66,7 +79,7 @@ export async function POST(request: NextRequest) { } catch (error) { console.error('[Campaigns] Error saving draft:', error); return NextResponse.json( - { success: false, error: error instanceof Error ? error.message : 'Erro ao salvar rascunho da campanha.' }, + { success: false, error: describeError(error, 'Erro ao salvar rascunho da campanha.') }, { status: 500 } ); } @@ -86,7 +99,7 @@ export async function GET(request: NextRequest) { } catch (error) { console.error('[Campaigns] Error listing drafts:', error); return NextResponse.json( - { success: false, error: error instanceof Error ? error.message : 'Erro ao listar campanhas salvas.' }, + { success: false, error: describeError(error, 'Erro ao listar campanhas salvas.') }, { status: 500 } ); }