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

@@ -11,6 +11,11 @@ import { getCurrentUserFunction } from './auth';
export const listarTodas = query({
args: {},
handler: async (ctx) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ausencias',
acao: 'listar'
});
const solicitacoes = await ctx.db.query('solicitacoesAusencias').collect();
const solicitacoesComDetalhes = await Promise.all(
@@ -65,6 +70,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: 'ausencias',
acao: 'criar'
});
const solicitacoes = await ctx.db
.query('solicitacoesAusencias')
.withIndex('by_funcionario', (q) => q.eq('funcionarioId', args.funcionarioId))
@@ -104,6 +114,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: 'ausencias',
acao: 'aprovar'
});
// Buscar times onde o usuário é gestor
const timesGestor = await ctx.db
.query('times')
@@ -170,6 +185,11 @@ export const listarSolicitacoesSubordinados = query({
export const obterDetalhes = query({
args: { solicitacaoId: v.id('solicitacoesAusencias') },
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ausencias',
acao: 'listar'
});
const solicitacao = await ctx.db.get(args.solicitacaoId);
if (!solicitacao) return null;
@@ -237,6 +257,11 @@ export const obterDetalhes = query({
export const obterNotificacoesNaoLidas = query({
args: { usuarioId: v.id('usuarios') },
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ausencias',
acao: 'criar'
});
const notificacoes = await ctx.db
.query('notificacoesAusencias')
.withIndex('by_destinatario_and_lida', (q) =>
@@ -253,6 +278,11 @@ export const obterNotificacoesNaoLidas = query({
export const contarPendentesGestor = query({
args: { gestorId: v.id('usuarios') },
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ausencias',
acao: 'aprovar'
});
// Buscar times onde o usuário é gestor
const timesGestor = await ctx.db
.query('times')
@@ -359,6 +389,11 @@ export const criarSolicitacao = mutation({
},
returns: v.id('solicitacoesAusencias'),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ausencias',
acao: 'criar'
});
// Validações
if (args.motivo.trim().length < 10) {
throw new Error('O motivo deve ter no mínimo 10 caracteres');
@@ -547,6 +582,11 @@ export const aprovar = mutation({
},
returns: v.null(),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ausencias',
acao: 'aprovar'
});
const solicitacao = await ctx.db.get(args.solicitacaoId);
if (!solicitacao) {
throw new Error('Solicitação não encontrada');
@@ -710,6 +750,11 @@ export const reprovar = mutation({
},
returns: v.null(),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ausencias',
acao: 'reprovar'
});
const solicitacao = await ctx.db.get(args.solicitacaoId);
if (!solicitacao) {
throw new Error('Solicitação não encontrada');
@@ -866,6 +911,11 @@ export const marcarComoLida = mutation({
},
returns: v.null(),
handler: async (ctx, args) => {
await ctx.runQuery(internal.permissoesAcoes.assertPermissaoAcaoAtual, {
recurso: 'ausencias',
acao: 'criar'
});
await ctx.db.patch(args.notificacaoId, {
lida: true
});