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

@@ -1,8 +1,10 @@
import { v } from "convex/values";
import { mutation, query, internalMutation, internalQuery, action } from "./_generated/server";
import { internal, api } from "./_generated/api";
import { renderizarTemplate } from "./templatesMensagens";
import { wrapEmailHTML, textToHTML } from "./utils/emailTemplateWrapper";
import {
renderizarTemplateEmailFromDoc,
type VariaveisTemplate,
} from "./templatesMensagens";
import type { Doc, Id } from "./_generated/dataModel";
// ========== INTERNAL QUERIES ==========
@@ -212,37 +214,24 @@ export const enviarEmailComTemplate = action({
}
// Renderizar template com variáveis
const variaveisTemplate = args.variaveis || {};
const variaveisTemplate: VariaveisTemplate = args.variaveis ?? {};
// Garantir que urlSistema sempre tenha protocolo se presente
if (variaveisTemplate.urlSistema && !variaveisTemplate.urlSistema.match(/^https?:\/\//i)) {
if (
typeof variaveisTemplate.urlSistema === "string" &&
!variaveisTemplate.urlSistema.match(/^https?:\/\//i)
) {
variaveisTemplate.urlSistema = `http://${variaveisTemplate.urlSistema}`;
}
const tituloRenderizado = renderizarTemplate(template.titulo, variaveisTemplate);
const corpoRenderizado = renderizarTemplate(template.corpo, variaveisTemplate);
// Usar htmlCorpo se disponível, senão gerar do corpo
let corpoHTML = template.htmlCorpo;
if (corpoHTML) {
// Renderizar variáveis no HTML
corpoHTML = renderizarTemplate(corpoHTML, variaveisTemplate);
} else {
// Gerar HTML do corpo renderizado
if (corpoRenderizado.includes("<") && corpoRenderizado.includes(">")) {
corpoHTML = wrapEmailHTML(corpoRenderizado, tituloRenderizado);
} else {
const corpoHTMLFormatado = textToHTML(corpoRenderizado);
corpoHTML = wrapEmailHTML(corpoHTMLFormatado, tituloRenderizado);
}
}
const emailRenderizado = renderizarTemplateEmailFromDoc(template, variaveisTemplate);
// Enfileirar email via mutation
const emailId: Id<"notificacoesEmail"> = await ctx.runMutation(api.email.enfileirarEmail, {
destinatario: args.destinatario,
destinatarioId: args.destinatarioId,
assunto: tituloRenderizado,
corpo: corpoHTML, // Usar HTML completo
assunto: emailRenderizado.titulo,
corpo: emailRenderizado.html, // HTML completo com wrapper
templateId: template._id, // template._id sempre existe se template não é null
enviadoPor: args.enviadoPor,
agendadaPara: args.agendadaPara,