Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
112 changes: 65 additions & 47 deletions src/user/jobs.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,60 +7,78 @@ const meta = require('../meta');

const jobs = {};

module.exports = function (User) {
User.startJobs = function () {
winston.verbose('[user/jobs] (Re-)starting jobs...');
function startDigestJob({name, cronString, term, user}) {
jobs[name] = new cronJob(cronString, (async () => {
winston.verbose(`[user/jobs] Digest job (${name}) started.`);
try {
if (name === 'digest.weekly') {
const counter = await db.increment('biweeklydigestcounter');
if (counter % 2) {
await user.digest.execute({ interval: 'biweek' });
}
}
await user.digest.execute({ interval: term });
} catch (err) {
winston.error(err.stack);
}
}), null, true);
winston.verbose(`[user/jobs] Starting job (${name})`);
}

let { digestHour } = meta.config;
function startJobs(user) {
winston.verbose('[user/jobs] (Re-)starting jobs...');

// Fix digest hour if invalid
if (isNaN(digestHour)) {
digestHour = 17;
} else if (digestHour > 23 || digestHour < 0) {
digestHour = 0;
}
let { digestHour } = meta.config;

User.stopJobs();
// Fix digest hour if invalid
if (isNaN(digestHour)) {
digestHour = 17;
} else if (digestHour > 23 || digestHour < 0) {
digestHour = 0;
}

startDigestJob('digest.daily', `0 ${digestHour} * * *`, 'day');
startDigestJob('digest.weekly', `0 ${digestHour} * * 0`, 'week');
startDigestJob('digest.monthly', `0 ${digestHour} 1 * *`, 'month');
user.stopJobs();

jobs['reset.clean'] = new cronJob('0 0 * * *', User.reset.clean, null, true);
winston.verbose('[user/jobs] Starting job (reset.clean)');
startDigestJob({
name: 'digest.daily',
cronString: `0 ${digestHour} * * *`,
term: 'day',
user: user,
});
startDigestJob({
name: 'digest.weekly',
cronString: `0 ${digestHour} * * 0`,
term: 'week',
user: user,
});
startDigestJob({
name: 'digest.monthly',
cronString: `0 ${digestHour} 1 * *`,
term: 'month',
user: user,
});

winston.verbose(`[user/jobs] jobs started`);
};
jobs['reset.clean'] = new cronJob('0 0 * * *', user.reset.clean, null, true);
winston.verbose('[user/jobs] Starting job (reset.clean)');

function startDigestJob(name, cronString, term) {
jobs[name] = new cronJob(cronString, (async () => {
winston.verbose(`[user/jobs] Digest job (${name}) started.`);
try {
if (name === 'digest.weekly') {
const counter = await db.increment('biweeklydigestcounter');
if (counter % 2) {
await User.digest.execute({ interval: 'biweek' });
}
}
await User.digest.execute({ interval: term });
} catch (err) {
winston.error(err.stack);
}
}), null, true);
winston.verbose(`[user/jobs] Starting job (${name})`);
winston.verbose(`[user/jobs] jobs started`);
};

function stopJobs() {
let terminated = 0;
// Terminate any active cron jobs
for (const jobId of Object.keys(jobs)) {
winston.verbose(`[user/jobs] Terminating job (${jobId})`);
jobs[jobId].stop();
delete jobs[jobId];
terminated += 1;
}
if (terminated > 0) {
winston.verbose(`[user/jobs] ${terminated} jobs terminated`);
}
};

User.stopJobs = function () {
let terminated = 0;
// Terminate any active cron jobs
for (const jobId of Object.keys(jobs)) {
winston.verbose(`[user/jobs] Terminating job (${jobId})`);
jobs[jobId].stop();
delete jobs[jobId];
terminated += 1;
}
if (terminated > 0) {
winston.verbose(`[user/jobs] ${terminated} jobs terminated`);
}
};
module.exports = function (User) {
User.startJobs = () => startJobs(User);
User.stopJobs = () => stopJobs();
};