feat: add user authentication and validation checks in query handlers

- Implemented user authentication checks in the `getAll` and `listarRegistrosPeriodo` query handlers, returning empty arrays for unauthenticated users.
- Enhanced date validation in `listarRegistrosPeriodo` to ensure correct date formats before processing.
- Updated the `obterEstatisticas` query to return zeroed statistics for unauthenticated users, improving data security and user experience.
This commit is contained in:
2025-11-22 22:33:44 -03:00
parent aeaa3c903f
commit 5b41d35b6f
2 changed files with 50 additions and 13 deletions

View File

@@ -862,15 +862,24 @@ export const listarRegistrosPeriodo = query({
handler: async (ctx, args) => {
const usuario = await getCurrentUserFunction(ctx);
if (!usuario) {
throw new Error('Usuário não autenticado');
// Retornar array vazio quando não autenticado
return [];
}
// Verificar permissão (RH ou TI)
// Por enquanto, permitir se tiver funcionarioId ou for admin
// TODO: Implementar verificação de permissão adequada
const dataFim = new Date(args.dataFim);
dataFim.setHours(23, 59, 59, 999);
// Validar formato das datas
if (!args.dataInicio || !args.dataFim) {
return [];
}
// Validar formato YYYY-MM-DD
const dataInicioRegex = /^\d{4}-\d{2}-\d{2}$/;
if (!dataInicioRegex.test(args.dataInicio) || !dataInicioRegex.test(args.dataFim)) {
return [];
}
let registrosFiltrados;
@@ -885,19 +894,26 @@ export const listarRegistrosPeriodo = query({
.withIndex('by_funcionario_data', (q) => q.eq('funcionarioId', funcionarioId))
.collect();
// Filtrar por período de data
// Filtrar por período de data usando comparação de strings (formato YYYY-MM-DD)
registrosFiltrados = todosRegistrosFuncionario.filter((r) => {
const dataRegistro = new Date(r.data);
return dataRegistro >= new Date(args.dataInicio) && dataRegistro <= dataFim;
// Comparação de strings funciona para formato YYYY-MM-DD
return r.data >= args.dataInicio && r.data <= args.dataFim;
});
} else {
// Se não há funcionário especificado, buscar todos e filtrar (menos eficiente, mas necessário)
// Usar comparação de strings diretamente para datas no formato YYYY-MM-DD
const registros = await ctx.db
.query('registrosPonto')
.withIndex('by_data', (q) => q.gte('data', args.dataInicio).lte('data', args.dataFim))
.withIndex('by_data', (q) =>
q.gte('data', args.dataInicio).lte('data', args.dataFim)
)
.collect();
registrosFiltrados = registros;
// Garantir que as datas estão no formato correto e filtrar novamente para garantir
registrosFiltrados = registros.filter((r) => {
// Comparação de strings funciona para formato YYYY-MM-DD
return r.data >= args.dataInicio && r.data <= args.dataFim;
});
}
// Buscar informações dos funcionários
@@ -964,7 +980,15 @@ export const obterEstatisticas = query({
handler: async (ctx, args) => {
const usuario = await getCurrentUserFunction(ctx);
if (!usuario) {
throw new Error('Usuário não autenticado');
// Retornar estatísticas zeradas quando não autenticado
return {
totalRegistros: 0,
dentroDoPrazo: 0,
foraDoPrazo: 0,
totalFuncionarios: 0,
funcionariosDentroPrazo: 0,
funcionariosForaPrazo: 0,
};
}
// TODO: Verificar permissão (RH ou TI)