From ffcc873ef3ec38c8798ae8f988bdbfd5424fdbc8 Mon Sep 17 00:00:00 2001 From: Andris Reinman Date: Tue, 26 Apr 2016 21:14:48 +0300 Subject: [PATCH] Support URL-based archive pages --- routes/archive.js | 51 ++++++++++++++++++++++++++++++++++------------ services/sender.js | 2 +- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/routes/archive.js b/routes/archive.js index 8e08e844..8ae7348f 100644 --- a/routes/archive.js +++ b/routes/archive.js @@ -7,6 +7,7 @@ let lists = require('../lib/models/lists'); let subscriptions = require('../lib/models/subscriptions'); let tools = require('../lib/tools'); let express = require('express'); +let request = require('request'); let router = new express.Router(); router.get('/:campaign/:list/:subscription', (req, res, next) => { @@ -64,21 +65,45 @@ router.get('/:campaign/:list/:subscription', (req, res, next) => { return next(err); } - // rewrite links to count clicks - links.updateLinks(campaign, list, subscription, serviceUrl, campaign.html, (err, html) => { - if (err) { - req.flash('danger', err.message || err); - return res.redirect('/'); - } + let renderAndShow = (html, renderTags) => { - res.render('archive/view', { - layout: 'archive/layout', - message: tools.formatMessage(serviceUrl, campaign, list, subscription, html), - campaign, - list, - subscription + // rewrite links to count clicks + links.updateLinks(campaign, list, subscription, serviceUrl, html, (err, html) => { + if (err) { + req.flash('danger', err.message || err); + return res.redirect('/'); + } + + res.render('archive/view', { + layout: 'archive/layout', + message: renderTags ? tools.formatMessage(serviceUrl, campaign, list, subscription, html) : html, + campaign, + list, + subscription + }); }); - }); + }; + + if (campaign.templateUrl) { + let form = tools.getMessageLinks(serviceUrl, campaign, list, subscription); + Object.keys(subscription.mergeTags).forEach(key => { + form[key] = subscription.mergeTags[key]; + }); + request.post({ + url: campaign.templateUrl, + form + }, (err, httpResponse, body) => { + if (err) { + return next(err); + } + if (httpResponse.statusCode !== 200) { + return next(new Error('Received status code ' + httpResponse.statusCode + ' from ' + campaign.templateUrl)); + } + renderAndShow(body && body.toString(), false); + }); + } else { + renderAndShow(campaign.html, true); + } }); }); }); diff --git a/services/sender.js b/services/sender.js index 314998b7..0dd18a7a 100644 --- a/services/sender.js +++ b/services/sender.js @@ -227,7 +227,7 @@ function formatMessage(message, callback) { }); }; - if (!campaign.template && campaign.templateUrl) { + if (campaign.templateUrl) { let form = tools.getMessageLinks(configItems.serviceUrl, campaign, list, message.subscription); Object.keys(message.subscription.mergeTags).forEach(key => { form[key] = message.subscription.mergeTags[key];