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:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user