var Liquid = require('liquid-node') var fs = require('fs') var Q = require('q') var htmlTemplate = fs.readFileSync('templates/email.html', 'utf8') var textTemplate = fs.readFileSync('templates/email.txt', 'utf8') var mailgun = require('mailgun.js') var request = require('request') var multer = require('multer') var PassThrough = require('stream').PassThrough var upload = require('../../node_modules/okcms/app/node_modules/okservices/oks3/upload') /* awmail: { lib: require("./lib/awmail"), apikey: process.env.MAILGUN_API_KEY, domain: process.env.MAILGUN_DOMAIN, from: 'Postmaster ', subject: 'Your Result', } */ function AWMail (options) { if (!(this instanceof AWMail)) return new AWMail(options) options = options || {} if (!options.express) throw new Error('Express not provided to AWMail') if (!options.config) throw new Error('Configuration not provided to AWMail') var express = options.express var router = express.Router() var config = options.config var mult = multer() var engine = new Liquid.Engine var mg = mailgun.client({ username: 'api', key: process.env.MAILGUN_API_KEY, }) router.post('/send', mult.single('image'), function (req, res) { res.header('Access-Control-Allow-Origin', '*') res.header('Access-Control-Allow-Headers', 'X-Requested-With') var email = req.body.email var track = req.body.track var secret = req.body.secret if (secret !== config.secret) { return res.sendStatus(500) } deferToNextTick().then(function(){ console.log("upload image") return uploadImage({ file: req.file, }) }).then(function(url){ console.log("parse templates") // https://marsupial.s3.amazonaws.com/armory/mail/260b1e90-380e-11e7-b0c0-190f661d482a.jpg var hash = url.replace('https://marsupial.s3.amazonaws.com/armory/mail/','').replace('.jpg','') var templateData = { email: email, hash: hash, } return parseTemplates(templateData) }).then(function(mailData){ console.log("send mail") mailData.email = email mailData.image = req.file return sendMail(mailData) }).then(function(){ console.log("store email") if (String(track) === 'true') { return storeEmail(email) } else { return Q.Promise(function(resolve, reject, notify) { resolve() }) } }).then(function(){ console.log("all done") }).catch(function(err){ console.error(err.stack) }) res.sendStatus(200) }) router.post('/feedback', mult.array(), function (req, res) { res.header('Access-Control-Allow-Origin', '*') res.header('Access-Control-Allow-Headers', 'X-Requested-With') var email = req.body.email var message = req.body.message var track = req.body.track var secret = req.body.secret if (secret !== config.secret) { return res.sendStatus(500) } deferToNextTick().then(function(){ console.log("store message") return storeMessage(email, message) }).then(function(){ console.log("store email") if (String(track) === 'true') { return storeEmail(email) } else { return Q.Promise(function(resolve, reject, notify) { resolve() }) } }).then(function(){ console.log("all done") }).catch(function(err){ console.error(err.stack) }) res.sendStatus(200) }) router.get('/test', function (req, res) { var hash = 'test' var email = 'julescarbon@gmail.com' deferToNextTick().then(function(){ console.log("parse templates") var templateData = { email: email, hash: hash, } return parseTemplates(templateData) }).then(function(mailData){ console.log("send mail") mailData.email = email return sendMail(mailData) }).then(function(){ console.log("store email") return storeEmail(email) }).then(function(){ console.log("all done") }).catch(function(err){ console.log(err) }) res.sendStatus(200) }) function deferToNextTick(){ return Q.Promise(function(resolve, reject, notify) { process.nextTick(function(){ resolve() }) }) } function uploadImage (data){ return Q.Promise(function(resolve, reject, notify) { upload.put({ file: data.file, preserveFilename: false, dirname: "armory/mail", types: { 'image/gif': 'gif', 'image/jpeg': 'jpg', 'image/jpg': 'jpg', 'image/png': 'png', }, unacceptable: function(err){ reject(new Error("S3 error: " + err)) }, success: function(url){ resolve(url) } }) }) } function parseTemplates (data){ return Q.Promise(function(resolve, reject, notify) { engine.parseAndRender(textTemplate, data).then(function(textResult){ engine.parseAndRender(htmlTemplate, data).then(function(htmlResult){ resolve({ text: textResult, html: htmlResult }) }).catch(function(){ reject(new Error("Error building text template")) }) }).catch(function(){ reject(new Error("Error building html template")) }) }) } function sendMail (content){ var image = new PassThrough() image.path = 'face.jpg' image.end(content.image.buffer) return mg.messages.create(config.domain, { from: config.from, to: [content.email], subject: config.subject, text: content.text, html: content.html, inline: [image], }) } function storeEmail (mail){ return Q.Promise(function(resolve, reject, notify) { var data = {} data['Email'] = mail data['entry.1571194529'] = mail data['fvv'] = "1" var url = "https://docs.google.com/forms/d/e/1FAIpQLSfBdSrjLyoZwnttbeQ5v_kuW8n9k9CGWfXDSHTNixHOlvsxCg/formResponse" request({ url: url, qs: data }, function (err, response, body) { if (err || response.statusCode !== 200) { reject(err) } else { resolve() } }) }) } function storeMessage (mail, message){ return Q.Promise(function(resolve, reject, notify) { var data = {} data['Email'] = mail data['entry.1436672940'] = mail data['Message'] = message data['entry.2103257301'] = message data['fvv'] = "1" var url = "https://docs.google.com/forms/d/e/1FAIpQLSdWDnpy4ZF1dJwfAcX5CUITpjbLqLC7rS7nr2iSQrEeGXM1bQ/formResponse" request({ url: url, qs: data }, function (err, response, body) { if (err || response.statusCode !== 200) { reject(err) } else { resolve() } }) }) } this._router = router } AWMail.prototype.middleware = function () { return this._router } module.exports = AWMail