869 lines
27 KiB
TypeScript
869 lines
27 KiB
TypeScript
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'
|
||
}
|
||
];
|
||
|
||
/**
|
||
* 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
|
||
};
|
||
}
|
||
});
|