'use strict'; const formData = require('form-data'); const Mailgun = require('mailgun.js'); const { removeUndefined } = require('@strapi/utils'); const optionsMap = { apiKey: { field: 'key', fn: value => value }, domain: { field: 'domain', fn: value => value }, host: { field: 'url', fn: value => `https://${value || 'api.mailgun.net'}` }, }; const convertProviderOptions = (providerOptions = {}) => { const newOptions = {}; if (typeof providerOptions === 'object') { Object.keys(providerOptions).forEach(key => { if (Object.keys(optionsMap).includes(key)) { newOptions[optionsMap[key].field] = optionsMap[key].fn(providerOptions[key]); } }); } return newOptions; }; module.exports = { init(providerOptions = {}, settings = {}) { const mailgun = new Mailgun(formData); const mg = mailgun.client({ username: 'api', ...convertProviderOptions(providerOptions) }); return { send(options) { return new Promise((resolve, reject) => { const { from, to, cc, bcc, replyTo, subject, text, html, ...rest } = options; let data = { from: from || settings.defaultFrom, to, cc, bcc, 'h:Reply-To': replyTo || settings.defaultReplyTo, subject, text, html, ...rest, }; mg.messages .create(providerOptions.domain, removeUndefined(data)) .then(() => resolve()) .catch(err => reject(err)); }); }, }; }, };