UNPKG

@helyes/sendgridder

Version:

Sendgrid transactional email trigger

87 lines (86 loc) 3.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const https = require("https"); const url = require("url"); class Sendgridder { constructor(config) { this._debug = false; this._config = config; this._authToken = `Bearer SG.${config.apiKeyId}.${config.apiKey}`; } set debug(value) { this._debug = value; } buildPayload(personalizations) { const templateData = []; for (const personalization of personalizations) { templateData.push({ dynamic_template_data: personalization.data, to: [personalization.to], }); } if (this._debug) { console.log('Personalizations:', JSON.stringify(personalizations, null, 2)); } const ret = { from: this._config.from, personalizations: templateData, reply_to: this._config.replyTo, template_id: this._config.templateId, }; if (this._debug) { console.log('Payload:', JSON.stringify(ret, null, 2)); } return ret; } sendTransactional(personalization) { if (this._debug) { console.log(`Received personalization: ${JSON.stringify(personalization, null, 2)}, \n\nconfig:${JSON.stringify(this._config, null, 2)}`); } const payload = JSON.stringify(this.buildPayload(personalization)); const parsedUrl = url.parse(this._config.apiEndpoint); const options = { headers: { 'Content-Type': 'application/json', authorization: this._authToken, }, hostname: parsedUrl.hostname, method: 'POST', path: parsedUrl.path, }; return new Promise((resolve, reject) => { let responseData = ''; const req = https.request(options, (response) => { response.on('data', (chunk) => { responseData += chunk; }); response.on('end', () => { if (response.statusCode && response.statusCode < 400) { // resolve({statusCode: response.statusCode, status: "OK", data: responseData, to: personalization[0].to}); resolve(this.buildDetailedResponse(personalization, response, responseData)); } else { reject(responseData); } }); }); req.on('error', (error) => { reject(error.message); }); req.write(payload); req.end(); }); } buildDetailedResponse(personalization, responseRaw, responseData) { const to = { count: personalization.length, emailFirst: personalization[0].to, emailLast: personalization.length > 1 ? personalization[personalization.length - 1].to : undefined, }; return { statusCode: responseRaw.statusCode || 599, status: "OK", data: responseData, to }; } } exports.Sendgridder = Sendgridder; // if (require.main === module) { // // }