Skip to content

Troubleshooting

Guia de diagnóstico para erros comuns na plataforma OLP


1. Tabela de Erros Comuns

HTTPMensagemCausa ProvávelSolução
400"Ação não reconhecida"Frontend chama action inexistenteVerificar nome da action no backend
401"Não autenticado"Cookie não enviado ou JWT expiradoVerificar credentials: 'include' e CORS
403"Acesso negado"Papel insuficienteVerificar array de papéis permitidos na EF
429"Muitas solicitações"Rate-limit atingidoAguardar janela (15min sistema, progressivo portal)
500"Erro interno"Bug na Edge FunctionVerificar logs da EF no Supabase
CORS errorOrigin não permitidaAdicionar em ALLOWED_ORIGINS do cors-helpers.ts

2. Fluxo de Debug

1. Console do navegador (F12)
   └─ Erros JS, stack traces
   
2. Network tab (F12 → Network)
   └─ Status HTTP, body da resposta, headers
   
3. Edge Function logs (Supabase Dashboard)
   └─ console.log/console.error da função
   
4. Banco de dados (logs_transacoes)
   └─ Ações registradas, detalhes JSONB
  • Edge Function Logs: https://supabase.com/dashboard/project/mjvuzsizjlcalyfmbquy/functions
  • Database: https://supabase.com/dashboard/project/mjvuzsizjlcalyfmbquy/editor
  • Auth: https://supabase.com/dashboard/project/mjvuzsizjlcalyfmbquy/auth/users

3. auth-diagnostics — Ferramenta de Diagnóstico

Edge Function: supabase/functions/auth-diagnostics/index.ts

4 ações disponíveis para teste:

admin_whoami

Valida o cookie olp_auth e retorna o payload do JWT:

typescript
const result = await invokeAction('auth-diagnostics', 'admin_whoami', {})
// → { id, nome_completo, principal_role, escola_id, roles }

Quando usar: Verificar se o token do sistema está válido.

admin_rls_smoke

Valida o token E testa se o PostgREST aceita o JWT como Bearer:

typescript
const result = await invokeAction('auth-diagnostics', 'admin_rls_smoke', {})
// → { olp_auth_ok, postgrest_ok, postgrest_error, user, sample }

Quando usar: Verificar se RLS está funcionando com o token OLP.

portal_whoami

Valida o cookie olp_mural e retorna payload do mural:

typescript
const result = await invokeAction('auth-diagnostics', 'portal_whoami', {})
// → { sub, tipo, nome_completo, escola_id, serie_id, turma_id, escopo }

Quando usar: Verificar se o token do portal (aluno/responsável) está válido.

public_smoke

Testa conectividade do PostgREST sem autenticação:

typescript
const result = await invokeAction('auth-diagnostics', 'public_smoke', {})
// → { postgrest_ok, postgrest_error, sample }

Quando usar: Verificar se o Supabase está acessível.


4. Problemas Frequentes

Sintoma: Todas as chamadas autenticadas retornam 401.

Checklist:

  1. credentials: 'include' está no fetch? (O helper invokeAction já faz isso)
  2. O domínio está em ALLOWED_ORIGINS do cors-helpers.ts?
  3. O cookie olp_auth existe? (DevTools → Application → Cookies)
  4. O JWT expirou? (8h para sistema, 2h para portal)

Origin não permitida (CORS)

Sintoma: Access-Control-Allow-Origin error no console.

Checklist:

  1. Verificar ALLOWED_ORIGINS em supabase/functions/_shared/cors-helpers.ts
  2. Origins permitidas:
    • http://localhost:5173
    • http://localhost:8080
    • https://b4188062-97f3-4ab8-aba4-214ee32684a0.lovableproject.com
    • https://id-preview--b4188062-97f3-4ab8-aba4-214ee32684a0.lovable.app
    • https://olp.digital
  3. NUNCA usar '*' com credentials: 'include'

Papel insuficiente (403)

Sintoma: Usuário autenticado mas recebe "Acesso negado".

Checklist:

  1. Verificar principal_role no JWT (usar admin_whoami)
  2. Verificar array de papéis na Edge Function
  3. Verificar se o papel está na hierarquia correta

data undefined no frontend

Sintoma: result.data é undefined mas result.success é true.

Causa: Backend retorna campo com nome diferente ou não retorna data.

Solução: Verificar resposta da Edge Function — sempre usar result.data.

Toast genérico (sem mensagem do backend)

Sintoma: Toast mostra "Erro" sem detalhes.

Solução: Usar response.message no catch do hook:

typescript
throw new Error(result.message || 'Erro genérico')

5. Verificar Geolocalização

Conferir se logs têm geodados

sql
SELECT 
  COUNT(*) FILTER (WHERE cidade IS NOT NULL) as com_geo,
  COUNT(*) FILTER (WHERE cidade IS NULL) as sem_geo
FROM logs_transacoes
WHERE criado_em >= NOW() - INTERVAL '7 days';

Se geolocalização está ausente

  1. Verificar se req: req está sendo passado no registrarLog()
  2. Verificar se o Cloudflare Worker está injetando headers X-Geo-*

6. Debug de CRON Jobs

Job não executou

  1. Verificar cron_status:
    sql
    SELECT * FROM cron_status ORDER BY ultima_execucao DESC;
  2. Verificar se o CRON está configurado no Supabase Dashboard
  3. Verificar logs: filtrar por faturamento.* ou manutencao.* em logs_transacoes

Job em estado CRÍTICO

  1. Verificar ultimo_erro e tentativas_consecutivas em cron_status
  2. Resolver o problema raiz
  3. Executar trigger manual via Monitor CRON para resetar

Referências

  • supabase/functions/auth-diagnostics/index.ts — Ferramenta de diagnóstico
  • supabase/functions/_shared/cors-helpers.ts — Origins permitidas
  • docs/security/RATE_LIMITS.md — Detalhes de rate-limits
  • docs/security/AUDIT_LOG.md — Como interpretar logs
  • docs/operations/CRON_JOBS.md — Detalhes dos jobs CRON