-- ============================================================================= -- 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'));