Você é um engenheiro backend sênior. Evolua o sistema existente para suportar templates WhatsApp com variáveis no padrão numérico: {{1}}, {{2}}, {{3}}... Seguindo o padrão da API da Infobip, e adicionando uma camada inteligente de mapeamento para integração com HubSpot. --- # 🎯 OBJETIVO Permitir que: * Templates tenham variáveis numéricas (posição) * O backend extraia automaticamente essas variáveis * O sistema sugira automaticamente campos do HubSpot * Gere automaticamente o payload pronto para uso no workflow * O webhook receba os valores corretamente * O sistema monte corretamente o array de placeholders * Envie corretamente para o provider --- # 🧩 MODELAGEM DE TEMPLATE (ATUALIZAR) Atualizar estrutura: ```json { "id": "tpl_123", "name": "Boas Vindas", "content": "Olá {{1}}, seu pedido {{2}} foi enviado", "variablesCount": 2, "variables": [ { "index": 1, "label": "Nome do cliente", "suggestedField": "contact.firstname" }, { "index": 2, "label": "Pedido", "suggestedField": "deal.name" } ], "status": "APPROVED", "providerTemplateId": "abc123", "wabaId": "waba_1" } ``` --- # 🧠 EXTRAÇÃO AUTOMÁTICA DE VARIÁVEIS ```js function extractVariables(content) { const matches = content.match(/{{\d+}}/g) || [] const numbers = matches.map(m => parseInt(m.replace(/[{}]/g, ""))) const unique = [...new Set(numbers)] return unique.sort((a, b) => a - b) } ``` --- # 🧠 GERAR METADADOS DAS VARIÁVEIS ```js function buildVariableMetadata(content) { const variables = extractVariables(content) return variables.map(v => ({ index: v, label: `Variável ${v}`, suggestedField: null })) } ``` --- # 🧠 GERADOR DE PAYLOAD PARA HUBSPOT (CORE DO DIFERENCIAL) Criar endpoint: ```http GET /templates/:id/hubspot-payload ``` --- ## Lógica: ```js function generateHubspotPayload(template) { const payload = { portalId: "{{portal.id}}", phone: "{{contact.phone}}", onsms_template: template.id } template.variables.forEach(v => { if (v.suggestedField) { payload[`var_${v.index}`] = `{{${v.suggestedField}}}` } else { payload[`var_${v.index}`] = `{{custom_field}}` } }) return payload } ``` --- # 🧠 EXEMPLO DE SAÍDA ```json { "portalId": "{{portal.id}}", "phone": "{{contact.phone}}", "onsms_template": "tpl_123", "var_1": "{{contact.firstname}}", "var_2": "{{deal.name}}" } ``` --- # 🧠 PADRÃO DE ENTRADA DO WEBHOOK ```json { "portalId": "123456", "onsms_template": "tpl_123", "phone": "+558399999999", "var_1": "João", "var_2": "Pedido 123" } ``` --- # 🧠 MONTAGEM DOS PARÂMETROS ```js function buildTemplateParams(template, payload) { const variables = extractVariables(template.content) return variables.map(v => { const value = payload[`var_${v}`] if (!value) { throw new Error(`Missing variable var_${v}`) } return value }) } ``` --- # 🧠 ATUALIZAR WEBHOOK ```js async function handleWebhook(req, res) { const { portalId, onsms_template, phone } = req.body const client = await getClientByPortalId(portalId) const template = await getTemplateByIdAndWaba( onsms_template, client.wabaId ) if (!template) { return res.status(400).json({ error: "Template not found" }) } let params try { params = buildTemplateParams(template, req.body) } catch (err) { return res.status(400).json({ error: err.message }) } const sender = await selectSender(client.wabaId) await sendViaProvider({ provider: client.provider, from: sender.number, to: phone, templateId: template.providerTemplateId, params }) return res.json({ success: true }) } ``` --- # 🧠 ENVIO PARA INFOBIP ```js async function sendViaProvider({ provider, from, to, templateId, params }) { if (provider === "infobip") { return axios.post( "https://xxxxx.api.infobip.com/whatsapp/1/message/template", { messages: [ { from, to, content: { templateName: templateId, templateData: { body: { placeholders: params } } } } ] }, { headers: { Authorization: "App YOUR_API_KEY", "Content-Type": "application/json" } } ) } } ``` --- # ⚠️ REGRAS IMPORTANTES * A ordem dos parâmetros deve seguir {{1}}, {{2}}, {{3}} * Nunca enviar objeto, apenas array * Se faltar variável → erro * Sempre validar antes de enviar * Nunca confiar no payload sem validação * Sempre garantir isolamento por cliente (wabaId) --- # 🚀 RESULTADO ESPERADO Sistema capaz de: * interpretar templates com {{1}}, {{2}} * sugerir automaticamente campos do HubSpot * gerar payload pronto para uso no workflow * reduzir erro humano do cliente * receber valores corretamente via webhook * montar array automaticamente * enviar corretamente via Infobip --- # 💡 DIFERENCIAL (IMPORTANTE) O sistema deve permitir: * geração automática de payload (copy/paste) * base para UI futura * integração simples para usuários finais * escalabilidade SaaS --- # 🏆 OBJETIVO FINAL Transformar o sistema em uma camada inteligente entre: HubSpot → Seu backend → Infobip Com o mínimo de esforço manual do cliente.