Vulcan/packages/telescope-newsletter/lib/server/campaign.js

91 lines
2.7 KiB
JavaScript
Raw Normal View History

defaultFrequency = 7;
defaultPosts = 5;
getCampaignPosts = function (postsCount) {
// look for last scheduled campaign in the database
var lastCampaign = SyncedCron._collection.findOne({name: 'Schedule newsletter'}, {sort: {finishedAt: -1}, limit: 1});
// if there is a last campaign use its date, else default to posts from the last 7 days
var lastWeek = moment().subtract(7, 'days').toDate();
var after = (typeof lastCampaign !== 'undefined') ? lastCampaign.finishedAt : lastWeek
var params = Posts.getSubParams({
view: 'campaign',
limit: postsCount,
after: after
});
return Posts.find(params.find, params.options).fetch();
};
buildCampaign = function (postsArray) {
var postsHTML = '', subject = '';
// 1. Iterate through posts and pass each of them through a handlebars template
postsArray.forEach(function (post, index) {
if(index > 0)
subject += ', ';
subject += post.title;
var postUser = Meteor.users.findOne(post.userId);
// the naked post object as stored in the database is missing a few properties, so let's add them
var properties = _.extend(post, {
authorName: post.getAuthorName(),
2015-06-19 09:48:59 +09:00
postLink: Posts.getLink(post, true),
profileUrl: Users.getProfileUrl(postUser, true),
2015-06-19 09:48:59 +09:00
postPageLink: Posts.getPageUrl(post, true),
date: moment(post.postedAt).format("MMMM D YYYY")
});
if (post.body)
properties.body = marked(Telescope.utils.trimWords(post.body, 20)).replace('<p>', '').replace('</p>', ''); // remove p tags
if(post.url)
properties.domain = Telescope.utils.getDomain(post.url);
2015-05-13 11:52:00 +09:00
postsHTML += Telescope.email.getTemplate('emailPostItem')(properties);
});
// 2. Wrap posts HTML in digest template
2015-05-13 11:52:00 +09:00
var digestHTML = Telescope.email.getTemplate('emailDigest')({
siteName: Settings.get('title'),
date: moment().format("dddd, MMMM Do YYYY"),
content: postsHTML
});
// 3. wrap digest HTML in email wrapper template
2015-05-13 11:52:00 +09:00
var emailHTML = Telescope.email.buildTemplate(digestHTML);
var campaign = {
postIds: _.pluck(postsArray, '_id'),
subject: Telescope.utils.trimWords(subject, 15),
html: emailHTML
};
return campaign;
};
scheduleNextCampaign = function (isTest) {
isTest = !! isTest;
var posts = getCampaignPosts(Settings.get('postsPerNewsletter', defaultPosts));
if(!!posts.length){
return scheduleCampaign(buildCampaign(posts), isTest);
}else{
var result = 'No posts to schedule today…';
return result;
}
};
Meteor.methods({
sendCampaign: function () {
2015-04-27 17:14:07 +09:00
if(Users.is.adminById(this.userId))
return scheduleNextCampaign(false);
},
testCampaign: function () {
2015-04-27 17:14:07 +09:00
if(Users.is.adminById(this.userId))
return scheduleNextCampaign(true);
}
});