refactor: remove access request functionality and related components

- Deleted the solicitacoesAcesso route and its associated components to streamline the dashboard.
- Updated dashboard stats to remove references to access requests, ensuring accurate data representation.
- Refactored backend queries to eliminate access request data handling, enhancing performance and maintainability.
- Adjusted type definitions to reflect the removal of access request functionalities.
This commit is contained in:
2025-11-19 12:30:42 -03:00
parent c7fd824138
commit dac559d9fd
9 changed files with 4 additions and 1235 deletions

View File

@@ -47,7 +47,6 @@ import type * as saldoFerias from "../saldoFerias.js";
import type * as security from "../security.js";
import type * as seed from "../seed.js";
import type * as simbolos from "../simbolos.js";
import type * as solicitacoesAcesso from "../solicitacoesAcesso.js";
import type * as templatesMensagens from "../templatesMensagens.js";
import type * as times from "../times.js";
import type * as todos from "../todos.js";
@@ -101,7 +100,6 @@ declare const fullApi: ApiFromModules<{
security: typeof security;
seed: typeof seed;
simbolos: typeof simbolos;
solicitacoesAcesso: typeof solicitacoesAcesso;
templatesMensagens: typeof templatesMensagens;
times: typeof times;
todos: typeof todos;

View File

@@ -7,8 +7,6 @@ export const getStats = query({
returns: v.object({
totalFuncionarios: v.number(),
totalSimbolos: v.number(),
totalSolicitacoesAcesso: v.number(),
solicitacoesPendentes: v.number(),
funcionariosAtivos: v.number(),
funcionariosDesligados: v.number(),
cargoComissionado: v.number(),
@@ -42,19 +40,9 @@ export const getStats = query({
const simbolos = await ctx.db.query("simbolos").collect();
const totalSimbolos = simbolos.length;
// Contar solicitações de acesso
const solicitacoes = await ctx.db.query("solicitacoesAcesso").collect();
const totalSolicitacoesAcesso = solicitacoes.length;
const solicitacoesPendentes = solicitacoes.filter(
(s) => s.status === "pendente"
).length;
return {
totalFuncionarios,
totalSimbolos,
totalSolicitacoesAcesso,
solicitacoesPendentes,
funcionariosAtivos,
funcionariosDesligados,
cargoComissionado,
@@ -68,7 +56,6 @@ export const getRecentActivity = query({
args: {},
returns: v.object({
funcionariosCadastrados24h: v.number(),
solicitacoesAcesso24h: v.number(),
simbolosCadastrados24h: v.number(),
}),
handler: async (ctx) => {
@@ -81,11 +68,6 @@ export const getRecentActivity = query({
(f) => f._creationTime >= last24h
).length;
// Solicitações de acesso nas últimas 24h
const solicitacoes = await ctx.db.query("solicitacoesAcesso").collect();
const solicitacoesAcesso24h = solicitacoes.filter(
(s) => s.dataSolicitacao >= last24h
).length;
// Símbolos cadastrados nas últimas 24h
const simbolos = await ctx.db.query("simbolos").collect();
@@ -95,7 +77,6 @@ export const getRecentActivity = query({
return {
funcionariosCadastrados24h,
solicitacoesAcesso24h,
simbolosCadastrados24h,
};
},
@@ -137,15 +118,13 @@ export const getEvolucaoCadastros = query({
v.object({
mes: v.string(),
funcionarios: v.number(),
solicitacoes: v.number(),
})
),
handler: async (ctx) => {
const funcionarios = await ctx.db.query("funcionarios").collect();
const solicitacoes = await ctx.db.query("solicitacoesAcesso").collect();
const now = new Date();
const meses: Array<{ mes: string; funcionarios: number; solicitacoes: number }> = [];
const meses: Array<{ mes: string; funcionarios: number }> = [];
// Últimos 6 meses
for (let i = 5; i >= 0; i--) {
@@ -161,14 +140,9 @@ export const getEvolucaoCadastros = query({
(f) => f._creationTime >= date.getTime() && f._creationTime < nextDate.getTime()
).length;
const solCount = solicitacoes.filter(
(s) => s.dataSolicitacao >= date.getTime() && s.dataSolicitacao < nextDate.getTime()
).length;
meses.push({
mes: mesNome,
funcionarios: funcCount,
solicitacoes: solCount,
});
}

View File

@@ -594,12 +594,11 @@ export const getStatusSistema = query({
}
// Total de registros (estimativa baseada em tabelas principais)
const [usuarios, funcionarios, simbolos, solicitacoesAcesso, alertas, metricas] =
const [usuarios, funcionarios, simbolos, alertas, metricas] =
await Promise.all([
ctx.db.query('usuarios').collect(),
ctx.db.query('funcionarios').collect(),
ctx.db.query('simbolos').collect(),
ctx.db.query('solicitacoesAcesso').collect(),
ctx.db.query('alertConfigurations').collect(),
ctx.db.query('systemMetrics').take(100) // não precisa contar tudo
]);
@@ -607,7 +606,6 @@ export const getStatusSistema = query({
usuarios.length +
funcionarios.length +
simbolos.length +
solicitacoesAcesso.length +
alertas.length +
metricas.length;

View File

@@ -514,24 +514,6 @@ export default defineSchema({
valor: v.string(),
}),
solicitacoesAcesso: defineTable({
nome: v.string(),
matricula: v.string(),
email: v.string(),
telefone: v.string(),
status: v.union(
v.literal("pendente"),
v.literal("aprovado"),
v.literal("rejeitado")
),
dataSolicitacao: v.number(),
dataResposta: v.optional(v.number()),
observacoes: v.optional(v.string()),
})
.index("by_status", ["status"])
.index("by_matricula", ["matricula"])
.index("by_email", ["email"]),
// Sistema de Autenticação e Controle de Acesso
usuarios: defineTable({
authId: v.string(),

View File

@@ -164,27 +164,6 @@ const funcionariosData = [
}
];
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
*/
@@ -338,8 +317,6 @@ export const seedCreateUsuariosParaFuncionarios = internalMutation({
});
delay += 50;
}
// Agenda próxima etapa após as criações individuais
await ctx.scheduler.runAfter(delay + 300, internal.seed.seedInserirSolicitacoesAcesso, {});
return null;
}
});
@@ -402,55 +379,6 @@ export const seedCreateUsuarioParaFuncionario = internalMutation({
}
});
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(),
@@ -460,7 +388,6 @@ export const seedDatabase = internalAction({
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;
}
@@ -677,13 +604,6 @@ export const clearDatabase = internalMutation({
}
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) {
@@ -907,13 +827,6 @@ export const limparBanco = mutation({
}
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) {

View File

@@ -1,234 +0,0 @@
import { mutation, query } from "./_generated/server";
import { v } from "convex/values";
// Criar uma nova solicitação de acesso
export const create = mutation({
args: {
nome: v.string(),
matricula: v.string(),
email: v.string(),
telefone: v.string(),
},
returns: v.object({
solicitacaoId: v.id("solicitacoesAcesso"),
}),
handler: async (ctx, args) => {
// Verificar se já existe uma solicitação pendente com a mesma matrícula
const existingByMatricula = await ctx.db
.query("solicitacoesAcesso")
.withIndex("by_matricula", (q) => q.eq("matricula", args.matricula))
.filter((q) => q.eq(q.field("status"), "pendente"))
.first();
if (existingByMatricula) {
throw new Error("Já existe uma solicitação pendente para esta matrícula.");
}
// Verificar se já existe uma solicitação pendente com o mesmo email
const existingByEmail = await ctx.db
.query("solicitacoesAcesso")
.withIndex("by_email", (q) => q.eq("email", args.email))
.filter((q) => q.eq(q.field("status"), "pendente"))
.first();
if (existingByEmail) {
throw new Error("Já existe uma solicitação pendente para este e-mail.");
}
const solicitacaoId = await ctx.db.insert("solicitacoesAcesso", {
nome: args.nome,
matricula: args.matricula,
email: args.email,
telefone: args.telefone,
status: "pendente",
dataSolicitacao: Date.now(),
});
return { solicitacaoId };
},
});
// Listar todas as solicitações (para o painel administrativo)
export const getAll = query({
args: {},
returns: v.array(
v.object({
_id: v.id("solicitacoesAcesso"),
_creationTime: v.number(),
nome: v.string(),
matricula: v.string(),
email: v.string(),
telefone: v.string(),
status: v.union(
v.literal("pendente"),
v.literal("aprovado"),
v.literal("rejeitado")
),
dataSolicitacao: v.number(),
dataResposta: v.union(v.number(), v.null()),
observacoes: v.union(v.string(), v.null()),
})
),
handler: async (ctx) => {
const solicitacoes = await ctx.db
.query("solicitacoesAcesso")
.order("desc")
.collect();
return solicitacoes.map((s) => ({
_id: s._id,
_creationTime: s._creationTime,
nome: s.nome,
matricula: s.matricula,
email: s.email,
telefone: s.telefone,
status: s.status,
dataSolicitacao: s.dataSolicitacao,
dataResposta: s.dataResposta ?? null,
observacoes: s.observacoes ?? null,
}));
},
});
// Listar apenas solicitações pendentes
export const getPendentes = query({
args: {},
returns: v.array(
v.object({
_id: v.id("solicitacoesAcesso"),
_creationTime: v.number(),
nome: v.string(),
matricula: v.string(),
email: v.string(),
telefone: v.string(),
status: v.union(
v.literal("pendente"),
v.literal("aprovado"),
v.literal("rejeitado")
),
dataSolicitacao: v.number(),
dataResposta: v.union(v.number(), v.null()),
observacoes: v.union(v.string(), v.null()),
})
),
handler: async (ctx) => {
const solicitacoes = await ctx.db
.query("solicitacoesAcesso")
.withIndex("by_status", (q) => q.eq("status", "pendente"))
.order("desc")
.collect();
return solicitacoes.map((s) => ({
_id: s._id,
_creationTime: s._creationTime,
nome: s.nome,
matricula: s.matricula,
email: s.email,
telefone: s.telefone,
status: s.status,
dataSolicitacao: s.dataSolicitacao,
dataResposta: s.dataResposta ?? null,
observacoes: s.observacoes ?? null,
}));
},
});
// Aprovar uma solicitação
export const aprovar = mutation({
args: {
solicitacaoId: v.id("solicitacoesAcesso"),
observacoes: v.optional(v.string()),
},
returns: v.null(),
handler: async (ctx, args) => {
const solicitacao = await ctx.db.get(args.solicitacaoId);
if (!solicitacao) {
throw new Error("Solicitação não encontrada.");
}
if (solicitacao.status !== "pendente") {
throw new Error("Esta solicitação já foi processada.");
}
await ctx.db.patch(args.solicitacaoId, {
status: "aprovado",
dataResposta: Date.now(),
observacoes: args.observacoes,
});
return null;
},
});
// Rejeitar uma solicitação
export const rejeitar = mutation({
args: {
solicitacaoId: v.id("solicitacoesAcesso"),
observacoes: v.optional(v.string()),
},
returns: v.null(),
handler: async (ctx, args) => {
const solicitacao = await ctx.db.get(args.solicitacaoId);
if (!solicitacao) {
throw new Error("Solicitação não encontrada.");
}
if (solicitacao.status !== "pendente") {
throw new Error("Esta solicitação já foi processada.");
}
await ctx.db.patch(args.solicitacaoId, {
status: "rejeitado",
dataResposta: Date.now(),
observacoes: args.observacoes,
});
return null;
},
});
// Obter uma solicitação por ID
export const getById = query({
args: {
solicitacaoId: v.id("solicitacoesAcesso"),
},
returns: v.union(
v.object({
_id: v.id("solicitacoesAcesso"),
_creationTime: v.number(),
nome: v.string(),
matricula: v.string(),
email: v.string(),
telefone: v.string(),
status: v.union(
v.literal("pendente"),
v.literal("aprovado"),
v.literal("rejeitado")
),
dataSolicitacao: v.number(),
dataResposta: v.union(v.number(), v.null()),
observacoes: v.union(v.string(), v.null()),
}),
v.null()
),
handler: async (ctx, args) => {
const solicitacao = await ctx.db.get(args.solicitacaoId);
if (!solicitacao) {
return null;
}
return {
_id: solicitacao._id,
_creationTime: solicitacao._creationTime,
nome: solicitacao.nome,
matricula: solicitacao.matricula,
email: solicitacao.email,
telefone: solicitacao.telefone,
status: solicitacao.status,
dataSolicitacao: solicitacao.dataSolicitacao,
dataResposta: solicitacao.dataResposta ?? null,
observacoes: solicitacao.observacoes ?? null,
};
},
});