feat: implement template filtering for notifications based on channel type and enhance email rendering with HTML wrapper, ensuring chat messages are sent as plain text

This commit is contained in:
2025-12-01 09:50:53 -03:00
parent d9e78079c8
commit 4c2d12f443
7 changed files with 213 additions and 34 deletions

View File

@@ -224,6 +224,71 @@ export function renderizarTemplate(template: string, variaveis: Record<string, s
return resultado;
}
export type VariaveisTemplate = Record<string, string>;
export interface EmailRenderizado {
titulo: string;
html: string;
}
/**
* Renderizar template para EMAIL (HTML padronizado)
* - Usa `htmlCorpo` se existir, senão gera HTML a partir de `corpo` (texto ou HTML simples)
* - Sempre aplica o wrapper visual de email
*/
export function renderizarTemplateEmailFromDoc(
template: Doc<"templatesMensagens">,
variaveis: VariaveisTemplate,
): EmailRenderizado {
const variaveisTemplate: VariaveisTemplate = { ...variaveis };
const tituloRenderizado = renderizarTemplate(template.titulo, variaveisTemplate);
// Base para o corpo: se existir htmlCorpo usamos ele, senão usamos corpo
const baseCorpo = template.htmlCorpo ?? template.corpo ?? "";
const corpoRenderizado = renderizarTemplate(baseCorpo, variaveisTemplate);
let htmlFinal: string;
if (template.htmlCorpo) {
// htmlCorpo já é HTML completo de email (com ou sem wrapper) apenas aplica variáveis
htmlFinal = corpoRenderizado.includes("<html")
? corpoRenderizado
: wrapEmailHTML(corpoRenderizado, tituloRenderizado);
} else {
// corpo pode ser texto puro ou HTML simples sempre gera HTML padronizado
if (corpoRenderizado.includes("<") && corpoRenderizado.includes(">")) {
htmlFinal = wrapEmailHTML(corpoRenderizado, tituloRenderizado);
} else {
const corpoHTML = textToHTML(corpoRenderizado);
htmlFinal = wrapEmailHTML(corpoHTML, tituloRenderizado);
}
}
return {
titulo: tituloRenderizado,
html: htmlFinal,
};
}
/**
* Renderizar template para CHAT (texto puro)
* - Usa sempre `corpo` como fonte
* - Remove quaisquer tags HTML residuais
*/
export function renderizarTemplateChatFromDoc(
template: Doc<"templatesMensagens">,
variaveis: VariaveisTemplate,
): string {
const corpoBase = template.corpo ?? "";
const textoComVariaveis = renderizarTemplate(corpoBase, variaveis);
// Garantir texto puro para o chat (sem tags HTML)
const textoPuro = textoComVariaveis.replace(/<[^>]*>/g, "");
return textoPuro;
}
/**
* Criar templates padrão do sistema (chamado no seed)
*/
@@ -432,6 +497,20 @@ export const criarTemplatesPadrao = mutation({
+ "</div></body></html>",
variaveis: ["destinatario", "numeroTicket", "tipoPrazo", "prazo", "status", "urlSistema", "rotaAcesso"],
},
{
codigo: "monitoramento_alerta_sistema",
nome: "Alerta de Sistema (Monitoramento)",
titulo: "⚠️ Alerta de Sistema: {{metricName}}",
corpo:
"Olá {{destinatarioNome}},\n\n" +
"A métrica {{metricName}} atingiu o valor {{metricValue}} (limite configurado: {{threshold}}).\n\n" +
"Recomenda-se verificar o painel de monitoramento do SGSE para detalhes adicionais e, se necessário, " +
"executar ações corretivas.\n\n" +
"Esta é uma notificação automática do sistema de monitoramento SGSE.",
variaveis: ["destinatarioNome", "metricName", "metricValue", "threshold"],
categoria: "email" as const,
tags: ["monitoramento", "alerta", "sistema", "ti"],
},
{
codigo: "ausencia_solicitada",
nome: "Ausência Solicitada",