fix: improve role assignment logic and permission handling in dashboard components

This commit is contained in:
2025-10-27 08:41:53 -03:00
parent 2c2b792b4a
commit 6bfc0c2ced
19 changed files with 2105 additions and 118 deletions

View File

@@ -19,7 +19,6 @@ import type * as dashboard from "../dashboard.js";
import type * as funcionarios from "../funcionarios.js";
import type * as healthCheck from "../healthCheck.js";
import type * as http from "../http.js";
import type * as inicializarPermissoes from "../inicializarPermissoes.js";
import type * as logsAcesso from "../logsAcesso.js";
import type * as menuPermissoes from "../menuPermissoes.js";
import type * as monitoramento from "../monitoramento.js";
@@ -56,7 +55,6 @@ declare const fullApi: ApiFromModules<{
funcionarios: typeof funcionarios;
healthCheck: typeof healthCheck;
http: typeof http;
inicializarPermissoes: typeof inicializarPermissoes;
logsAcesso: typeof logsAcesso;
menuPermissoes: typeof menuPermissoes;
monitoramento: typeof monitoramento;

View File

@@ -6,7 +6,9 @@ import { query } from "./_generated/server";
import { betterAuth } from "better-auth";
import schema from "./betterAuth/schema";
const siteUrl = process.env.SITE_URL!;
// Configurações de ambiente para produção
const siteUrl = process.env.SITE_URL || process.env.CONVEX_SITE_URL || "http://localhost:5173";
const authSecret = process.env.BETTER_AUTH_SECRET;
// The component client has methods needed for integrating Convex with Better Auth,
// as well as helper methods for general use.
@@ -21,6 +23,8 @@ export const createAuth = (
{ optionsOnly } = { optionsOnly: false }
) => {
return betterAuth({
// Secret para criptografia de tokens - OBRIGATÓRIO em produção
secret: authSecret,
// disable logging when createAuth is called just to generate options.
// this is not required, but there's a lot of noise in logs without it.
logger: {

View File

@@ -1,76 +0,0 @@
/**
* Script para inicializar permissões de menu no sistema
*/
import { mutation } from "./_generated/server";
export const inicializarTodasPermissoes = mutation({
args: {},
handler: async (ctx) => {
console.log("🔐 Inicializando permissões de menu...");
// Buscar roles
const roles = await ctx.db.query("roles").collect();
const admin = roles.find((r) => r.nome === "admin");
const ti = roles.find((r) => r.nome === "ti");
const usuarioAvancado = roles.find((r) => r.nome === "usuario_avancado");
const usuario = roles.find((r) => r.nome === "usuario");
if (!admin || !ti || !usuarioAvancado || !usuario) {
throw new Error("Roles não encontradas");
}
// Menus do sistema
const menus = [
"/recursos-humanos",
"/recursos-humanos/funcionarios",
"/recursos-humanos/simbolos",
"/financeiro",
"/controladoria",
"/licitacoes",
"/compras",
"/juridico",
"/comunicacao",
"/programas-esportivos",
"/secretaria-executiva",
"/gestao-pessoas",
"/ti",
];
let contador = 0;
// Admin e TI: acesso total é automático no código, não precisa criar permissões
// Eles são filtrados no verificarAcesso (nivel <= 1)
// Usuario Avançado: SEM acesso por padrão (TI define depois)
for (const menu of menus) {
await ctx.db.insert("menuPermissoes", {
roleId: usuarioAvancado._id,
menuPath: menu,
podeAcessar: false,
podeConsultar: false,
podeGravar: false,
});
contador++;
}
console.log(`${contador} permissões criadas para usuario_avancado`);
// Usuario: SEM acesso por padrão (TI define depois)
contador = 0;
for (const menu of menus) {
await ctx.db.insert("menuPermissoes", {
roleId: usuario._id,
menuPath: menu,
podeAcessar: false,
podeConsultar: false,
podeGravar: false,
});
contador++;
}
console.log(`${contador} permissões criadas para usuario`);
console.log("✅ Permissões inicializadas com sucesso!");
return { success: true, message: "Permissões inicializadas" };
},
});

View File

@@ -9,6 +9,7 @@ export const listar = query({
returns: v.array(
v.object({
_id: v.id("roles"),
_creationTime: v.number(),
nome: v.string(),
descricao: v.string(),
nivel: v.number(),