refactor: clean up code formatting and improve readability in various files, including utility functions and error handling components

This commit is contained in:
2025-12-09 14:44:08 -03:00
parent 2172d9a937
commit 248d7cd623
5 changed files with 54 additions and 44 deletions

View File

@@ -439,3 +439,4 @@ export function adicionarRodape(doc: jsPDF): void {

View File

@@ -78,3 +78,4 @@

View File

@@ -78,3 +78,4 @@

View File

@@ -1,7 +1,13 @@
import { action, internalMutation, internalAction, internalQuery, query } from './_generated/server'; import {
action,
internalMutation,
internalAction,
internalQuery,
query
} from './_generated/server';
import { v } from 'convex/values'; import { v } from 'convex/values';
import { api, internal } from './_generated/api'; import { api, internal } from './_generated/api';
import type { Id } from './_generated/dataModel'; import type { Id, Doc } from './_generated/dataModel';
import { getCurrentUserFunction } from './auth'; import { getCurrentUserFunction } from './auth';
/** /**
@@ -21,7 +27,9 @@ export const registrarErroServidor = action({
}, },
handler: async (ctx, args) => { handler: async (ctx, args) => {
// Registrar erro no banco // Registrar erro no banco
const erroId = await ctx.runMutation(internal.errosServidor.inserirErro, { // Anotação explícita de tipo para evitar problemas de tipagem circular ao
// chamar uma função registrada neste mesmo módulo (ver docs do Convex).
const erroId: Id<'errosServidor'> = await ctx.runMutation(internal.errosServidor.inserirErro, {
statusCode: args.statusCode, statusCode: args.statusCode,
mensagem: args.mensagem, mensagem: args.mensagem,
stack: args.stack, stack: args.stack,
@@ -96,15 +104,18 @@ export const notificarEquipeTecnica = internalAction({
} }
// Buscar usuários da equipe técnica (roles com nível <= 1) // Buscar usuários da equipe técnica (roles com nível <= 1)
const rolesAdminOuTi = await ctx.runQuery(internal.errosServidor.obterRolesTI, {}); const rolesAdminOuTi: Doc<'roles'>[] = await ctx.runQuery(
internal.errosServidor.obterRolesTI,
{}
);
if (rolesAdminOuTi.length === 0) { if (rolesAdminOuTi.length === 0) {
console.warn('Nenhuma role de TI encontrada para notificação de erro'); console.warn('Nenhuma role de TI encontrada para notificação de erro');
return; return;
} }
const rolesPermitidas = new Set(rolesAdminOuTi.map((r) => r._id)); const rolesPermitidas = new Set(rolesAdminOuTi.map((r: Doc<'roles'>) => r._id));
const usuarios = await ctx.runQuery(internal.errosServidor.obterUsuariosTI, { const usuarios: Doc<'usuarios'>[] = await ctx.runQuery(internal.errosServidor.obterUsuariosTI, {
rolesPermitidas: Array.from(rolesPermitidas) rolesPermitidas: Array.from(rolesPermitidas)
}); });
@@ -132,21 +143,17 @@ export const notificarEquipeTecnica = internalAction({
} }
// Notificar via email (apenas para usuários com email) // Notificar via email (apenas para usuários com email)
const usuariosComEmail = usuarios.filter((u) => u.email); const usuariosComEmail = usuarios.filter((u: Doc<'usuarios'>) => u.email);
for (const usuario of usuariosComEmail) { for (const usuario of usuariosComEmail) {
try { try {
// Determinar código do template baseado no status code // Determinar código do template baseado no status code
const templateCodigo = const templateCodigo = erro.statusCode === 404 ? 'ERRO_SERVIDOR_404' : 'ERRO_SERVIDOR_500';
erro.statusCode === 404 ? 'ERRO_SERVIDOR_404' : 'ERRO_SERVIDOR_500';
// Verificar se existe template de erro do servidor // Verificar se existe template de erro do servidor
const templateExiste = await ctx.runQuery( const templateExiste = await ctx.runQuery(api.templatesMensagens.obterTemplatePorCodigo, {
api.templatesMensagens.obterTemplatePorCodigo,
{
codigo: templateCodigo codigo: templateCodigo
} });
);
if (templateExiste) { if (templateExiste) {
// Usar template personalizado // Usar template personalizado
@@ -317,10 +324,7 @@ export const listarErros = query({
.withIndex('by_status_code', (q) => q.eq('statusCode', args.statusCode!)) .withIndex('by_status_code', (q) => q.eq('statusCode', args.statusCode!))
.collect(); .collect();
} else { } else {
erros = await ctx.db erros = await ctx.db.query('errosServidor').withIndex('by_criado_em').collect();
.query('errosServidor')
.withIndex('by_criado_em')
.collect();
} }
// Aplicar filtros adicionais que não são índices // Aplicar filtros adicionais que não são índices
@@ -379,7 +383,9 @@ export const obterEstatisticasErros = query({
const role = await ctx.db.get(usuario.roleId); const role = await ctx.db.get(usuario.roleId);
if (!role || role.nivel > 1) { if (!role || role.nivel > 1) {
throw new Error('Acesso negado. Apenas usuários de TI podem visualizar estatísticas de erros.'); throw new Error(
'Acesso negado. Apenas usuários de TI podem visualizar estatísticas de erros.'
);
} }
// Buscar todos os erros no período // Buscar todos os erros no período
@@ -421,4 +427,3 @@ export const obterEstatisticasErros = query({
}; };
} }
}); });

View File

@@ -1,5 +1,6 @@
import { v } from 'convex/values'; import { v } from 'convex/values';
import { mutation, query } from './_generated/server'; import { mutation, query } from './_generated/server';
import { api } from './_generated/api';
import { registrarAtividade } from './logsAtividades'; import { registrarAtividade } from './logsAtividades';
import { Id, Doc } from './_generated/dataModel'; import { Id, Doc } from './_generated/dataModel';
import type { QueryCtx } from './_generated/server'; import type { QueryCtx } from './_generated/server';
@@ -886,13 +887,14 @@ export const resetarSenhaUsuario = mutation({
const senhaTemporaria = args.novaSenhaTemporaria || gerarSenhaTemporaria(); const senhaTemporaria = args.novaSenhaTemporaria || gerarSenhaTemporaria();
try { try {
// Fazer hash da senha // Nota: Better Auth gerencia senhas através do sistema de autenticação.
const { hashPassword } = await import('./auth/utils'); // A senha não é armazenada diretamente na tabela usuarios.
const senhaHash = await hashPassword(senhaTemporaria); // Para resetar a senha, seria necessário usar a API do Better Auth,
// mas isso requer uma implementação adicional.
// Por enquanto, atualizamos apenas os campos do usuário que podemos modificar.
// Atualizar usuário // Atualizar usuário (sem senhaHash, pois não existe no schema)
await ctx.db.patch(args.usuarioId, { await ctx.db.patch(args.usuarioId, {
senhaHash,
primeiroAcesso: true, // Força mudança de senha no próximo login primeiroAcesso: true, // Força mudança de senha no próximo login
tentativasLogin: 0, tentativasLogin: 0,
ultimaTentativaLogin: undefined, ultimaTentativaLogin: undefined,