2016-11-26 02:46:55 +08:00
|
|
|
import { SyncedCron } from 'meteor/percolatestudio:synced-cron';
|
2016-06-28 17:33:30 +09:00
|
|
|
import moment from 'moment';
|
2017-04-11 10:27:35 +09:00
|
|
|
import Newsletters from '../modules/collection.js';
|
2017-09-22 12:24:15 +02:00
|
|
|
import { getSetting, registerSetting } from 'meteor/vulcan:core';
|
2016-04-05 11:03:53 +09:00
|
|
|
|
2016-07-07 12:49:57 +09:00
|
|
|
const defaultFrequency = [1]; // every monday
|
|
|
|
const defaultTime = '00:00'; // GMT
|
|
|
|
|
2017-09-22 12:24:15 +02:00
|
|
|
registerSetting('newsletter.frequency', defaultFrequency, 'Which days to send the newsletter on (1 = Monday, 7 = Sunday)');
|
|
|
|
registerSetting('newsletter.time', defaultTime, 'Time to send the newsletter on (ex: “16:30”)');
|
|
|
|
registerSetting('newsletter.enabledInDev', false, 'Enable the newsletter in development');
|
|
|
|
registerSetting('newsletter.enabled', true, 'Enable the newsletter');
|
|
|
|
|
2015-04-22 07:50:11 +09:00
|
|
|
SyncedCron.options = {
|
2016-06-28 17:33:30 +09:00
|
|
|
log: true,
|
2015-04-22 07:50:11 +09:00
|
|
|
collectionName: 'cronHistory',
|
|
|
|
utc: false,
|
|
|
|
collectionTTL: 172800
|
2015-05-01 18:22:00 +02:00
|
|
|
};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
2016-06-28 17:33:30 +09:00
|
|
|
const addZero = num => {
|
|
|
|
return num < 10 ? "0"+num : num;
|
|
|
|
};
|
|
|
|
|
2015-04-22 07:50:11 +09:00
|
|
|
var getSchedule = function (parser) {
|
2017-09-22 12:24:15 +02:00
|
|
|
var frequency = getSetting('newsletter.frequency', defaultFrequency);
|
2015-04-22 07:50:11 +09:00
|
|
|
var recur = parser.recur();
|
|
|
|
var schedule;
|
|
|
|
|
2015-06-23 22:40:43 -04:00
|
|
|
// Default is once a week (Mondays)
|
|
|
|
if (!!frequency) {
|
2017-08-09 19:20:21 +09:00
|
|
|
const frequencyArray = Array.isArray(frequency) ? frequency : _.toArray(frequency);
|
|
|
|
schedule = recur.on(frequencyArray).dayOfWeek();
|
2015-04-22 07:50:11 +09:00
|
|
|
}
|
2015-06-23 22:40:43 -04:00
|
|
|
else {
|
|
|
|
schedule = recur.on(2).dayOfWeek();
|
|
|
|
}
|
|
|
|
|
2016-06-28 17:33:30 +09:00
|
|
|
const offsetInMinutes = new Date().getTimezoneOffset();
|
2017-09-22 12:24:15 +02:00
|
|
|
const GMTtime = moment.duration(getSetting('newsletter.time', defaultTime));
|
2016-06-28 17:33:30 +09:00
|
|
|
const serverTime = GMTtime.subtract(offsetInMinutes, "minutes");
|
|
|
|
const serverTimeString = addZero(serverTime.hours()) + ":" + addZero(serverTime.minutes());
|
|
|
|
|
2016-12-12 15:00:56 +09:00
|
|
|
// console.log("// scheduled for: (GMT): "+getSetting('newsletterTime', defaultTime));
|
2016-07-19 15:13:16 +09:00
|
|
|
// console.log("// server offset (minutes): "+offsetInMinutes);
|
|
|
|
// console.log("// server scheduled time (minutes): "+serverTime.asMinutes());
|
|
|
|
// console.log("// server scheduled time: "+serverTimeString);
|
2016-06-28 17:33:30 +09:00
|
|
|
|
|
|
|
return schedule.on(serverTimeString).time();
|
2015-05-01 18:22:00 +02:00
|
|
|
};
|
2015-04-22 07:50:11 +09:00
|
|
|
|
|
|
|
Meteor.methods({
|
|
|
|
getNextJob: function () {
|
|
|
|
var nextJob = SyncedCron.nextScheduledAtDate('scheduleNewsletter');
|
2016-11-26 02:46:55 +08:00
|
|
|
console.log(nextJob); // eslint-disable-line
|
2015-04-22 07:50:11 +09:00
|
|
|
return nextJob;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
var addJob = function () {
|
|
|
|
SyncedCron.add({
|
|
|
|
name: 'scheduleNewsletter',
|
|
|
|
schedule: function(parser) {
|
|
|
|
// parser is a later.parse object
|
|
|
|
return getSchedule(parser);
|
|
|
|
},
|
|
|
|
job: function() {
|
2015-10-13 10:00:29 +09:00
|
|
|
// only schedule newsletter campaigns in production
|
2017-09-22 12:24:15 +02:00
|
|
|
if (process.env.NODE_ENV === 'production' || getSetting('newsletter.enabledInDev', false)) {
|
2016-11-26 02:46:55 +08:00
|
|
|
console.log("// Scheduling newsletter…"); // eslint-disable-line
|
|
|
|
console.log(new Date()); // eslint-disable-line
|
2017-04-11 10:49:54 +09:00
|
|
|
Newsletters.send();
|
2015-10-13 10:00:29 +09:00
|
|
|
}
|
2015-04-22 07:50:11 +09:00
|
|
|
}
|
|
|
|
});
|
2015-05-01 18:22:00 +02:00
|
|
|
};
|
2016-04-05 11:03:53 +09:00
|
|
|
|
2015-04-22 07:50:11 +09:00
|
|
|
Meteor.startup(function () {
|
2017-09-22 12:24:15 +02:00
|
|
|
if (getSetting('newsletter.enabled', true)) {
|
2015-04-22 07:50:11 +09:00
|
|
|
addJob();
|
|
|
|
}
|
|
|
|
});
|