import { internalAction, internalMutation, mutation, query } from './_generated/server'; import { internal, api } from './_generated/api'; import { v } from 'convex/values'; // import { hashPassword } from './auth/utils'; import { Id } from './_generated/dataModel'; import { createAuthUser } from './auth'; // Dados exportados do Convex Cloud const simbolosData = [ { descricao: 'Cargo de Direção e Assessoramento Superior - 5', nome: 'DAS-5', repValor: '4747.84', tipo: 'cargo_comissionado' as const, valor: '5934.80', vencValor: '1186.96' }, { descricao: 'Cargo de Direção e Assessoramento Superior - 3', nome: 'DAS-3', repValor: '6273.92', tipo: 'cargo_comissionado' as const, valor: '7842.40', vencValor: '1568.48' }, { descricao: 'Cargo de Direção e Assessoramento Superior -2', nome: 'DAS - 2', repValor: '7460.87', tipo: 'cargo_comissionado' as const, valor: '9326.09', vencValor: '1865.22' }, { descricao: 'Cargo de Apoio e Assessoramento - 1', nome: 'CAA-1', repValor: '4120.43', tipo: 'cargo_comissionado' as const, valor: '5150.54', vencValor: '1030.11' }, { descricao: 'Função Gratificada de Direção e Assessoramento', nome: 'FDA', repValor: '', tipo: 'funcao_gratificada' as const, valor: '7460.87', vencValor: '' }, { descricao: 'Função Gratificada de Supervisão - 3', nome: 'CAA - 3', repValor: '2204.36', tipo: 'cargo_comissionado' as const, valor: '2755.45', vencValor: '551.09' }, { descricao: 'Função Gratificada de Direção e Assessoramento -1', nome: 'FDA-1', repValor: '', tipo: 'funcao_gratificada' as const, valor: '6273.92', vencValor: '' }, { descricao: 'Função Gratificada de Direção e Assessoramento -2', nome: 'FDA -2', repValor: '', tipo: 'funcao_gratificada' as const, valor: '5765.22', vencValor: '' }, { descricao: 'Função Gratificada de Direção e Assessoramento - 3', nome: 'FDA - 3', repValor: '', tipo: 'funcao_gratificada' as const, valor: '4747.83', vencValor: '' }, { descricao: 'Função Gratificada de Direção e Assessoramento - 4', nome: 'FDA - 4', repValor: '', tipo: 'funcao_gratificada' as const, valor: '3391.31', vencValor: '' }, { descricao: 'Função Gratificada de Supervisão - 1', nome: 'FGS -1 ', repValor: '', tipo: 'funcao_gratificada' as const, valor: '1532.08', vencValor: '' }, { descricao: 'Função Gratificada de Supervisão - 2', nome: 'FGS - 2', repValor: '', tipo: 'funcao_gratificada' as const, valor: '934.74', vencValor: '' }, { descricao: 'Função Gratificada de Supervisão - 2', nome: 'CAA - 2', repValor: '3391.31', tipo: 'cargo_comissionado' as const, valor: '4239.14', vencValor: '847.83' } ]; const funcionariosData = [ { admissaoData: '01/01/2000', cep: '50740500', cidade: 'Recife', cpf: '04281554645', email: 'kilder@kilder.com.br', endereco: 'Rua Bernardino Alves Maia, Várzea', matricula: '4585', nascimento: '01/01/2000', nome: 'Madson Kilder', rg: '123456122', simboloNome: 'DAS-3', // Será convertido para ID simboloTipo: 'cargo_comissionado' as const, telefone: '8101234564', uf: 'PE' }, { admissaoData: '01/01/2000', cep: '50740400', cidade: 'Recife', cpf: '05129038401', email: 'princesalves@gmail.com', endereco: 'Rua Deputado Cunha Rabelo, Várzea', matricula: '123456', nascimento: '05/01/1985', nome: 'Princes Alves rocha wanderley', rg: '639541200', simboloNome: 'FDA-1', // Será convertido para ID simboloTipo: 'funcao_gratificada' as const, telefone: '81123456455', uf: 'PE' }, { admissaoData: '01/10/2025', cep: '50740400', cidade: 'Recife', cpf: '06102637496', email: 'deyvison.wanderley@gmail.com', endereco: 'Rua Deputado Cunha Rabelo, Várzea', matricula: '256220', nascimento: '16/03/1985', nome: 'Deyvison de França Wanderley', rg: '6347974', simboloNome: 'CAA-1', // Será convertido para ID simboloTipo: 'cargo_comissionado' as const, telefone: '81994235551', uf: 'PE' } ]; const solicitacoesAcessoData = [ { dataResposta: 1761445098933, dataSolicitacao: 1761445038329, email: 'severino@gmail.com', matricula: '3231', nome: 'Severino Gates', observacoes: 'Aprovação realizada por Deyvison', status: 'aprovado' as const, telefone: '(81) 9942-3551' }, { dataSolicitacao: 1761445187258, email: 'michaeljackson@gmail.com', matricula: '123321', nome: 'Michael Jackson', status: 'pendente' as const, telefone: '(81) 99423-5551' } ]; /** * Seed inicial do banco de dados com os dados exportados do Convex Cloud */ export const seedCreateRoles = internalMutation({ args: {}, returns: v.null(), handler: async (ctx) => { console.log('🔐 Criando roles...'); const ensureRole = async ( nome: string, descricao: string, nivel: number, setor?: string, editavel?: boolean ) => { const existing = await ctx.db .query('roles') .withIndex('by_nome', (q) => q.eq('nome', nome)) .first(); if (existing) { console.log(` ℹ️ Role já existe: ${nome}`); return existing._id; } const id = await ctx.db.insert('roles', { nome, descricao, nivel, setor, customizado: false, editavel }); console.log(` ✅ Role criada: ${nome}`); return id; }; // Níveis agora são apenas 0 e 1. // 0 = máximo, 1 = administrativo (ambos com acesso total). await ensureRole('ti_master', 'TI Master', 0, 'ti', false); await ensureRole('admin', 'Administrador Geral', 1, 'administrativo', true); await ensureRole('ti_usuario', 'TI Usuário', 1, 'ti', true); await ensureRole('rh', 'Recursos Humanos', 1, 'recursos_humanos', false); await ensureRole('financeiro', 'Financeiro', 1, 'financeiro', false); await ensureRole('usuario', 'Usuário Padrão', 1, undefined, false); // Encadeia próximas etapas await ctx.scheduler.runAfter(0, internal.seed.seedCreateSimbolos, {}); await ctx.scheduler.runAfter(0, internal.seed.seedCreatePermissoesBase, {}); return null; } }); export const seedCreatePermissoesBase = internalMutation({ args: {}, returns: v.null(), handler: async (ctx) => { console.log('🔐 Criando permissões base...'); await ctx.runMutation(api.permissoesAcoes.seedPermissoesBase, {}); return null; } }); export const seedCreateSimbolos = internalMutation({ args: {}, returns: v.null(), handler: async (ctx) => { console.log('💰 Criando símbolos...'); const existentes = await ctx.db.query('simbolos').collect(); const nomesExistentes = new Set(existentes.map((s) => s.nome)); for (const simbolo of simbolosData) { if (nomesExistentes.has(simbolo.nome)) { console.log(` ℹ️ Símbolo já existe: ${simbolo.nome}`); continue; } await ctx.db.insert('simbolos', { nome: simbolo.nome, descricao: simbolo.descricao, tipo: simbolo.tipo, valor: simbolo.valor, repValor: simbolo.repValor || '', vencValor: simbolo.vencValor || '' }); console.log(` ✅ Símbolo criado: ${simbolo.nome}`); } // Encadeia próxima etapa await ctx.scheduler.runAfter(0, internal.seed.seedCreateFuncionarios, {}); return null; } }); export const seedCreateFuncionarios = internalMutation({ args: {}, returns: v.null(), handler: async (ctx) => { console.log('👥 Criando funcionários...'); const simbolos = await ctx.db.query('simbolos').collect(); const simbolosMap = new Map>(); for (const s of simbolos) { simbolosMap.set(s.nome, s._id as Id<'simbolos'>); } for (const funcionario of funcionariosData) { // Evitar duplicar por CPF const existente = await ctx.db .query('funcionarios') .withIndex('by_cpf', (q) => q.eq('cpf', funcionario.cpf)) .first(); if (existente) { console.log(` ℹ️ Funcionário já existe (CPF ${funcionario.cpf}): ${existente.nome}`); continue; } const simboloId = simbolosMap.get(funcionario.simboloNome); if (!simboloId) { console.log(` ❌ Símbolo não encontrado: ${funcionario.simboloNome}`); continue; } await ctx.db.insert('funcionarios', { admissaoData: funcionario.admissaoData, cep: funcionario.cep, cidade: funcionario.cidade, cpf: funcionario.cpf, email: funcionario.email, endereco: funcionario.endereco, matricula: funcionario.matricula, nascimento: funcionario.nascimento, nome: funcionario.nome, rg: funcionario.rg, simboloId: simboloId as Id<'simbolos'>, simboloTipo: funcionario.simboloTipo, telefone: funcionario.telefone, uf: funcionario.uf }); console.log(` ✅ Funcionário criado: ${funcionario.nome}`); } // Encadeia próxima etapa await ctx.scheduler.runAfter(0, internal.seed.seedCreateUsuariosParaFuncionarios, {}); return null; } }); export const seedCreateUsuariosParaFuncionarios = internalMutation({ args: {}, returns: v.null(), handler: async (ctx) => { console.log('👤 Criando usuários para funcionários...'); // Agenda criação por funcionário para evitar timeout let delay = 0; for (const funcionario of funcionariosData) { await ctx.scheduler.runAfter(delay, internal.seed.seedCreateUsuarioParaFuncionario, { matricula: funcionario.matricula, nome: funcionario.nome, email: funcionario.email }); delay += 50; } // Agenda próxima etapa após as criações individuais await ctx.scheduler.runAfter(delay + 300, internal.seed.seedInserirSolicitacoesAcesso, {}); return null; } }); export const seedCreateUsuarioParaFuncionario = internalMutation({ args: { matricula: v.string(), nome: v.string(), email: v.string() }, returns: v.null(), handler: async (ctx, args) => { // Role "usuario" const roleUsuario = await ctx.db .query('roles') .withIndex('by_nome', (q) => q.eq('nome', 'usuario')) .first(); if (!roleUsuario) { console.log(' ❌ Role "usuario" não encontrada'); return null; } const funcionarioDoc = await ctx.db .query('funcionarios') .withIndex('by_matricula', (q) => q.eq('matricula', args.matricula)) .first(); if (!funcionarioDoc) { console.log(` ❌ Funcionário não encontrado pela matrícula: ${args.matricula}`); return null; } const usuarioExistente = await ctx.db .query('usuarios') .withIndex('by_email', (q) => q.eq('email', args.email)) .first(); if (usuarioExistente) { console.log(` ℹ️ Usuário já existe para ${args.email}`); return null; } const authUserId = await createAuthUser(ctx, { nome: args.nome, email: args.email, password: 'Mudar@123' }); await ctx.db.insert('usuarios', { authId: authUserId, nome: args.nome, email: args.email, funcionarioId: funcionarioDoc._id as Id<'funcionarios'>, roleId: roleUsuario._id, ativo: true, primeiroAcesso: true, criadoEm: Date.now(), atualizadoEm: Date.now() }); console.log(` ✅ Usuário criado: ${args.nome} (senha: Mudar@123)`); return null; } }); export const seedInserirSolicitacoesAcesso = internalMutation({ args: {}, returns: v.null(), handler: async (ctx) => { console.log('📋 Inserindo solicitações de acesso...'); for (const solicitacao of solicitacoesAcessoData) { // Evitar duplicidade por matrícula const existente = await ctx.db .query('solicitacoesAcesso') .withIndex('by_matricula', (q) => q.eq('matricula', solicitacao.matricula)) .first(); if (existente) { console.log(` ℹ️ Solicitação já existe p/ matrícula ${solicitacao.matricula}`); continue; } const dadosSolicitacao: { nome: string; matricula: string; email: string; telefone: string; status: 'pendente' | 'aprovado' | 'rejeitado'; dataSolicitacao: number; dataResposta?: number; observacoes?: string; } = { nome: solicitacao.nome, matricula: solicitacao.matricula, email: solicitacao.email, telefone: solicitacao.telefone, status: solicitacao.status, dataSolicitacao: solicitacao.dataSolicitacao }; if (solicitacao.dataResposta) { dadosSolicitacao.dataResposta = solicitacao.dataResposta; } if (solicitacao.observacoes) { dadosSolicitacao.observacoes = solicitacao.observacoes; } await ctx.db.insert('solicitacoesAcesso', dadosSolicitacao); console.log(` ✅ Solicitação criada: ${solicitacao.nome} (${solicitacao.status})`); } console.log('✨ Seed concluído!'); return null; } }); export const seedDatabase = internalAction({ args: {}, returns: v.null(), handler: async (ctx) => { console.log('🌱 Iniciando seed do banco de dados (action)...'); await ctx.runMutation(internal.seed.seedCreateRoles, {}); await ctx.runMutation(internal.seed.seedCreateSimbolos, {}); await ctx.runMutation(internal.seed.seedCreateFuncionarios, {}); await ctx.runMutation(internal.seed.seedCreateUsuariosParaFuncionarios, {}); await ctx.runMutation(internal.seed.seedInserirSolicitacoesAcesso, {}); console.log('✨ Seed do banco de dados concluído com sucesso pela action!'); return null; } }); /** * Mutation pública para popular o banco de dados com os dados de seed * Permite executar via CLI: `npx convex run seed:popularBanco` */ export const popularBanco = mutation({ args: {}, returns: v.null(), handler: async (ctx) => { console.log('🌱 Executando popularBanco (wrapper público para seedDatabase)...'); // Agenda apenas a primeira etapa; as demais serão encadeadas internamente await ctx.scheduler.runAfter(0, internal.seed.seedCreateRoles, {}); console.log('✅ Seed iniciado (etapa 1 agendada)'); return null; } }); /** * Limpar todos os dados do banco */ export const clearDatabase = internalMutation({ args: {}, returns: v.null(), handler: async (ctx) => { console.log('🗑️ Limpando banco de dados...'); // Limpar em ordem (respeitando dependências) // 1. Tabelas de logs e auditoria const logsAcesso = await ctx.db.query('logsAcesso').collect(); for (const log of logsAcesso) { await ctx.db.delete(log._id); } console.log(` ✅ ${logsAcesso.length} logs de acesso removidos`); const logsLogin = await ctx.db.query('logsLogin').collect(); for (const log of logsLogin) { await ctx.db.delete(log._id); } console.log(` ✅ ${logsLogin.length} logs de login removidos`); const logsAtividades = await ctx.db.query('logsAtividades').collect(); for (const log of logsAtividades) { await ctx.db.delete(log._id); } console.log(` ✅ ${logsAtividades.length} logs de atividades removidos`); // 2. Sistema de chat const leituras = await ctx.db.query('leituras').collect(); for (const leitura of leituras) { await ctx.db.delete(leitura._id); } console.log(` ✅ ${leituras.length} leituras removidas`); const mensagens = await ctx.db.query('mensagens').collect(); for (const mensagem of mensagens) { await ctx.db.delete(mensagem._id); } console.log(` ✅ ${mensagens.length} mensagens removidas`); const digitando = await ctx.db.query('digitando').collect(); for (const d of digitando) { await ctx.db.delete(d._id); } console.log(` ✅ ${digitando.length} registros de digitando removidos`); const conversas = await ctx.db.query('conversas').collect(); for (const conversa of conversas) { await ctx.db.delete(conversa._id); } console.log(` ✅ ${conversas.length} conversas removidas`); // 3. Notificações const notificacoes = await ctx.db.query('notificacoes').collect(); for (const notificacao of notificacoes) { await ctx.db.delete(notificacao._id); } console.log(` ✅ ${notificacoes.length} notificações removidas`); const notificacoesEmail = await ctx.db.query('notificacoesEmail').collect(); for (const email of notificacoesEmail) { await ctx.db.delete(email._id); } console.log(` ✅ ${notificacoesEmail.length} notificações de email removidas`); const notificacoesFerias = await ctx.db.query('notificacoesFerias').collect(); for (const notif of notificacoesFerias) { await ctx.db.delete(notif._id); } console.log(` ✅ ${notificacoesFerias.length} notificações de férias removidas`); // 4. Férias const ferias = await ctx.db.query('ferias').collect(); for (const feriasRegistro of ferias) { await ctx.db.delete(feriasRegistro._id); } console.log(` ✅ ${ferias.length} registros de férias removidos`); // 5. Atestados const atestados = await ctx.db.query('atestados').collect(); for (const atestado of atestados) { await ctx.db.delete(atestado._id); } console.log(` ✅ ${atestados.length} atestados removidos`); // 6. Times e membros const timesMembros = await ctx.db.query('timesMembros').collect(); for (const membro of timesMembros) { await ctx.db.delete(membro._id); } console.log(` ✅ ${timesMembros.length} membros de times removidos`); const times = await ctx.db.query('times').collect(); for (const time of times) { await ctx.db.delete(time._id); } console.log(` ✅ ${times.length} times removidos`); // 7. Cursos const cursos = await ctx.db.query('cursos').collect(); for (const curso of cursos) { await ctx.db.delete(curso._id); } console.log(` ✅ ${cursos.length} cursos removidos`); // 8. Bloqueios de usuários const bloqueiosUsuarios = await ctx.db.query('bloqueiosUsuarios').collect(); for (const bloqueio of bloqueiosUsuarios) { await ctx.db.delete(bloqueio._id); } console.log(` ✅ ${bloqueiosUsuarios.length} bloqueios de usuários removidos`); // 9. Perfis customizados // 10. Templates de mensagens const templatesMensagens = await ctx.db.query('templatesMensagens').collect(); for (const template of templatesMensagens) { await ctx.db.delete(template._id); } console.log(` ✅ ${templatesMensagens.length} templates de mensagens removidos`); // 11. Configurações const configuracaoEmail = await ctx.db.query('configuracaoEmail').collect(); for (const config of configuracaoEmail) { await ctx.db.delete(config._id); } console.log(` ✅ ${configuracaoEmail.length} configurações de email removidas`); const configuracaoAcesso = await ctx.db.query('configuracaoAcesso').collect(); for (const config of configuracaoAcesso) { await ctx.db.delete(config._id); } console.log(` ✅ ${configuracaoAcesso.length} configurações de acesso removidas`); // 12. Monitoramento const alertHistory = await ctx.db.query('alertHistory').collect(); for (const alert of alertHistory) { await ctx.db.delete(alert._id); } console.log(` ✅ ${alertHistory.length} histórico de alertas removido`); const alertConfigurations = await ctx.db.query('alertConfigurations').collect(); for (const alert of alertConfigurations) { await ctx.db.delete(alert._id); } console.log(` ✅ ${alertConfigurations.length} configurações de alertas removidas`); const systemMetrics = await ctx.db.query('systemMetrics').collect(); for (const metric of systemMetrics) { await ctx.db.delete(metric._id); } console.log(` ✅ ${systemMetrics.length} métricas do sistema removidas`); // 13. Sessões const sessoes = await ctx.db.query('sessoes').collect(); for (const sessao of sessoes) { await ctx.db.delete(sessao._id); } console.log(` ✅ ${sessoes.length} sessões removidas`); // 14. Menu-permissões personalizadas // 15. Menu-permissões // 16. Role-permissões const rolePermissoes = await ctx.db.query('rolePermissoes').collect(); for (const rp of rolePermissoes) { await ctx.db.delete(rp._id); } console.log(` ✅ ${rolePermissoes.length} role-permissões removidas`); // 17. Permissões const permissoes = await ctx.db.query('permissoes').collect(); for (const permissao of permissoes) { await ctx.db.delete(permissao._id); } console.log(` ✅ ${permissoes.length} permissões removidas`); // 18. Usuários (deve vir antes de roles se houver referência) const usuarios = await ctx.db.query('usuarios').collect(); for (const usuario of usuarios) { await ctx.db.delete(usuario._id); } console.log(` ✅ ${usuarios.length} usuários removidos`); // 19. Funcionários const funcionarios = await ctx.db.query('funcionarios').collect(); for (const funcionario of funcionarios) { await ctx.db.delete(funcionario._id); } console.log(` ✅ ${funcionarios.length} funcionários removidos`); // 20. Solicitações de acesso const solicitacoesAcesso = await ctx.db.query('solicitacoesAcesso').collect(); for (const solicitacao of solicitacoesAcesso) { await ctx.db.delete(solicitacao._id); } console.log(` ✅ ${solicitacoesAcesso.length} solicitações de acesso removidas`); // 21. Símbolos const simbolos = await ctx.db.query('simbolos').collect(); for (const simbolo of simbolos) { await ctx.db.delete(simbolo._id); } console.log(` ✅ ${simbolos.length} símbolos removidos`); // 22. Roles (deve vir por último se outras tabelas referenciam) const roles = await ctx.db.query('roles').collect(); for (const role of roles) { await ctx.db.delete(role._id); } console.log(` ✅ ${roles.length} roles removidas`); // 23. Todos (tabela de exemplo) const todos = await ctx.db.query('todos').collect(); for (const todo of todos) { await ctx.db.delete(todo._id); } console.log(` ✅ ${todos.length} todos removidos`); console.log('✨ Banco de dados completamente limpo!'); return null; } }); /** * Mutation pública para limpar o banco de dados (para uso via CLI) * ATENÇÃO: Esta função deleta TODOS os dados do banco! */ export const limparBanco = mutation({ args: {}, returns: v.null(), handler: async (ctx) => { // Executa diretamente a limpeza (mesmo código da internalMutation) console.log('🗑️ Limpando banco de dados...'); // Limpar em ordem (respeitando dependências) // 1. Tabelas de logs e auditoria const logsAcesso = await ctx.db.query('logsAcesso').collect(); for (const log of logsAcesso) { await ctx.db.delete(log._id); } console.log(` ✅ ${logsAcesso.length} logs de acesso removidos`); const logsLogin = await ctx.db.query('logsLogin').collect(); for (const log of logsLogin) { await ctx.db.delete(log._id); } console.log(` ✅ ${logsLogin.length} logs de login removidos`); const logsAtividades = await ctx.db.query('logsAtividades').collect(); for (const log of logsAtividades) { await ctx.db.delete(log._id); } console.log(` ✅ ${logsAtividades.length} logs de atividades removidos`); // 2. Sistema de chat const leituras = await ctx.db.query('leituras').collect(); for (const leitura of leituras) { await ctx.db.delete(leitura._id); } console.log(` ✅ ${leituras.length} leituras removidas`); const mensagens = await ctx.db.query('mensagens').collect(); for (const mensagem of mensagens) { await ctx.db.delete(mensagem._id); } console.log(` ✅ ${mensagens.length} mensagens removidas`); const digitando = await ctx.db.query('digitando').collect(); for (const d of digitando) { await ctx.db.delete(d._id); } console.log(` ✅ ${digitando.length} registros de digitando removidos`); const conversas = await ctx.db.query('conversas').collect(); for (const conversa of conversas) { await ctx.db.delete(conversa._id); } console.log(` ✅ ${conversas.length} conversas removidas`); // 3. Notificações const notificacoes = await ctx.db.query('notificacoes').collect(); for (const notificacao of notificacoes) { await ctx.db.delete(notificacao._id); } console.log(` ✅ ${notificacoes.length} notificações removidas`); const notificacoesEmail = await ctx.db.query('notificacoesEmail').collect(); for (const email of notificacoesEmail) { await ctx.db.delete(email._id); } console.log(` ✅ ${notificacoesEmail.length} notificações de email removidas`); const notificacoesFerias = await ctx.db.query('notificacoesFerias').collect(); for (const notif of notificacoesFerias) { await ctx.db.delete(notif._id); } console.log(` ✅ ${notificacoesFerias.length} notificações de férias removidas`); // 4. Férias const ferias = await ctx.db.query('ferias').collect(); for (const feriasRegistro of ferias) { await ctx.db.delete(feriasRegistro._id); } console.log(` ✅ ${ferias.length} registros de férias removidos`); // 5. Atestados const atestados = await ctx.db.query('atestados').collect(); for (const atestado of atestados) { await ctx.db.delete(atestado._id); } console.log(` ✅ ${atestados.length} atestados removidos`); // 6. Times e membros const timesMembros = await ctx.db.query('timesMembros').collect(); for (const membro of timesMembros) { await ctx.db.delete(membro._id); } console.log(` ✅ ${timesMembros.length} membros de times removidos`); const times = await ctx.db.query('times').collect(); for (const time of times) { await ctx.db.delete(time._id); } console.log(` ✅ ${times.length} times removidos`); // 7. Cursos const cursos = await ctx.db.query('cursos').collect(); for (const curso of cursos) { await ctx.db.delete(curso._id); } console.log(` ✅ ${cursos.length} cursos removidos`); // 8. Bloqueios de usuários const bloqueiosUsuarios = await ctx.db.query('bloqueiosUsuarios').collect(); for (const bloqueio of bloqueiosUsuarios) { await ctx.db.delete(bloqueio._id); } console.log(` ✅ ${bloqueiosUsuarios.length} bloqueios de usuários removidos`); // 9. Perfis customizados (já está no código da internalMutation mas vazio) // 10. Templates de mensagens const templatesMensagens = await ctx.db.query('templatesMensagens').collect(); for (const template of templatesMensagens) { await ctx.db.delete(template._id); } console.log(` ✅ ${templatesMensagens.length} templates de mensagens removidos`); // 11. Configurações const configuracaoEmail = await ctx.db.query('configuracaoEmail').collect(); for (const config of configuracaoEmail) { await ctx.db.delete(config._id); } console.log(` ✅ ${configuracaoEmail.length} configurações de email removidas`); const configuracaoAcesso = await ctx.db.query('configuracaoAcesso').collect(); for (const config of configuracaoAcesso) { await ctx.db.delete(config._id); } console.log(` ✅ ${configuracaoAcesso.length} configurações de acesso removidas`); // 12. Monitoramento const alertHistory = await ctx.db.query('alertHistory').collect(); for (const alert of alertHistory) { await ctx.db.delete(alert._id); } console.log(` ✅ ${alertHistory.length} histórico de alertas removido`); const alertConfigurations = await ctx.db.query('alertConfigurations').collect(); for (const alert of alertConfigurations) { await ctx.db.delete(alert._id); } console.log(` ✅ ${alertConfigurations.length} configurações de alertas removidas`); const systemMetrics = await ctx.db.query('systemMetrics').collect(); for (const metric of systemMetrics) { await ctx.db.delete(metric._id); } console.log(` ✅ ${systemMetrics.length} métricas do sistema removidas`); // 13. Sessões const sessoes = await ctx.db.query('sessoes').collect(); for (const sessao of sessoes) { await ctx.db.delete(sessao._id); } console.log(` ✅ ${sessoes.length} sessões removidas`); // 14. Menu-permissões personalizadas (já está no código da internalMutation mas vazio) // 15. Menu-permissões (já está no código da internalMutation mas vazio) // 16. Role-permissões const rolePermissoes = await ctx.db.query('rolePermissoes').collect(); for (const rp of rolePermissoes) { await ctx.db.delete(rp._id); } console.log(` ✅ ${rolePermissoes.length} role-permissões removidas`); // 17. Permissões const permissoes = await ctx.db.query('permissoes').collect(); for (const permissao of permissoes) { await ctx.db.delete(permissao._id); } console.log(` ✅ ${permissoes.length} permissões removidas`); // 18. Usuários (deve vir antes de roles se houver referência) const usuarios = await ctx.db.query('usuarios').collect(); for (const usuario of usuarios) { await ctx.db.delete(usuario._id); } console.log(` ✅ ${usuarios.length} usuários removidos`); // 19. Funcionários const funcionarios = await ctx.db.query('funcionarios').collect(); for (const funcionario of funcionarios) { await ctx.db.delete(funcionario._id); } console.log(` ✅ ${funcionarios.length} funcionários removidos`); // 20. Solicitações de acesso const solicitacoesAcesso = await ctx.db.query('solicitacoesAcesso').collect(); for (const solicitacao of solicitacoesAcesso) { await ctx.db.delete(solicitacao._id); } console.log(` ✅ ${solicitacoesAcesso.length} solicitações de acesso removidas`); // 21. Símbolos const simbolos = await ctx.db.query('simbolos').collect(); for (const simbolo of simbolos) { await ctx.db.delete(simbolo._id); } console.log(` ✅ ${simbolos.length} símbolos removidos`); // 22. Roles (deve vir por último se outras tabelas referenciam) const roles = await ctx.db.query('roles').collect(); for (const role of roles) { await ctx.db.delete(role._id); } console.log(` ✅ ${roles.length} roles removidas`); // 23. Todos (tabela de exemplo) const todos = await ctx.db.query('todos').collect(); for (const todo of todos) { await ctx.db.delete(todo._id); } console.log(` ✅ ${todos.length} todos removidos`); console.log('✨ Banco de dados completamente limpo!'); return null; } }); /** * Query para verificar quantos registros existem no banco */ export const verificarBanco = query({ args: {}, returns: v.object({ usuarios: v.number(), funcionarios: v.number(), roles: v.number(), simbolos: v.number(), total: v.number() }), handler: async (ctx) => { const usuarios = await ctx.db.query('usuarios').collect(); const funcionarios = await ctx.db.query('funcionarios').collect(); const roles = await ctx.db.query('roles').collect(); const simbolos = await ctx.db.query('simbolos').collect(); return { usuarios: usuarios.length, funcionarios: funcionarios.length, roles: roles.length, simbolos: simbolos.length, total: usuarios.length + funcionarios.length + roles.length + simbolos.length }; } });