feat: implement advanced access control system with user blocking, rate limiting, and enhanced login security; update UI components for improved user experience and documentation
This commit is contained in:
@@ -191,52 +191,184 @@ export const seedDatabase = internalMutation({
|
||||
handler: async (ctx) => {
|
||||
console.log("🌱 Iniciando seed do banco de dados...");
|
||||
|
||||
// 1. Criar Roles
|
||||
// 1. Criar Roles (Perfis de Acesso)
|
||||
console.log("🔐 Criando roles...");
|
||||
// TI_MASTER - Nível 0 - Acesso total irrestrito
|
||||
const roleTIMaster = await ctx.db.insert("roles", {
|
||||
nome: "ti_master",
|
||||
descricao: "TI Master",
|
||||
nivel: 0,
|
||||
setor: "ti",
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: ti_master (Nível 0 - Acesso Total)");
|
||||
|
||||
// ADMIN - Nível 2 - Permissões configuráveis
|
||||
const roleAdmin = await ctx.db.insert("roles", {
|
||||
nome: "admin",
|
||||
descricao: "Administrador do Sistema",
|
||||
nivel: 0,
|
||||
});
|
||||
console.log(" ✅ Role criada: admin");
|
||||
|
||||
const roleTI = await ctx.db.insert("roles", {
|
||||
nome: "ti",
|
||||
descricao: "Tecnologia da Informação",
|
||||
nivel: 1,
|
||||
setor: "ti",
|
||||
});
|
||||
console.log(" ✅ Role criada: ti");
|
||||
|
||||
const roleUsuarioAvancado = await ctx.db.insert("roles", {
|
||||
nome: "usuario_avancado",
|
||||
descricao: "Usuário Avançado",
|
||||
descricao: "Administrador Geral",
|
||||
nivel: 2,
|
||||
setor: "administrativo",
|
||||
customizado: false,
|
||||
editavel: true, // Permissões configuráveis
|
||||
});
|
||||
console.log(" ✅ Role criada: usuario_avancado");
|
||||
console.log(" ✅ Role criada: admin (Nível 2 - Configurável)");
|
||||
|
||||
// TI_USUARIO - Nível 2 - Suporte técnico
|
||||
const roleTIUsuario = await ctx.db.insert("roles", {
|
||||
nome: "ti_usuario",
|
||||
descricao: "TI Usuário",
|
||||
nivel: 2,
|
||||
setor: "ti",
|
||||
customizado: false,
|
||||
editavel: true,
|
||||
});
|
||||
console.log(" ✅ Role criada: ti_usuario (Nível 2 - Suporte)");
|
||||
|
||||
const roleRH = await ctx.db.insert("roles", {
|
||||
nome: "rh",
|
||||
descricao: "Recursos Humanos",
|
||||
nivel: 2,
|
||||
setor: "recursos_humanos",
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: rh");
|
||||
|
||||
const roleFinanceiro = await ctx.db.insert("roles", {
|
||||
nome: "financeiro",
|
||||
descricao: "Financeiro",
|
||||
nivel: 2,
|
||||
setor: "financeiro",
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: financeiro");
|
||||
|
||||
const roleControladoria = await ctx.db.insert("roles", {
|
||||
nome: "controladoria",
|
||||
descricao: "Controladoria",
|
||||
nivel: 2,
|
||||
setor: "controladoria",
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: controladoria");
|
||||
|
||||
const roleLicitacoes = await ctx.db.insert("roles", {
|
||||
nome: "licitacoes",
|
||||
descricao: "Licitações",
|
||||
nivel: 2,
|
||||
setor: "licitacoes",
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: licitacoes");
|
||||
|
||||
const roleCompras = await ctx.db.insert("roles", {
|
||||
nome: "compras",
|
||||
descricao: "Compras",
|
||||
nivel: 2,
|
||||
setor: "compras",
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: compras");
|
||||
|
||||
const roleJuridico = await ctx.db.insert("roles", {
|
||||
nome: "juridico",
|
||||
descricao: "Jurídico",
|
||||
nivel: 2,
|
||||
setor: "juridico",
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: juridico");
|
||||
|
||||
const roleComunicacao = await ctx.db.insert("roles", {
|
||||
nome: "comunicacao",
|
||||
descricao: "Comunicação",
|
||||
nivel: 2,
|
||||
setor: "comunicacao",
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: comunicacao");
|
||||
|
||||
const roleProgramasEsportivos = await ctx.db.insert("roles", {
|
||||
nome: "programas_esportivos",
|
||||
descricao: "Programas Esportivos",
|
||||
nivel: 2,
|
||||
setor: "programas_esportivos",
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: programas_esportivos");
|
||||
|
||||
const roleSecretariaExecutiva = await ctx.db.insert("roles", {
|
||||
nome: "secretaria_executiva",
|
||||
descricao: "Secretaria Executiva",
|
||||
nivel: 2,
|
||||
setor: "secretaria_executiva",
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: secretaria_executiva");
|
||||
|
||||
const roleGestaoPessoas = await ctx.db.insert("roles", {
|
||||
nome: "gestao_pessoas",
|
||||
descricao: "Gestão de Pessoas",
|
||||
nivel: 2,
|
||||
setor: "gestao_pessoas",
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: gestao_pessoas");
|
||||
|
||||
const roleUsuario = await ctx.db.insert("roles", {
|
||||
nome: "usuario",
|
||||
descricao: "Usuário Comum",
|
||||
nivel: 3,
|
||||
nivel: 10,
|
||||
customizado: false,
|
||||
editavel: false,
|
||||
});
|
||||
console.log(" ✅ Role criada: usuario");
|
||||
|
||||
// 2. Criar usuário admin inicial
|
||||
console.log("👤 Criando usuário admin...");
|
||||
const senhaAdmin = await hashPassword("Admin@123");
|
||||
// 2. Criar usuários iniciais
|
||||
console.log("👤 Criando usuários iniciais...");
|
||||
|
||||
// TI Master
|
||||
const senhaTIMaster = await hashPassword("TI@123");
|
||||
await ctx.db.insert("usuarios", {
|
||||
matricula: "0000",
|
||||
matricula: "1000",
|
||||
senhaHash: senhaTIMaster,
|
||||
nome: "Gestor TI Master",
|
||||
email: "ti.master@sgse.pe.gov.br",
|
||||
setor: "ti",
|
||||
roleId: roleTIMaster as any,
|
||||
ativo: true,
|
||||
primeiroAcesso: false,
|
||||
criadoEm: Date.now(),
|
||||
atualizadoEm: Date.now(),
|
||||
});
|
||||
console.log(" ✅ TI Master criado (matrícula: 1000, senha: TI@123)");
|
||||
|
||||
// Admin (permissões configuráveis)
|
||||
const senhaAdmin = await hashPassword("Admin@123");
|
||||
const adminId = await ctx.db.insert("usuarios", {
|
||||
matricula: "2000",
|
||||
senhaHash: senhaAdmin,
|
||||
nome: "Administrador",
|
||||
nome: "Administrador Geral",
|
||||
email: "admin@sgse.pe.gov.br",
|
||||
setor: "administrativo",
|
||||
roleId: roleAdmin as any,
|
||||
ativo: true,
|
||||
primeiroAcesso: false,
|
||||
criadoEm: Date.now(),
|
||||
atualizadoEm: Date.now(),
|
||||
});
|
||||
console.log(" ✅ Usuário admin criado (matrícula: 0000, senha: Admin@123)");
|
||||
console.log(" ✅ Admin criado (matrícula: 2000, senha: Admin@123)");
|
||||
|
||||
// 3. Inserir símbolos
|
||||
console.log("📝 Inserindo símbolos...");
|
||||
@@ -323,10 +455,71 @@ export const seedDatabase = internalMutation({
|
||||
console.log(` ✅ Solicitação criada: ${solicitacao.nome}`);
|
||||
}
|
||||
|
||||
// 7. Criar templates de mensagens padrão
|
||||
console.log("📧 Criando templates de mensagens padrão...");
|
||||
const templatesPadrao = [
|
||||
{
|
||||
codigo: "USUARIO_BLOQUEADO",
|
||||
nome: "Usuário Bloqueado",
|
||||
titulo: "Sua conta foi bloqueada",
|
||||
corpo: "Sua conta no SGSE foi bloqueada.\\n\\nMotivo: {{motivo}}\\n\\nPara mais informações, entre em contato com a TI.",
|
||||
variaveis: ["motivo"],
|
||||
},
|
||||
{
|
||||
codigo: "USUARIO_DESBLOQUEADO",
|
||||
nome: "Usuário Desbloqueado",
|
||||
titulo: "Sua conta foi desbloqueada",
|
||||
corpo: "Sua conta no SGSE foi desbloqueada e você já pode acessar o sistema normalmente.",
|
||||
variaveis: [],
|
||||
},
|
||||
{
|
||||
codigo: "SENHA_RESETADA",
|
||||
nome: "Senha Resetada",
|
||||
titulo: "Sua senha foi resetada",
|
||||
corpo: "Sua senha foi resetada pela equipe de TI.\\n\\nNova senha temporária: {{senha}}\\n\\nPor favor, altere sua senha no próximo login.",
|
||||
variaveis: ["senha"],
|
||||
},
|
||||
{
|
||||
codigo: "PERMISSAO_ALTERADA",
|
||||
nome: "Permissão Alterada",
|
||||
titulo: "Suas permissões foram atualizadas",
|
||||
corpo: "Suas permissões de acesso ao sistema foram atualizadas.\\n\\nPara verificar suas novas permissões, acesse o menu de perfil.",
|
||||
variaveis: [],
|
||||
},
|
||||
{
|
||||
codigo: "AVISO_GERAL",
|
||||
nome: "Aviso Geral",
|
||||
titulo: "{{titulo}}",
|
||||
corpo: "{{mensagem}}",
|
||||
variaveis: ["titulo", "mensagem"],
|
||||
},
|
||||
{
|
||||
codigo: "BEM_VINDO",
|
||||
nome: "Boas-vindas",
|
||||
titulo: "Bem-vindo ao SGSE",
|
||||
corpo: "Olá {{nome}},\\n\\nSeja bem-vindo ao Sistema de Gestão da Secretaria de Esportes!\\n\\nSuas credenciais de acesso:\\nMatrícula: {{matricula}}\\nSenha temporária: {{senha}}\\n\\nPor favor, altere sua senha no primeiro acesso.\\n\\nEquipe de TI",
|
||||
variaveis: ["nome", "matricula", "senha"],
|
||||
},
|
||||
];
|
||||
|
||||
for (const template of templatesPadrao) {
|
||||
await ctx.db.insert("templatesMensagens", {
|
||||
codigo: template.codigo,
|
||||
nome: template.nome,
|
||||
tipo: "sistema" as const,
|
||||
titulo: template.titulo,
|
||||
corpo: template.corpo,
|
||||
variaveis: template.variaveis,
|
||||
criadoEm: Date.now(),
|
||||
});
|
||||
console.log(` ✅ Template criado: ${template.nome}`);
|
||||
}
|
||||
|
||||
console.log("✨ Seed concluído com sucesso!");
|
||||
console.log("");
|
||||
console.log("🔑 CREDENCIAIS DE ACESSO:");
|
||||
console.log(" Admin: matrícula 0000, senha Admin@123");
|
||||
console.log(" TI: matrícula 1000, senha TI@123");
|
||||
console.log(" Funcionários: usar matrícula, senha Mudar@123");
|
||||
return null;
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user