85 lines
2.6 KiB
TypeScript
85 lines
2.6 KiB
TypeScript
import { query } from './_generated/server';
|
|
import { getCurrentUserFunction } from './auth';
|
|
|
|
/**
|
|
* Retorna as permissões do usuário atual para o frontend filtrar o menu localmente
|
|
* Retorna:
|
|
* - isMaster: true se o usuário é TI Master ou Admin (nível <= 1)
|
|
* - permissions: Set de strings no formato "recurso.acao" (ex: "funcionarios.listar")
|
|
*/
|
|
export const getUserPermissions = query({
|
|
args: {},
|
|
handler: async (ctx) => {
|
|
const usuario = await getCurrentUserFunction(ctx);
|
|
if (!usuario) {
|
|
return { isMaster: false, permissions: [] };
|
|
}
|
|
|
|
const role = await ctx.db.get(usuario.roleId);
|
|
if (!role) {
|
|
return { isMaster: false, permissions: [] };
|
|
}
|
|
|
|
// Se for TI Master ou Admin (nivel <= 1), retorna flag de master
|
|
if (role.nivel <= 1) {
|
|
return { isMaster: true, permissions: [] };
|
|
}
|
|
|
|
// Buscar permissões do usuário
|
|
const rolePermissoes = await ctx.db
|
|
.query('rolePermissoes')
|
|
.withIndex('by_role', (q) => q.eq('roleId', role._id))
|
|
.collect();
|
|
|
|
const permissoesIds = rolePermissoes.map((rp) => rp.permissaoId);
|
|
|
|
// Carregar os documentos de permissão para saber recurso/ação
|
|
const permissoesDocs = await Promise.all(permissoesIds.map((id) => ctx.db.get(id)));
|
|
|
|
// Criar array de "recurso.acao" para o frontend
|
|
const permissions: string[] = [];
|
|
for (const p of permissoesDocs) {
|
|
if (p) {
|
|
permissions.push(`${p.recurso}.${p.acao}`);
|
|
}
|
|
}
|
|
|
|
// Injetar permissão de aceitar pedidos se o usuário for do setor de compras
|
|
const config = await ctx.db.query('config').first();
|
|
if (config && config.comprasSetorId) {
|
|
let funcionario = null;
|
|
if (usuario.funcionarioId) {
|
|
funcionario = await ctx.db.get(usuario.funcionarioId);
|
|
}
|
|
|
|
if (funcionario) {
|
|
// Verificar se o funcionário está no setor de compras
|
|
// Precisamos verificar na tabela funcionarioSetores ou se o setorId está no funcionario (depende da modelagem)
|
|
// Olhando para tables/funcionarios.ts, parece que não tem setorId direto, é N:N?
|
|
// Vamos verificar funcionarioSetores.
|
|
const funcionarioSetor = await ctx.db
|
|
.query('funcionarioSetores')
|
|
.withIndex('by_funcionarioId', (q) => q.eq('funcionarioId', funcionario._id))
|
|
.filter((q) => q.eq(q.field('setorId'), config.comprasSetorId))
|
|
.first();
|
|
|
|
if (funcionarioSetor) {
|
|
permissions.push('pedidos.aceitar');
|
|
}
|
|
}
|
|
}
|
|
|
|
return { isMaster: false, permissions };
|
|
}
|
|
});
|
|
|
|
// Manter a query antiga por compatibilidade (deprecada)
|
|
// TODO: Remover após migração completa do frontend
|
|
export const getSidebarMenu = query({
|
|
args: {},
|
|
handler: async () => {
|
|
// Retorna array vazio - o frontend agora define o menu
|
|
return [];
|
|
}
|
|
});
|