@helyes/sendgridder
Version:
Sendgrid transactional email trigger
87 lines (86 loc) • 3.21 kB
JavaScript
;
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) {
//
// }