|
|
|
|
@@ -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 { api, internal } from './_generated/api';
|
|
|
|
|
import type { Id } from './_generated/dataModel';
|
|
|
|
|
import type { Id, Doc } from './_generated/dataModel';
|
|
|
|
|
import { getCurrentUserFunction } from './auth';
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
@@ -21,7 +27,9 @@ export const registrarErroServidor = action({
|
|
|
|
|
},
|
|
|
|
|
handler: async (ctx, args) => {
|
|
|
|
|
// 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,
|
|
|
|
|
mensagem: args.mensagem,
|
|
|
|
|
stack: args.stack,
|
|
|
|
|
@@ -96,15 +104,18 @@ export const notificarEquipeTecnica = internalAction({
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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) {
|
|
|
|
|
console.warn('Nenhuma role de TI encontrada para notificação de erro');
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const rolesPermitidas = new Set(rolesAdminOuTi.map((r) => r._id));
|
|
|
|
|
const usuarios = await ctx.runQuery(internal.errosServidor.obterUsuariosTI, {
|
|
|
|
|
const rolesPermitidas = new Set(rolesAdminOuTi.map((r: Doc<'roles'>) => r._id));
|
|
|
|
|
const usuarios: Doc<'usuarios'>[] = await ctx.runQuery(internal.errosServidor.obterUsuariosTI, {
|
|
|
|
|
rolesPermitidas: Array.from(rolesPermitidas)
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -132,21 +143,17 @@ export const notificarEquipeTecnica = internalAction({
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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) {
|
|
|
|
|
try {
|
|
|
|
|
// Determinar código do template baseado no status code
|
|
|
|
|
const templateCodigo =
|
|
|
|
|
erro.statusCode === 404 ? 'ERRO_SERVIDOR_404' : 'ERRO_SERVIDOR_500';
|
|
|
|
|
const templateCodigo = erro.statusCode === 404 ? 'ERRO_SERVIDOR_404' : 'ERRO_SERVIDOR_500';
|
|
|
|
|
|
|
|
|
|
// Verificar se existe template de erro do servidor
|
|
|
|
|
const templateExiste = await ctx.runQuery(
|
|
|
|
|
api.templatesMensagens.obterTemplatePorCodigo,
|
|
|
|
|
{
|
|
|
|
|
codigo: templateCodigo
|
|
|
|
|
}
|
|
|
|
|
);
|
|
|
|
|
const templateExiste = await ctx.runQuery(api.templatesMensagens.obterTemplatePorCodigo, {
|
|
|
|
|
codigo: templateCodigo
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
if (templateExiste) {
|
|
|
|
|
// Usar template personalizado
|
|
|
|
|
@@ -251,23 +258,23 @@ export const criarNotificacaoChat = internalMutation({
|
|
|
|
|
method: v.string()
|
|
|
|
|
},
|
|
|
|
|
handler: async (ctx, args) => {
|
|
|
|
|
const tituloNotificacao =
|
|
|
|
|
args.statusCode === 404
|
|
|
|
|
? `⚠️ Erro 404 - Página não encontrada`
|
|
|
|
|
: `🚨 Erro ${args.statusCode} no Servidor`;
|
|
|
|
|
const descricaoNotificacao =
|
|
|
|
|
args.statusCode === 404
|
|
|
|
|
? `Página não encontrada: ${args.url} (${args.method})`
|
|
|
|
|
: `Erro detectado em ${args.url} (${args.method}): ${args.mensagem.substring(0, 100)}`;
|
|
|
|
|
const tituloNotificacao =
|
|
|
|
|
args.statusCode === 404
|
|
|
|
|
? `⚠️ Erro 404 - Página não encontrada`
|
|
|
|
|
: `🚨 Erro ${args.statusCode} no Servidor`;
|
|
|
|
|
const descricaoNotificacao =
|
|
|
|
|
args.statusCode === 404
|
|
|
|
|
? `Página não encontrada: ${args.url} (${args.method})`
|
|
|
|
|
: `Erro detectado em ${args.url} (${args.method}): ${args.mensagem.substring(0, 100)}`;
|
|
|
|
|
|
|
|
|
|
await ctx.db.insert('notificacoes', {
|
|
|
|
|
usuarioId: args.usuarioId,
|
|
|
|
|
tipo: 'nova_mensagem',
|
|
|
|
|
titulo: tituloNotificacao,
|
|
|
|
|
descricao: descricaoNotificacao,
|
|
|
|
|
lida: false,
|
|
|
|
|
criadaEm: Date.now()
|
|
|
|
|
});
|
|
|
|
|
await ctx.db.insert('notificacoes', {
|
|
|
|
|
usuarioId: args.usuarioId,
|
|
|
|
|
tipo: 'nova_mensagem',
|
|
|
|
|
titulo: tituloNotificacao,
|
|
|
|
|
descricao: descricaoNotificacao,
|
|
|
|
|
lida: false,
|
|
|
|
|
criadaEm: Date.now()
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
@@ -317,10 +324,7 @@ export const listarErros = query({
|
|
|
|
|
.withIndex('by_status_code', (q) => q.eq('statusCode', args.statusCode!))
|
|
|
|
|
.collect();
|
|
|
|
|
} else {
|
|
|
|
|
erros = await ctx.db
|
|
|
|
|
.query('errosServidor')
|
|
|
|
|
.withIndex('by_criado_em')
|
|
|
|
|
.collect();
|
|
|
|
|
erros = await ctx.db.query('errosServidor').withIndex('by_criado_em').collect();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 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);
|
|
|
|
|
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
|
|
|
|
|
@@ -421,4 +427,3 @@ export const obterEstatisticasErros = query({
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|