From 9f7115217c34732753102e044a94711400b5affc Mon Sep 17 00:00:00 2001 From: eug-vs Date: Fri, 27 Nov 2020 22:41:25 +0300 Subject: feat: use cron to schedule jobs --- src/services/events/event.model.js | 55 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 src/services/events/event.model.js (limited to 'src/services/events/event.model.js') diff --git a/src/services/events/event.model.js b/src/services/events/event.model.js new file mode 100644 index 0000000..ef86572 --- /dev/null +++ b/src/services/events/event.model.js @@ -0,0 +1,55 @@ +const cron = require('cron'); +const Bluebird = require('bluebird'); +const { model } = require('mongoose'); +const schema = require('./event.schema.js'); + +const CronJob = cron.CronJob; + +schema.methods.computeNextRunAt = function() { + const job = new CronJob(this.schedule); + const nextRunAt = job.nextDates(); + return new Date(nextRunAt); +}; + +schema.pre('save', function(next) { + this.nextRunAt = this.computeNextRunAt(); + next(); +}); + +schema.statics.rescheduleOldEvents = async function () { + console.log('Reschedule old events'); + const oldEvents = await this.find({ + nextRunAt: { + // TODO: skip single-fire events + $lt: new Date() + }, + }); + + // Saving events triggers computing new nextRunAt + return Bluebird.map(oldEvents, event => event.save()); +}; + +schema.statics.findNextEvent = function () { + return this.findOne( + { + nextRunAt: { + $exists: 1, + $gt: new Date() + }, + }, + null, + { + sort: { + nextRunAt: 1 + } + } + ) +}; + +const Model = model('Event', schema); + + +module.exports = Model; + + + -- cgit v1.2.3