import { action, internalAction, internalMutation, mutation, query, } from "./_generated/server"; import { internal } 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; }; await ensureRole("ti_master", "TI Master", 0, "ti", false); await ensureRole("admin", "Administrador Geral", 2, "administrativo", true); await ensureRole("ti_usuario", "TI Usuário", 2, "ti", true); await ensureRole("rh", "Recursos Humanos", 2, "recursos_humanos", false); await ensureRole("financeiro", "Financeiro", 2, "financeiro", false); await ensureRole("usuario", "Usuário Padrão", 3, undefined, false); // Encadeia próxima etapa await ctx.scheduler.runAfter(0, internal.seed.seedCreateSimbolos, {}); 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, }; }, });