- Deleted the `autenticacao.ts` file to streamline the authentication process. - Updated the `auth.ts` file to include new functions for user management and password updates. - Modified the schema to enforce the presence of `authId` for users, ensuring integration with Better Auth. - Refactored the seed process to create users with Better Auth integration, enhancing user management capabilities. - Cleaned up the `usuarios.ts` file to utilize the new authentication functions and improve code clarity.
1068 lines
32 KiB
TypeScript
1068 lines
32 KiB
TypeScript
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<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;
|
||
}
|
||
// 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 e períodos aquisitivos
|
||
const solicitacoesFerias = await ctx.db
|
||
.query("solicitacoesFerias")
|
||
.collect();
|
||
for (const solicitacao of solicitacoesFerias) {
|
||
await ctx.db.delete(solicitacao._id);
|
||
}
|
||
console.log(
|
||
` ✅ ${solicitacoesFerias.length} solicitações de férias removidas`
|
||
);
|
||
|
||
const periodosAquisitivos = await ctx.db
|
||
.query("periodosAquisitivos")
|
||
.collect();
|
||
for (const periodo of periodosAquisitivos) {
|
||
await ctx.db.delete(periodo._id);
|
||
}
|
||
console.log(
|
||
` ✅ ${periodosAquisitivos.length} períodos aquisitivos 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 e períodos aquisitivos
|
||
const solicitacoesFerias = await ctx.db
|
||
.query("solicitacoesFerias")
|
||
.collect();
|
||
for (const solicitacao of solicitacoesFerias) {
|
||
await ctx.db.delete(solicitacao._id);
|
||
}
|
||
console.log(
|
||
` ✅ ${solicitacoesFerias.length} solicitações de férias removidas`
|
||
);
|
||
|
||
const periodosAquisitivos = await ctx.db
|
||
.query("periodosAquisitivos")
|
||
.collect();
|
||
for (const periodo of periodosAquisitivos) {
|
||
await ctx.db.delete(periodo._id);
|
||
}
|
||
console.log(
|
||
` ✅ ${periodosAquisitivos.length} períodos aquisitivos 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,
|
||
};
|
||
},
|
||
});
|