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 []; } });