Campaign preview and campaign test send pulls the first entry in the RSS feed and substitutes its data in `[RSS_ENTRY_*]`
This commit is contained in:
Tomas Bures 2019-08-11 16:28:11 +02:00
parent 588cf34810
commit 8cb24feca1
11 changed files with 262 additions and 57 deletions

View file

@ -5,6 +5,8 @@ const log = require('./log');
const path = require('path');
const senders = require('./senders');
const bluebird = require('bluebird');
const feedparser = require('feedparser-promised');
const {getPublicUrl} = require('./urls');
let messageTid = 0;
let feedcheckProcess;
@ -42,5 +44,79 @@ function scheduleCheck() {
messageTid++;
}
async function fetch(url) {
const httpOptions = {
uri: url,
headers: {
'user-agent': 'Mailtrain',
'accept': 'text/html,application/xhtml+xml'
}
};
const items = await feedparser.parse(httpOptions);
const entries = [];
for (const item of items) {
const entry = {
title: item.title,
date: item.date || item.pubdate || item.pubDate || new Date(),
guid: item.guid || item.link,
link: item.link,
content: item.description || item.summary,
summary: item.summary || item.description,
imageUrl: item.image.url,
};
if ('mt:entries-json' in item) {
entry.customTags = JSON.parse(item['mt:entries-json']['#'])
}
entries.push(entry);
}
return entries;
}
async function getEntryForPreview(url) {
const entries = await fetch(url);
let entry;
if (entries.length === 0) {
entry = {
title: "Lorem Ipsum",
date: new Date(),
guid: "c21bc6c8-d351-4000-aa1f-e7ff928084cd",
link: "http://www.example.com/sample-item.html",
content: "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer gravida a purus in commodo. Sed risus eros, pharetra sit amet sagittis vel, porta nec magna. Sed sollicitudin blandit ornare. Pellentesque a lacinia dui. Etiam ullamcorper, nisl at pharetra fringilla, enim nunc blandit quam, nec vestibulum purus lorem in urna.",
summary: "Aliquam malesuada nibh eget arcu egestas, id pellentesque urna egestas. Phasellus lacus est, viverra in dolor quis, aliquet elementum nisi. Donec hendrerit elit pretium vehicula pharetra. Pellentesque aliquam elit id rutrum imperdiet. Phasellus ac enim at lacus sodales condimentum vitae quis sapien.",
imageUrl: getPublicUrl('static/mailtrain-notext.png'),
customTags: {
placerat: "Ligula at consequat",
accumsan: {
mauris: "Placerat nec justo",
ornare: "Nunc egestas"
},
fringilla: 42,
purus: [
{
consequat: "Vivamus",
enim: "volutpat blandit"
},
{
consequat: "Phasellus",
enim: "sed semper"
}
]
}
};
} else {
entry = entries[0];
}
return entry;
}
module.exports.spawn = bluebird.promisify(spawn);
module.exports.scheduleCheck = scheduleCheck;
module.exports.scheduleCheck = scheduleCheck;
module.exports.fetch = fetch;
module.exports.getEntryForPreview = getEntryForPreview;

View file

@ -43,7 +43,7 @@ class MessageSender {
Option #1
- settings.type in [MessageType.REGULAR, MessageType.TRIGGERED, MessageType.TEST]
- campaignCid / campaignId
- campaign / campaignCid / campaignId
- listId / listCid [optional if campaign is provided]
- sendConfigurationId [optional if campaign is provided]
- attachments [optional]
@ -68,7 +68,9 @@ class MessageSender {
if (this.type === MessageType.REGULAR || this.type === MessageType.TRIGGERED || this.type === MessageType.TEST) {
this.isMassMail = true;
if (settings.campaignCid) {
if (settings.campaign) {
this.campaign = settings.campaign;
} else if (settings.campaignCid) {
this.campaign = await campaigns.rawGetByTx(tx, 'cid', settings.campaignCid);
} else if (settings.campaignId) {
this.campaign = await campaigns.rawGetByTx(tx, 'id', settings.campaignId);
@ -155,6 +157,12 @@ class MessageSender {
this.tagLanguage = this.campaign.data.sourceCustom.tag_language;
}
if (settings.rssEntry !== undefined) {
this.rssEntry = settings.rssEntry;
} else if (this.campaign && this.campaign.data.rssEntry) {
this.rssEntry = this.campaign.data.rssEntry;
}
enforce(this.renderedHtml || (this.campaign && this.campaign.source === CampaignSource.URL) || this.tagLanguage);
if (settings.subject !== undefined) {
@ -245,11 +253,11 @@ class MessageSender {
};
}
_getExtraTags(campaign) {
_getExtraTags() {
const tags = {};
if (campaign && campaign.type === CampaignType.RSS_ENTRY) {
const rssEntry = campaign.data.rssEntry;
if (this.rssEntry) {
const rssEntry = this.rssEntry;
tags['RSS_ENTRY_TITLE'] = rssEntry.title;
tags['RSS_ENTRY_DATE'] = rssEntry.date;
tags['RSS_ENTRY_LINK'] = rssEntry.link;
@ -311,7 +319,7 @@ class MessageSender {
const flds = this.listsFieldsGrouped.get(list.id);
if (!mergeTags) {
mergeTags = fields.getMergeTags(flds, subscriptionGrouped, this._getExtraTags(campaign));
mergeTags = fields.getMergeTags(flds, subscriptionGrouped, this._getExtraTags());
}
for (const fld of flds) {
@ -539,7 +547,8 @@ async function sendQueuedMessage(queuedMessage) {
subject: msgData.subject,
tagLanguage: msgData.tagLanguage,
renderedHtml: msgData.renderedHtml,
renderedText: msgData.renderedText
renderedText: msgData.renderedText,
rssEntry: msgData.rssEntry
});
const campaign = cs.campaign;
@ -696,9 +705,9 @@ async function queueSubscriptionMessage(sendConfigurationId, to, subject, encryp
senders.scheduleCheck();
}
async function getMessage(campaignCid, listCid, subscriptionCid) {
async function getMessage(campaignCid, listCid, subscriptionCid, settings) {
const cs = new MessageSender();
await cs._init({type: MessageType.REGULAR, campaignCid, listCid});
await cs._init({type: MessageType.REGULAR, campaignCid, listCid, ...settings});
const campaign = cs.campaign;
const list = cs.listsByCid.get(listCid);
@ -732,7 +741,7 @@ async function getMessage(campaignCid, listCid, subscriptionCid) {
}
const flds = cs.listsFieldsGrouped.get(list.id);
const mergeTags = fields.getMergeTags(flds, subscriptionGrouped, cs._getExtraTags(campaign));
const mergeTags = fields.getMergeTags(flds, subscriptionGrouped, cs._getExtraTags());
return await cs._getMessage(mergeTags, list, subscriptionGrouped, false);
}