Select Git revision
schedule.js
schedule.js 5.23 KiB
const later = require('later');
const moment = require('moment-timezone');
module.exports = {
hasValidTimezone,
hasValidSchedule,
isScheduledNow,
};
function fixShortHours(input) {
return input.replace(/( \d?\d)((a|p)m)/g, '$1:00$2');
}
function hasValidTimezone(timezone) {
if (!moment.tz.zone(timezone)) {
return [false, `Invalid timezone: ${timezone}`];
}
return [true];
}
function hasValidSchedule(schedule) {
let message;
// check if any of the schedules fail to parse
const hasFailedSchedules = schedule.some(scheduleText => {
const massagedText = fixShortHours(scheduleText);
const parsedSchedule = later.parse.text(massagedText);
if (parsedSchedule.error !== -1) {
message = `Failed to parse schedule "${scheduleText}"`;
// It failed to parse
return true;
}
if (parsedSchedule.schedules.some(s => s.m)) {
message = `Schedule "${scheduleText}" should not specify minutes`;
return true;
}
if (
!parsedSchedule.schedules.some(
s => s.d !== undefined || s.D || s.t_a !== undefined || s.t_b
)
) {
message = `Schedule "${scheduleText}" has no days of week or time of day`;
return true;
}
// It must be OK
return false;
});
if (hasFailedSchedules) {
// If any fail then we invalidate the whole thing
return [false, message];
}
return [true];
}
function isScheduledNow(config) {
let configSchedule = config.schedule;
logger.debug(
{ schedule: configSchedule, timezone: config.timezone },
`Checking schedule`
);
if (
!configSchedule ||
configSchedule.length === 0 ||
configSchedule[0] === ''
) {
logger.debug('No schedule defined');
return true;
}
if (!Array.isArray(configSchedule)) {
logger.warn(
`config schedule is not an array: ${JSON.stringify(configSchedule)}`