From 84869dafa709cbf179c85e8adacfd88bfd0b6003 Mon Sep 17 00:00:00 2001 From: Andris Reinman Date: Wed, 4 May 2016 19:11:41 +0300 Subject: [PATCH] v1.4.1 --- CHANGELOG.txt | 4 +++ lib/models/campaigns.js | 47 ++++++++++++++++++++-------------- package.json | 2 +- services/feedcheck.js | 11 ++++++-- views/campaigns/create-rss.hbs | 7 +---- views/campaigns/edit-rss.hbs | 20 ++++++++++----- views/emails/rss-html.hbs | 24 +++++++++++++++++ 7 files changed, 81 insertions(+), 34 deletions(-) create mode 100644 views/emails/rss-html.hbs diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 0bbe13d4..92bddfb4 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,5 +1,9 @@ # Changelog +## 1.4.1 2016-05-04 + + * Added support for RSS templates + ## 1.4.0 2016-05-04 * Added support for RSS campaigns diff --git a/lib/models/campaigns.js b/lib/models/campaigns.js index efa911a8..6c16c27d 100644 --- a/lib/models/campaigns.js +++ b/lib/models/campaigns.js @@ -10,6 +10,7 @@ let shortid = require('shortid'); let isUrl = require('is-url'); let feed = require('../feed'); let log = require('npmlog'); +let mailer = require('../mailer'); let allowedKeys = ['description', 'from', 'address', 'subject', 'template', 'source_url', 'list', 'segment', 'html', 'text']; @@ -323,36 +324,44 @@ module.exports.create = (campaign, opts, callback) => { return callback(err); } - create((err, campaignId) => { + mailer.getTemplate('emails/rss-html.hbs', (err, rendererHtml) => { if (err) { return callback(err); } - if (!campaignId || !entries.length) { - return callback(null, campaignId); - } - db.getConnection((err, connection) => { + campaign.html = rendererHtml(); + + create((err, campaignId) => { if (err) { return callback(err); } + if (!campaignId || !entries.length) { + return callback(null, campaignId); + } - // store references to already existing feed entries - // this is needed to detect new entries - let query = 'INSERT IGNORE INTO `rss` (`parent`,`guid`,`pubdate`) VALUES ' + entries.map(() => '(?,?,?)').join(','); - - values = []; - entries.forEach(entry => { - values.push(campaignId, entry.guid, entry.date); - }); - - connection.query(query, values, err => { - connection.release(); + db.getConnection((err, connection) => { if (err) { - // too late to report as failed - log.error('RSS', err); + return callback(err); } - return callback(null, campaignId); + // store references to already existing feed entries + // this is needed to detect new entries + let query = 'INSERT IGNORE INTO `rss` (`parent`,`guid`,`pubdate`) VALUES ' + entries.map(() => '(?,?,?)').join(','); + + values = []; + entries.forEach(entry => { + values.push(campaignId, entry.guid, entry.date); + }); + + connection.query(query, values, err => { + connection.release(); + if (err) { + // too late to report as failed + log.error('RSS', err); + } + + return callback(null, campaignId); + }); }); }); }); diff --git a/package.json b/package.json index 1067c142..552d751e 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mailtrain", "private": true, - "version": "1.4.0", + "version": "1.4.1", "description": "Self hosted email newsletter app", "main": "index.js", "scripts": { diff --git a/services/feedcheck.js b/services/feedcheck.js index 660bcc63..4ffae847 100644 --- a/services/feedcheck.js +++ b/services/feedcheck.js @@ -15,7 +15,7 @@ function feedLoop() { return setTimeout(feedLoop, 15 * 1000); } - let query = 'SELECT `id`, `source_url`, `from`, `address`, `subject`, `list`, `segment` FROM `campaigns` WHERE `type`=2 AND `status`=6 AND (`last_check` IS NULL OR `last_check`< NOW() - INTERVAL 10 MINUTE) LIMIT 1'; + let query = 'SELECT `id`, `source_url`, `from`, `address`, `subject`, `list`, `segment`, `html` FROM `campaigns` WHERE `type`=2 AND `status`=6 AND (`last_check` IS NULL OR `last_check`< NOW() - INTERVAL 10 MINUTE) LIMIT 1'; connection.query(query, (err, rows) => { connection.release(); @@ -125,6 +125,13 @@ function checkEntries(parent, entries, callback) { } let entryId = result.insertId; + let html = (parent.html || '').toString().trim(); + + if (/\[RSS_ENTRY\]/i.test(html)) { + html = html.replace(/\[RSS_ENTRY\]/, entry.content); + } else { + html = entry.content + html; + } let campaign = { type: 'entry', @@ -134,7 +141,7 @@ function checkEntries(parent, entries, callback) { subject: entry.title || parent.subject, list: parent.list, segment: parent.segment, - html: entry.content + html }; campaigns.create(campaign, { diff --git a/views/campaigns/create-rss.hbs b/views/campaigns/create-rss.hbs index a6e863a9..53678caf 100644 --- a/views/campaigns/create-rss.hbs +++ b/views/campaigns/create-rss.hbs @@ -73,18 +73,13 @@ +
-
- -
- -
-

diff --git a/views/campaigns/edit-rss.hbs b/views/campaigns/edit-rss.hbs index 253f57c2..69e39371 100644 --- a/views/campaigns/edit-rss.hbs +++ b/views/campaigns/edit-rss.hbs @@ -76,6 +76,20 @@ +
+ +
+ {{#if disableWysiwyg}} +
{{html}}
+ + {{else}} + + {{/if}} + Use special merge tag [RSS_ENTRY] to mark the position for the RSS post content. Additionally you can use any valid merge tag as well. + +
+
+
@@ -90,12 +104,6 @@
-
- -
- -
-

diff --git a/views/emails/rss-html.hbs b/views/emails/rss-html.hbs new file mode 100644 index 00000000..d4101c64 --- /dev/null +++ b/views/emails/rss-html.hbs @@ -0,0 +1,24 @@ + + + + + + + + + +
+ [RSS_ENTRY] +
+ +

+ Preferences +   |   + Unsubscribe +   |   + View this email in your browser +

+ + + +