Skip to main content

O que este documento é

Registro cronológico de intervenções técnicas em produção: migrations aplicadas, bugs corrigidos, warnings do Supabase advisor e pendências de configuração manual. Atualizado sempre que uma rodada de auditoria operacional é executada. Diferença vs Auditoria Técnica: aquela é sobre arquitetura e sustentação (service layer, testes, acoplamento). Esta é sobre bugs concretos que impactam o app em produção. Cadência recomendada: mensal (rodar supabase advisors security + performance), após cada lançamento relevante, ou quando surgir incidente em produção.

Sessão 2026-04-23 — Estabilização pós go-live

Go-live em pixdopix.com.br. Primeira auditoria operacional após deploy em produção.

Migrations aplicadas (9)

MigrationImpacto
fix_cascade_on_delete_userFKs de gastos, assinaturas, contas_fixas (coluna usuario_id) passam a CASCADE. Antes, tentar excluir usuário com dados vinculados retornava erro 500 no admin.
fix_cascade_clientes_and_cobrancasMesmo padrão aplicado em clientes e cliente_cobrancas (coluna workspace_id). Evita bloqueio ao excluir workspaces com clientes.
fix_security_definer_search_path4 funções SECURITY DEFINER (gerar_cobrancas_mensais, marcar_cobrancas_atrasadas, set_cron_service_key, trigger_send_monthly_reminders) ganham search_path = 'public' fixo. Previne privilege escalation via schema hijacking.
fix_search_path_remaining_functionsMais 5 funções (calcular_vencimento, set_updated_at, marcar_cobranca_paga, desfazer_cobranca_paga, gerar_cobrancas_retroativas) com a mesma correção.
add_missing_fk_indexes7 índices faltantes em colunas FK: cliente_cobrancas.receita_id, clientes.deletado_por, clientes.usuario_id, compras_parceladas.categoria_id, ferramentas.deletado_por, ferramentas.usuario_id, workspace_invites.criado_por.
drop_duplicate_and_redundant_policiesRemove índice duplicate user_subscriptions_user_id_unique (redundante com o UNIQUE constraint já existente) e policy RLS duplicada user_subscriptions_read_own em user_subscriptions.
create_admin_audit_logNova tabela admin_audit_log + RLS (só super_admin lê, escrita via service role) + 3 índices (admin, target, action).

Bugs de código corrigidos

CommitO que corrige
adf5672Inputs numéricos travados em “1” ao tentar apagar (6 sheets afetados). Causa: parseInt(e.target.value) || 1 no onChange. Fix: e.target.valueAsNumber.
cb1f96cPreços aparecendo como “R19.9,00"e"R 19.9,00" e "R 69.9,00”. Causa: concatenação manual de ,00 em strings. Fix: toLocaleString('pt-BR', { style: 'currency' }).
85af1f5Duas sidebars renderizando em /admin (a do app cliente + a do admin). Fix: /admin adicionado em standaloneRoutes do LayoutWrapper.
85af1f5Dropdown de workspace exibindo “Pessoal Pessoal” (nome == tipo). Fix: mostra “Padrão” quando redundante.
f35f23dSignup ficava mudo quando “Confirm email” estava ativo. Fix: detecta !data.session e exibe banner “Conta criada! Enviamos um link de confirmação para …”
bb7b609changePlan aceitava qualquer string (incluindo “super_premium”). Fix: whitelist VALID_PLANS.
179a20bMiddleware do /admin sem timeout no RPC is_super_admin. Risco de DoS se Supabase ficasse lento. Fix: Promise.race com timeout de 5s.
179a20bCheckout Stripe não invalidava cache user-subscription em onError. UI mostrava “plano ativo” mesmo com cartão recusado. Fix: invalidate no catch.
179a20bAudit log ausente. Fix: admin_audit_log + registro automático em 7 ações (impersonate, reset_password, create_user, delete_user, change_plan, grant_business_comp, revoke_comp).
cf40194, ed9d6e4, dea36e9, d90d3ad, 9039d23Série de fixes de TypeScript após regeneração de database.types (tabela nova admin_audit_log, cast de Json, payload tipado em updateCategoria, remoção de queries em receitas.categoria_id inexistente, troca de Views<> por Tables<> no helper moderno).

