2015-04-22 07:50:11 +09:00
|
|
|
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();
|
2015-05-01 18:22:00 +02:00
|
|
|
var after = (typeof lastCampaign !== 'undefined') ? lastCampaign.finishedAt : lastWeek
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
var params = Posts.getSubParams({
|
|
|
|
view: 'campaign',
|
|
|
|
limit: postsCount,
|
|
|
|
after: after
|
|
|
|
});
|
|
|
|
return Posts.find(params.find, params.options).fetch();
|
2015-05-01 18:22:00 +02:00
|
|
|
};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
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, {
|
2015-05-13 11:01:03 +09:00
|
|
|
authorName: Users.getDisplayName(post),
|
2015-04-22 07:50:11 +09:00
|
|
|
postLink: Posts.getLink(post),
|
|
|
|
profileUrl: Users.getProfileUrl(postUser),
|
|
|
|
postPageLink: Posts.getPageUrl(post),
|
|
|
|
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)
|
2015-05-01 18:22:00 +02:00
|
|
|
properties.domain = Telescope.utils.getDomain(post.url);
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
postsHTML += getEmailTemplate('emailPostItem')(properties);
|
|
|
|
});
|
|
|
|
|
|
|
|
// 2. Wrap posts HTML in digest template
|
|
|
|
var digestHTML = getEmailTemplate('emailDigest')({
|
|
|
|
siteName: Settings.get('title'),
|
|
|
|
date: moment().format("dddd, MMMM Do YYYY"),
|
|
|
|
content: postsHTML
|
|
|
|
});
|
|
|
|
|
|
|
|
// 3. wrap digest HTML in email wrapper template
|
|
|
|
var emailHTML = buildEmailTemplate(digestHTML);
|
|
|
|
|
|
|
|
var campaign = {
|
|
|
|
postIds: _.pluck(postsArray, '_id'),
|
|
|
|
subject: Telescope.utils.trimWords(subject, 15),
|
|
|
|
html: emailHTML
|
2015-05-01 18:22:00 +02:00
|
|
|
};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2015-05-01 18:22:00 +02:00
|
|
|
return campaign;
|
|
|
|
};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
scheduleNextCampaign = function (isTest) {
|
2015-05-01 18:22:00 +02:00
|
|
|
isTest = !! isTest;
|
2015-04-22 07:50:11 +09:00
|
|
|
var posts = getCampaignPosts(Settings.get('postsPerNewsletter', defaultPosts));
|
|
|
|
if(!!posts.length){
|
|
|
|
return scheduleCampaign(buildCampaign(posts), isTest);
|
|
|
|
}else{
|
|
|
|
var result = 'No posts to schedule today…';
|
2015-05-01 18:22:00 +02:00
|
|
|
return result;
|
2015-04-22 07:50:11 +09:00
|
|
|
}
|
2015-05-01 18:22:00 +02:00
|
|
|
};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
Meteor.methods({
|
|
|
|
sendCampaign: function () {
|
2015-04-27 17:14:07 +09:00
|
|
|
if(Users.is.adminById(this.userId))
|
2015-04-22 07:50:11 +09:00
|
|
|
return scheduleNextCampaign(false);
|
|
|
|
},
|
|
|
|
testCampaign: function () {
|
2015-04-27 17:14:07 +09:00
|
|
|
if(Users.is.adminById(this.userId))
|
2015-04-22 07:50:11 +09:00
|
|
|
return scheduleNextCampaign(true);
|
|
|
|
}
|
|
|
|
});
|