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;