feat: implement permission checks for various actions across multiple resources, including acoes, atas, atestados, ausencias, ferias, and simbolos

This commit is contained in:
2025-12-12 09:26:30 -03:00
parent 4eb49d3e63
commit 92a9605417
8 changed files with 554 additions and 51 deletions

View File

@@ -76,6 +76,11 @@ function agruparPorSolicitacao(registros: Array<Doc<'ferias'>>): Array<{
export const listarTodas = query({
args: {},
handler: async (ctx) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'listar'
});
const todasFerias = await ctx.db.query('ferias').collect();
const periodosComDetalhes = await Promise.all(
@@ -146,6 +151,11 @@ export const listarMinhasSolicitacoes = query({
_refresh: v.optional(v.number()) // Parâmetro para forçar atualização no frontend
},
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'dashboard'
});
const todasFerias = await ctx.db
.query('ferias')
.withIndex('by_funcionario', (q) => q.eq('funcionarioId', args.funcionarioId))
@@ -180,6 +190,11 @@ export const listarMinhasSolicitacoes = query({
export const listarSolicitacoesSubordinados = query({
args: { gestorId: v.id('usuarios') },
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'dashboard'
});
// Buscar times onde o usuário é gestor
const timesGestor = await ctx.db
.query('times')
@@ -259,6 +274,11 @@ export const obterDetalhes = query({
feriasId: v.id('ferias')
},
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'ver'
});
const ferias = await ctx.db.get(args.feriasId);
if (!ferias) return null;
@@ -333,6 +353,11 @@ export const criarSolicitacao = mutation({
},
returns: v.array(v.id('ferias')),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'criar'
});
if (args.periodos.length === 0) {
throw new Error('É necessário adicionar pelo menos 1 período');
}
@@ -394,6 +419,11 @@ export const aprovar = mutation({
},
returns: v.null(),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'aprovar'
});
// Buscar o registro específico
const registro = await ctx.db.get(args.feriasId);
@@ -503,6 +533,11 @@ export const reprovar = mutation({
},
returns: v.null(),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'reprovar'
});
// Buscar o registro específico
const registro = await ctx.db.get(args.feriasId);
@@ -565,6 +600,11 @@ export const ajustarEAprovar = mutation({
},
returns: v.null(),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'aprovar'
});
// Buscar o registro específico
const registroAntigo = await ctx.db.get(args.feriasId);
@@ -676,6 +716,11 @@ export const verificarStatusFerias = query({
args: { funcionarioId: v.id('funcionarios') },
returns: v.union(v.literal('ativo'), v.literal('em_ferias')),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'ver'
});
const hoje = new Date();
hoje.setHours(0, 0, 0, 0);
@@ -721,6 +766,11 @@ export const verificarStatusFerias = query({
export const obterNotificacoesNaoLidas = query({
args: { usuarioId: v.id('usuarios') },
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'dashboard'
});
return await ctx.db
.query('notificacoesFerias')
.withIndex('by_destinatario_and_lida', (q) =>
@@ -735,6 +785,10 @@ export const marcarComoLida = mutation({
args: { notificacaoId: v.id('notificacoesFerias') },
returns: v.null(),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'dashboard'
});
await ctx.db.patch(args.notificacaoId, { lida: true });
return null;
}
@@ -755,6 +809,11 @@ export const atualizarStatus = mutation({
},
returns: v.null(),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'editar_status'
});
// Buscar o registro específico
const registro = await ctx.db.get(args.feriasId);
@@ -1184,6 +1243,11 @@ export const atualizarMeuStatus = mutation({
args: {},
returns: v.null(),
handler: async (ctx) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ferias',
acao: 'atualizar_status'
});
const usuario = await getCurrentUserFunction(ctx);
if (!usuario || !usuario.funcionarioId) {
throw new Error('Usuário não encontrado ou não possui funcionário associado');