feat: enhance email monitoring and management features

- Added a new section for monitoring email status, allowing users to track the email queue and identify sending issues.
- Updated the backend to support new internal queries for listing pending emails and retrieving email configurations.
- Refactored email-related mutations to improve error handling and streamline the email sending process.
- Enhanced the overall email management experience by providing clearer feedback and monitoring capabilities.
This commit is contained in:
2025-11-04 21:27:48 -03:00
parent 12db52a8a7
commit f6671e0f16
8 changed files with 505 additions and 772 deletions

View File

@@ -9,7 +9,10 @@
*/
import type * as actions_email from "../actions/email.js";
import type * as actions_linkPreview from "../actions/linkPreview.js";
import type * as actions_pushNotifications from "../actions/pushNotifications.js";
import type * as actions_smtp from "../actions/smtp.js";
import type * as actions_utils_nodeCrypto from "../actions/utils/nodeCrypto.js";
import type * as atestadosLicencas from "../atestadosLicencas.js";
import type * as ausencias from "../ausencias.js";
import type * as autenticacao from "../autenticacao.js";
@@ -31,6 +34,8 @@ import type * as logsAtividades from "../logsAtividades.js";
import type * as logsLogin from "../logsLogin.js";
import type * as monitoramento from "../monitoramento.js";
import type * as permissoesAcoes from "../permissoesAcoes.js";
import type * as preferenciasNotificacao from "../preferenciasNotificacao.js";
import type * as pushNotifications from "../pushNotifications.js";
import type * as roles from "../roles.js";
import type * as saldoFerias from "../saldoFerias.js";
import type * as seed from "../seed.js";
@@ -59,7 +64,10 @@ import type {
*/
declare const fullApi: ApiFromModules<{
"actions/email": typeof actions_email;
"actions/linkPreview": typeof actions_linkPreview;
"actions/pushNotifications": typeof actions_pushNotifications;
"actions/smtp": typeof actions_smtp;
"actions/utils/nodeCrypto": typeof actions_utils_nodeCrypto;
atestadosLicencas: typeof atestadosLicencas;
ausencias: typeof ausencias;
autenticacao: typeof autenticacao;
@@ -81,6 +89,8 @@ declare const fullApi: ApiFromModules<{
logsLogin: typeof logsLogin;
monitoramento: typeof monitoramento;
permissoesAcoes: typeof permissoesAcoes;
preferenciasNotificacao: typeof preferenciasNotificacao;
pushNotifications: typeof pushNotifications;
roles: typeof roles;
saldoFerias: typeof saldoFerias;
seed: typeof seed;

View File

@@ -28,11 +28,19 @@ export const enviar = action({
const configRaw = await ctx.runQuery(internal.email.getActiveEmailConfig, {});
if (!configRaw) {
console.error("❌ Configuração SMTP não encontrada ou inativa para email:", email.destinatario);
return {
sucesso: false,
erro: "Configuração de email não encontrada ou inativa",
erro: "Configuração de email não encontrada ou inativa. Verifique as configurações SMTP no painel de TI.",
};
}
console.log("📧 Tentando enviar email:", {
para: email.destinatario,
assunto: email.assunto,
servidor: configRaw.servidor,
porta: configRaw.porta,
});
// Descriptografar senha usando função compatível com Node.js
let senhaDescriptografada: string;

View File

@@ -1,3 +1,4 @@
"use node";
/**
* Utilitários de criptografia compatíveis com Node.js
* Para uso em actions que rodam em ambiente Node.js

View File

@@ -370,7 +370,7 @@ export const criarSolicitacao = mutation({
<li><strong>Motivo:</strong> ${args.motivo}</li>
</ul>
<p>Por favor, acesse o sistema para aprovar ou reprovar esta solicitação.</p>`,
enviadoPorId: funcionarioUsuario._id,
enviadoPor: funcionarioUsuario._id,
});
// Criar ou obter conversa entre gestor e funcionário
@@ -486,7 +486,7 @@ export const aprovar = mutation({
<li><strong>Período:</strong> ${new Date(solicitacao.dataInicio).toLocaleDateString("pt-BR")} até ${new Date(solicitacao.dataFim).toLocaleDateString("pt-BR")}</li>
<li><strong>Motivo:</strong> ${solicitacao.motivo}</li>
</ul>`,
enviadoPorId: args.gestorId,
enviadoPor: args.gestorId,
});
// Criar ou obter conversa
@@ -605,7 +605,7 @@ export const reprovar = mutation({
<li><strong>Motivo:</strong> ${solicitacao.motivo}</li>
<li><strong>Motivo da Reprovação:</strong> ${args.motivoReprovacao}</li>
</ul>`,
enviadoPorId: args.gestorId,
enviadoPor: args.gestorId,
});
// Criar ou obter conversa

View File

@@ -370,10 +370,10 @@ export const enviarMensagem = mutation({
variaveis: {
remetente: usuarioAtual.nome,
mensagem: descricao,
conversaId: args.conversaId,
conversaId: args.conversaId.toString(),
urlSistema,
},
enviadoPorId: usuarioAtual._id,
enviadoPor: usuarioAtual._id,
}).catch((error) => {
console.error(`Erro ao agendar email para usuário ${participanteId}:`, error);
});

File diff suppressed because it is too large Load Diff