Features entregues na mesma janela

Em paralelo aos fixes, foram shipped:
  • Admin V2 (commit 77fc7fc): layout dedicado com 4 abas (Overview/Usuários/Assinaturas/Integrações), 3 gráficos no overview (MRR, signups, revenue por plano), visual dark + accent vermelho.
  • CRUD completo de usuários (5897e28): criar, excluir com dupla confirmação, mudar plano manual, impersonate via magic link.
  • Admin Atividade (1d5e89a): página /admin/atividade visualizando o admin_audit_log com filtros por ação e busca.
  • Categorias customizadas (5a272a3): /configuracoes/categorias com 32 ícones + 12 cores, paywall Free 10 / Pro 25 / Business ∞, contador de uso por categoria, proteção contra excluir categoria com lançamentos.
  • CategoriaPicker visual (7323f74): substituí select texto por picker com ícone+cor nos sheets de gasto e parcela.

Warnings do Supabase advisor (após fixes)

Rodados get_advisors para security e performance: Security — resolvido:
  • 9 funções com search_path mutável → corrigido.
  • Policy RLS redundante → corrigido.
Security — aceito com nota:
  • extension_in_public (pg_net): extensão no schema public (warning). Mover exige recriar cron que está funcionando — risco > benefício, manter.
  • auth_leaked_password_protection: feature de bloquear senhas vazadas está desativada. Pendência de config manual (Supabase Dashboard → Authentication → toggle).
Performance — aceito com nota:
  • 20+ policies com auth.uid() direto (RLS initplan). Impacto desprezível abaixo de ~10k users. Refactor programado para Fase 2 (usar (select auth.uid())).
  • 30+ “unused indexes” detectados. Foram criados para patterns de uso esperado mas base ainda é pequena (~15 users), não deram tempo de acumular queries. Não remover — índice lento a adicionar depois, barato a manter.
  • multiple_permissive_policies em user_subscriptions: corrigido (drop da duplicata).

Pendências de configuração manual (fora de código)

PendênciaUrgênciaAção
SMTP Resend quebrado (signup retorna 500 com 535 Authentication credentials invalid)CríticaGerar nova API key em https://resend.com/api-keys e colar em Supabase → Authentication → Emails → SMTP Settings (Host smtp.resend.com, Port 465, Username literal resend, Password = nova key).
Leaked Password Protection desativadoMédiaSupabase Dashboard → Authentication → Sign In → ativar toggle (2 cliques).
Custom Domain do Supabase não configuradoBaixaURL de verify fica otngwujtmtxamqprpbst.supabase.co (feio). Requer plano Pro (US$ 25/mês). Adiar até base crescer.

Configurações aprovadas nesta sessão

  • Criado super_admin dedicado admin@pixdopix.com.br (não revogar geisonhoehr@gmail.com ainda, até validar o admin novo em produção).
  • Gasolina movido de “Transações” para “Recursos” no sidebar (reposicionamento semântico).
  • Admin V2 substituiu admin MVP anterior.

Próximas auditorias operacionais recomendadas

Cadência mínima

  • Mensal — rodar get_advisors (security + performance) e registrar mudanças aqui.
  • Após cada migration que cria tabela — regenerar types/database.types.ts via MCP Supabase para evitar quebra de build (aconteceu nesta sessão, 5 builds quebrados seguidos por types desatualizados).
  • Após cada lançamento de feature — rodar auditoria de código nos novos arquivos.

Indicadores de alerta

Abrir auditoria não-programada quando:
  • Logs do Vercel mostram >5 erros 5xx por hora
  • Warning de auth_rls_initplan começar a aparecer em queries lentas (>500ms)
  • Base ultrapassar 100 usuários ativos (gatilha refactor de paginação no admin)
  • Resend/SMTP apresentar rate limit ou bounce >1%

Investigações pendentes para próxima sessão

  • Picker de categoria em receita-sheet (hoje receitas.categoria_id não existe no schema — avaliar se vale migration).
  • Auditar app/page.tsx (dashboard principal) — flagged como A3 na Auditoria Técnica.
  • Testes automatizados do fluxo de signup/login + subscription (A1).

Log de mudanças deste documento

  • 2026-04-23 — Documento criado. Auditoria de estabilização pós go-live.