Files
agenciapsilmno/database-novo/seeds/seed_031_dev_auditoria.sql
T
Leonardo 7c20b518d4 Sessoes 1-6 acumuladas: hardening B2, defesa em camadas, +192 testes
Repositorio estava ha ~5 sessoes sem commit. Consolida tudo desde d088a89.

Ver commit.md na raiz para descricao completa por sessao.

# Numeros
- A# auditoria abertos: 0/30
- V# verificacoes abertos: 5/52 (todos adiados com plano)
- T# testes escritos: 10/10
- Vitest: 192/192
- SQL integration: 33/33
- E2E (Playwright, novo): 5/5
- Migrations: 17 (10 novas Sessao 6)
- Areas auditadas: 7 (+documentos com 10 V#)

# Highlights Sessao 6 (hoje)
- V#34/V#41 Opcao B2: tenant_features com plano + override (RPC SECURITY DEFINER, tela /saas/tenant-features)
- A#20 rev2 self-hosted: defesa em 5 camadas (honeypot + rate limit + math captcha condicional + paranoid mode + dashboard /saas/security)
- Documentos hardening (V#43-V#49): tenant scoping em storage policies (vazamento entre clinicas eliminado), RPC validate_share_token, signatures policy granular
- SaaS Twilio Config (/saas/twilio-config): UI editavel para SID/webhook/cotacao; AUTH_TOKEN permanece em env var
- T#9 + T#10: useAgendaEvents.spec.js + Playwright E2E (descobriu bug no front que foi corrigido)

# Sessoes anteriores (1-5) consolidadas
- Sessao 1: auth/router/session, normalizeRole extraido
- Sessao 2: agenda - composables/services consolidados
- Sessao 3: pacientes - tenant_id em todas queries
- Sessao 4: security review pagina publica - 14/15 vulnerabilidades corrigidas
- Sessao 5: SaaS - P0 (A#30: 7 tabelas com RLS off corrigidas)

# .gitignore ajustado
- supabase/* + !supabase/functions/ (mantem 10 edge functions, ignora .temp/migrations gerados pelo CLI)
- database-novo/backups/ (regeneravel via db.cjs backup)
- test-results/ + playwright-report/
- .claude/settings.local.json (config local com senha de dev removida do tracking)

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-19 15:42:46 -03:00

143 lines
6.5 KiB
PL/PgSQL

-- =============================================================================
-- Seed 031 — dev_auditoria_items
-- Importa bugs/débitos técnicos do development/02-auditoria/AUDITORIA.md
-- =============================================================================
-- ATENÇÃO: TRUNCATE RESTART IDENTITY — re-rodar apaga edições na UI.
-- =============================================================================
BEGIN;
TRUNCATE TABLE public.dev_auditoria_items RESTART IDENTITY CASCADE;
-- -----------------------------------------------------------------------------
-- Bugs e dívidas técnicas identificadas em 2026-03-11 (Sessões 1-4)
-- Fonte: AUDITORIA.md
-- -----------------------------------------------------------------------------
INSERT INTO public.dev_auditoria_items
(categoria, titulo, descricao_problema, solucao, severidade, status, resolvido_em, sessao_resolucao, arquivo_afetado, tags)
VALUES
-- Bugs Críticos
('Bug crítico',
'useRecurrence.js — variável occurrenceCount não declarada',
'Branches custom_weekdays, monthly e yearly usavam occurrenceCount sem declará-la → ReferenceError em runtime. Nenhum dos três contava ocorrências anteriores ao range, então max_occurrences nunca funcionava corretamente.',
'Cada branch ganhou let occurrenceCount = 0 + fase de pré-contagem de ruleStart até effStart.',
'critico', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11',
'src/features/agenda/composables/useRecurrence.js',
ARRAY['agenda','recorrencia','runtime-error']),
('Bug crítico',
'Exceção de remarcação fora do range não aparece',
'loadExceptions só buscava original_date no range. Se original_date estivesse fora mas new_date caísse dentro, a sessão remarcada não aparecia.',
'loadExceptions: duas queries paralelas — q1 (original_date no range) + q2 (reschedule com new_date no range). Mescladas e deduplicadas por id. expandRules post-pass: itera exceções não consumidas, injeta inbound reschedules.',
'alto', 'resolvido', '2026-03-11', 'Sessão 3 — 2026-03-11',
'src/features/agenda/composables/useRecurrence.js',
ARRAY['agenda','recorrencia','edge-case']),
-- Segurança
('Segurança',
'SQL dumps no repositório',
'Dumps com dados sensíveis versionados no git.',
'Removidos do tracking + adicionados ao .gitignore. Backups ficam em database-novo/backups/ (também gitignored).',
'critico', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11',
'.gitignore',
ARRAY['segurança','git','lgpd']),
('Segurança',
'useAgendaEvents — sem tenant_id em nenhuma operação',
'Todas as operações CRUD de eventos faltavam filtro tenant_id → risco de vazamento cross-tenant.',
'Adicionado filtro tenant_id em select/insert/update/delete + validação na composable.',
'critico', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11',
'src/features/agenda/composables/useAgendaEvents.js',
ARRAY['multi-tenant','rls','segurança']),
('Segurança',
'loadRules em useRecurrence sem filtro tenant_id',
'Regras de recorrência carregavam sem filtrar por tenant → possível leak.',
'Filtro tenant_id adicionado em loadRules.',
'critico', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11',
'src/features/agenda/composables/useRecurrence.js',
ARRAY['multi-tenant','segurança']),
('Segurança',
'console.log expõe dados de pacientes no browser',
'Logs com PII (nome, CPF, email, telefone) sendo enviados ao console.',
'Removidos console.log sensíveis. Logs restantes filtrados via wrapper que só loga em dev mode.',
'alto', 'resolvido', '2026-03-11', 'Sessão 1 — 2026-03-11',
'multiple',
ARRAY['segurança','lgpd','logs']),
-- Arquitetura / Performance
('Arquitetura',
'window.__guardsBound / window.__supabaseAuthListenerBound',
'Uso de flags globais no window para evitar bind duplicado de listeners. Anti-pattern — vazamento de escopo + difícil debug.',
NULL,
'medio', 'aberto', NULL, NULL,
'src/router/guards.js',
ARRAY['arquitetura','global-state','refactor']),
('Arquitetura',
'globalRole do profiles sem cache no guard',
'Guard fazia fetch do profile a cada navegação — N queries desnecessárias.',
'Cache de globalRole no store com invalidation via Supabase auth state changes.',
'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11',
'src/router/guards.js',
ARRAY['performance','cache']),
('Arquitetura',
'Dois composables para a mesma entidade',
'Duplicação: useAgendaEvents e outro composable fazendo a mesma coisa.',
'Consolidado em um único useAgendaEvents. Outro removido.',
'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11',
'src/features/agenda/composables/',
ARRAY['refactor','duplicação']),
('Arquitetura',
'Dois mappers para agenda',
'Duplicação: agendaMapper e outro mapper convertendo mesma estrutura.',
'Unificados em um único agendaMapper canônico.',
'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11',
'src/features/agenda/mappers/',
ARRAY['refactor','duplicação']),
('Performance',
'N+1 Query — migração paciente_id → patient_id',
'Queries em N+1 pattern durante transição de naming. Cada agenda_evento fazia query separada pra paciente.',
'Migrados todos os queries pra usar JOIN em patient_id. Migration de schema unificou naming.',
'alto', 'resolvido', '2026-03-11', 'Sessão 4 — 2026-03-11',
'multiple',
ARRAY['performance','query','n+1']),
-- Build / Produção
('Build',
'Template Sakai removido — bundle de produção',
'Bundle de produção carregando código do template Sakai que não era usado. Peso desnecessário.',
'Cleanup do template, tree-shake manual dos componentes não usados.',
'medio', 'resolvido', '2026-03-11', 'Sessão 2 — 2026-03-11',
'vite.config.mjs',
ARRAY['build','bundle-size']),
('Dívida técnica',
'Arquivos obsoletos no projeto',
'Vários arquivos .vue/.js deprecated ou não importados ainda no repo, confundindo navegação.',
'Parcial — alguns removidos, outros ainda a mapear.',
'baixo', 'em_analise', NULL, NULL,
'multiple',
ARRAY['cleanup','dívida-técnica']),
('Produção',
'Logs excessivos em produção',
'Muitos console.log/console.trace rodando em prod degradando performance.',
'Removidos console.trace em router.push e queries Supabase. Logs restantes condicionais a DEV mode.',
'medio', 'resolvido', '2026-03-11', 'Sessão 4 — 2026-03-11',
'multiple',
ARRAY['performance','logs','produção']);
COMMIT;
-- Log
INSERT INTO public.dev_generation_log (tipo, comando, sucesso, metadata)
VALUES ('seed', 'seed_031_dev_auditoria.sql', true,
jsonb_build_object('items', 14, 'abertos', 2, 'resolvidos', 12, 'source', 'development/02-auditoria/AUDITORIA.md'));