Files
sgse-app/packages/backend/convex/seed.ts

869 lines
27 KiB
TypeScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { v } from 'convex/values';
import { api, internal } from './_generated/api';
// import { hashPassword } from './auth/utils';
import type { Id } from './_generated/dataModel';
import { internalAction, internalMutation, mutation, query } from './_generated/server';
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'
}
];
/**
* 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<string, Id<'simbolos'>>();
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;
}
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 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, {});
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`);
// 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`);
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`);
// 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`);
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
};
}
});