diff --git a/lib/feed.js b/lib/feed.js new file mode 100644 index 00000000..54c345fb --- /dev/null +++ b/lib/feed.js @@ -0,0 +1,56 @@ +'use strict'; + +let FeedParser = require('feedparser'); +let request = require('request'); + +module.exports.fetch = (url, callback) => { + let req = request(url); + let feedparser = new FeedParser(); + let returned = false; + + req.setHeader('user-agent', 'Mailtrain'); + req.setHeader('accept', 'text/html,application/xhtml+xml'); + + req.on('error', err => { + if (returned) { + return; + } + returned = true; + callback(err); + }); + + req.on('response', res => { + if (returned) { + return; + } + + if (res.statusCode !== 200) { + return req.emit('error', new Error('Bad status code')); + } + + req.pipe(feedparser); + }); + + feedparser.on('error', err => { + if (returned) { + return; + } + returned = true; + callback(err); + }); + + feedparser.on('readable', () => { + // This is where the action is! + let meta = feedparser.meta; + let item; + + while ((item = feedparser.read())) { + //console.log(require('util').inspect(item, false, 22)); + console.log(item.title); + console.log(item.description || item.summary); + console.log('--------'); + } + }); +}; + +module.exports.fetch('https://andris9.wordpress.com/feed/', console.log); diff --git a/lib/models/campaigns.js b/lib/models/campaigns.js index 641513d1..bacae16e 100644 --- a/lib/models/campaigns.js +++ b/lib/models/campaigns.js @@ -200,6 +200,15 @@ module.exports.create = (campaign, callback) => { campaign.segment = 0; } + switch ((campaign.type || '').toString().trim().toLowerCase()) { + case 'rss': + campaign.type = 2; + break; + case 'normal': + default: + campaign.type = 1; + } + campaign.template = Number(campaign.template) || 0; if (!name) { @@ -261,7 +270,9 @@ module.exports.create = (campaign, callback) => { }); }; - if (campaign.template) { + if (campaign.type === 2) { + create(); + } else if (campaign.template) { templates.get(campaign.template, (err, template) => { if (err) { return callback(err); diff --git a/package.json b/package.json index 5a5d129a..9cab6f3f 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "escape-html": "^1.0.3", "express": "^4.13.4", "express-session": "^1.13.0", + "feedparser": "^1.1.4", "geoip-ultralight": "^0.1.3", "handlebars": "^4.0.5", "hbs": "^4.0.0", diff --git a/routes/campaigns.js b/routes/campaigns.js index 8b126361..78e141c9 100644 --- a/routes/campaigns.js +++ b/routes/campaigns.js @@ -83,7 +83,15 @@ router.get('/create', passport.csrfProtection, (req, res) => { data.address = data.address || configItems.defaultAddress; data.subject = data.subject || configItems.defaultSubject; - res.render('campaigns/create', data); + let view; + switch (req.query.type) { + case 'rss': + view = 'campaigns/create-rss'; + break; + default: + view = 'campaigns/create'; + } + res.render(view, data); }); }); }); @@ -96,7 +104,7 @@ router.post('/create', passport.parseForm, passport.csrfProtection, (req, res) = return res.redirect('/campaigns/create?' + tools.queryParams(req.body)); } req.flash('success', 'Campaign “' + req.body.name + '” created'); - res.redirect('/campaigns/edit/' + id + '?tab=template'); + res.redirect('/campaigns/view/' + id); }); }); @@ -139,7 +147,17 @@ router.get('/edit/:id', passport.csrfProtection, (req, res, next) => { campaign.showGeneral = req.query.tab === 'general' || !req.query.tab; campaign.showTemplate = req.query.tab === 'template'; - res.render('campaigns/edit', campaign); + let view; + switch (campaign.type) { + case 2: //rss + view = 'campaigns/edit-rss'; + break; + case 1: + default: + view = 'campaigns/edit'; + } + + res.render(view, campaign); }); }); }); @@ -209,7 +227,7 @@ router.post('/ajax', (req, res) => { recordsFiltered: filteredTotal, data: data.map((row, i) => [ (Number(req.body.start) || 0) + 1 + i, - ' ' + htmlescape(row.name || '') + '', + ' ' + htmlescape(row.name || '') + '', htmlescape(striptags(row.description) || ''), getStatusText(row), '' + row.created.toISOString() + '' diff --git a/views/campaigns/campaigns.hbs b/views/campaigns/campaigns.hbs index 29aba51d..d2a70731 100644 --- a/views/campaigns/campaigns.hbs +++ b/views/campaigns/campaigns.hbs @@ -4,7 +4,15 @@
- Create Campaign +
+ + +

Campaigns

diff --git a/views/campaigns/create-rss.hbs b/views/campaigns/create-rss.hbs new file mode 100644 index 00000000..df6de899 --- /dev/null +++ b/views/campaigns/create-rss.hbs @@ -0,0 +1,96 @@ + + +

Create RSS Campaign

+ +
+ +
+
+ RSS campaign sets up a tracker against selected RSS feed address. Whenever a new entry is found from this feed it is sent to selected list as an email message. +
+
+ +
+ + + +
+ +
+ +
+
+ +
+ +
+ + HTML is allowed +
+
+ +
+ +
+ +
+
+ +
+ +
+ + New entries from this RSS URL are sent out to list subscribers as email messages +
+
+ +
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ +
+ +
+
+ +
+
+
diff --git a/views/campaigns/create.hbs b/views/campaigns/create.hbs index 02f62331..66cdf2bc 100644 --- a/views/campaigns/create.hbs +++ b/views/campaigns/create.hbs @@ -10,6 +10,7 @@
+
diff --git a/views/campaigns/edit-rss.hbs b/views/campaigns/edit-rss.hbs new file mode 100644 index 00000000..68f7b4a5 --- /dev/null +++ b/views/campaigns/edit-rss.hbs @@ -0,0 +1,111 @@ + + +

Edit RSS Campaign View campaign

+ +
+ +
+
+ RSS campaign sets up a tracker against selected RSS feed address. Whenever a new entry is found from this feed it is sent to selected list as an email message. +
+
+ + + + + + +
+ + + +
+ + General Settings + + +
+ +
+ +
+
+ +
+ +
+ + HTML is allowed +
+
+ +
+ +
+ +
+
+ +
+ +
+ + New entries from this RSS URL are sent out to list subscribers as email messages +
+
+ +
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+