diff options
| -rw-r--r-- | index.js | 2 | ||||
| -rw-r--r-- | package-lock.json | 71 | ||||
| -rw-r--r-- | package.json | 1 | ||||
| -rw-r--r-- | src/connectDb.js | 6 | ||||
| -rw-r--r-- | src/services/events/event.model.js | 82 | ||||
| -rw-r--r-- | src/services/events/event.schema.js | 22 | ||||
| -rw-r--r-- | src/services/events/event.service.js | 71 | ||||
| -rw-r--r-- | src/services/events/log.service.js (renamed from src/services/logs/log.service.js) | 2 | ||||
| -rw-r--r-- | src/services/events/models.js | 7 | ||||
| -rw-r--r-- | src/services/index.js | 2 | ||||
| -rw-r--r-- | src/services/logs/log.model.js | 7 | ||||
| -rw-r--r-- | src/services/logs/log.schema.js | 7 | 
12 files changed, 91 insertions, 189 deletions
| @@ -1,7 +1,7 @@  require('dotenv').config();  const app = require('./src/app.js'); -const { connectDb } = require('./src/connectDb.js'); +const connectDb = require('./src/connectDb.js');  const PORT = process.env.PORT || 3030; diff --git a/package-lock.json b/package-lock.json index 71eb5c5..80ced05 100644 --- a/package-lock.json +++ b/package-lock.json @@ -124,6 +124,14 @@          "@types/node": "*"        }      }, +    "@types/bson": { +      "version": "4.0.3", +      "resolved": "https://registry.npmjs.org/@types/bson/-/bson-4.0.3.tgz", +      "integrity": "sha512-mVRvYnTOZJz3ccpxhr3wgxVmSeiYinW+zlzQz3SXWaJmD1DuL05Jeq7nKw3SnbKmbleW5qrLG5vdyWe/A9sXhw==", +      "requires": { +        "@types/node": "*" +      } +    },      "@types/connect": {        "version": "3.4.33",        "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.33.tgz", @@ -174,6 +182,15 @@        "resolved": "https://registry.npmjs.org/@types/mime/-/mime-2.0.3.tgz",        "integrity": "sha512-Jus9s4CDbqwocc5pOAnh8ShfrnMcPHuJYzVcSUU7lrh8Ni5HuIqX3oilL86p3dlTrk0LzHRCgA/GQ7uNCw6l2Q=="      }, +    "@types/mongodb": { +      "version": "3.6.0", +      "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.0.tgz", +      "integrity": "sha512-5PGiTXS/tvvllyyD+LJt3bVyJixrY/ZIIJwsINnZorvJsN6gki4NH7Fhcep4MZF8HNCKNv2oWguysocS1jt9dw==", +      "requires": { +        "@types/bson": "*", +        "@types/node": "*" +      } +    },      "@types/node": {        "version": "14.14.7",        "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.7.tgz", @@ -1038,6 +1055,60 @@          "moment": ">= 2.9.0"        }      }, +    "mongo-cronjob": { +      "version": "0.1.2", +      "resolved": "https://registry.npmjs.org/mongo-cronjob/-/mongo-cronjob-0.1.2.tgz", +      "integrity": "sha512-WS5rpMXK0cJykRaNaHPRd2baK4Yl9+5vYVlmZjscaEPZqRKvL5CynA0yvfMlVOTdKHNgpQHN8T/wlO/fwtCXnw==", +      "requires": { +        "bluebird": "^3.7.2", +        "cron": "^1.8.2", +        "mongoose": "^5.11.1" +      }, +      "dependencies": { +        "mongoose": { +          "version": "5.11.3", +          "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.11.3.tgz", +          "integrity": "sha512-qhL76i63E6YZ16uyrDFV39qh8Jyq1cserYgAOjdpFzOIKvxAQfAEx/UC+S9MYwQhwC3tbElN9G6WTZvtfC1q+g==", +          "requires": { +            "@types/mongodb": "^3.5.27", +            "bson": "^1.1.4", +            "kareem": "2.3.1", +            "mongodb": "3.6.3", +            "mongoose-legacy-pluralize": "1.0.2", +            "mpath": "0.8.0", +            "mquery": "3.2.2", +            "ms": "2.1.2", +            "regexp-clone": "1.0.0", +            "safe-buffer": "5.2.1", +            "sift": "7.0.1", +            "sliced": "1.0.1" +          } +        }, +        "mpath": { +          "version": "0.8.0", +          "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.8.0.tgz", +          "integrity": "sha512-slIifXzF6pBxKpPV47ScgqWfGgkpwZNy55fY/umDrgmAxjWMz/WYzYsd8cThU49kw0rLyPWTZaWrOlazaeW57Q==" +        }, +        "safe-buffer": { +          "version": "5.2.1", +          "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", +          "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" +        } +      } +    }, +    "mongodb": { +      "version": "3.6.3", +      "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.6.3.tgz", +      "integrity": "sha512-rOZuR0QkodZiM+UbQE5kDsJykBqWi0CL4Ec2i1nrGrUI3KO11r6Fbxskqmq3JK2NH7aW4dcccBuUujAP0ERl5w==", +      "requires": { +        "bl": "^2.2.1", +        "bson": "^1.1.4", +        "denque": "^1.4.1", +        "require_optional": "^1.0.1", +        "safe-buffer": "^5.1.2", +        "saslprep": "^1.0.0" +      } +    },      "mongoose": {        "version": "5.10.14",        "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.10.14.tgz", diff --git a/package.json b/package.json index cbd2602..0399ac1 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@      "dotenv": "^8.2.0",      "feathers-mongoose": "^8.3.1",      "lodash": "^4.17.20", +    "mongo-cronjob": "^0.1.2",      "mongoose": "^5.10.14",      "puppeteer": "^5.4.1"    } diff --git a/src/connectDb.js b/src/connectDb.js index c7ad13b..416ae1d 100644 --- a/src/connectDb.js +++ b/src/connectDb.js @@ -32,9 +32,5 @@ const connectDb = () => new Promise ((resolve, reject) => {    });  }); -const getConnection = () => connection; -module.exports = { -  connectDb, -  getConnection -}; +module.exports = connectDb; diff --git a/src/services/events/event.model.js b/src/services/events/event.model.js deleted file mode 100644 index 660cb1a..0000000 --- a/src/services/events/event.model.js +++ /dev/null @@ -1,82 +0,0 @@ -const cron = require('cron'); -const { model } = require('mongoose'); -const schema = require('./event.schema.js'); -const LogModel = require('../logs/log.model.js'); - -const CronJob = cron.CronJob; - -schema.methods.log = function(message) { -  const dateOpts = { timeStyle: 'medium', dateStyle: 'short' }; -  const timestamp = new Date().toLocaleString('en', dateOpts); -  console.log(`[${timestamp}] ${this.name}: ${message}`); - -  return LogModel.create({ -    eventId: this._id, -    message -  }); -}; - -schema.methods.start = function() { -  this.log('Event started') -  this.lastRunAt = new Date(); -  this.status = 'running'; -  return this.save(); -}; - -schema.methods.complete = function() { -  this.log('Event complete') -  this.status = 'complete'; -  return this.save(); -}; - -schema.methods.fail = function(error) { -  this.log(error); -  this.error = error; -  this.status = 'failed'; -  return this.save(); -}; - -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.findMissedEvents = async function () { -  return this.find({ -    nextRunAt: { -      // TODO: skip single-fire events -      $lt: new Date() -    }, -  }); -}; - -schema.statics.findNextEvents = function(limit = 10) { -  return this.find( -    { -      nextRunAt: { -        $gt: new Date() -      }, -    }, -    null, -    { -      sort: { -        nextRunAt: 1 -      }, -      limit -    } -  ) -}; - -const Model = model('Event', schema); - - -module.exports = Model; - - - diff --git a/src/services/events/event.schema.js b/src/services/events/event.schema.js deleted file mode 100644 index aff19f1..0000000 --- a/src/services/events/event.schema.js +++ /dev/null @@ -1,22 +0,0 @@ -const { Schema } = require('mongoose'); - -module.exports = new Schema({ -  name: { -    type: String, -    required: true, -    unique: true -  }, -  schedule: { -    type: String, -    required: true -  }, -  status: { -    type: String, -    default: 'notStarted' -  }, -  error: String, -  context: {}, -  nextRunAt: Date, -  lastRunAt: Date -}, { timestamps: true }); - diff --git a/src/services/events/event.service.js b/src/services/events/event.service.js index f2185a6..45aebd3 100644 --- a/src/services/events/event.service.js +++ b/src/services/events/event.service.js @@ -1,71 +1,16 @@ -const { Types } = require('mongoose'); -const { Service } = require('feathers-mongoose'); -const _ = require('lodash'); -const cron = require('cron'); -const Bluebird = require('bluebird'); - -const Model = require('./event.model.js'); +const { Scheduler } = require('mongo-cronjob'); +const service = require('feathers-mongoose');  const handleAttendClassJob = require('../../handlers'); -const CronJob = cron.CronJob; +const Model = require('./models.js').Event;  const handleTestJob = () => new Promise(res => setTimeout(res, 10000)); -class Events extends Service { -  async setup(app, path) { -    this.jobs = []; -    await this.rescheduleMissedEvents(); - -    const job = new CronJob('*/10 * * * * *', () => this.updateJobs()); -    job.start(); -  } - -  startAllJobs() { -    this.jobs.forEach(job => job.start()); -  } - -  stopAllJobs() { -    this.jobs.forEach(job => job.stop()); -  } - -  async rescheduleMissedEvents() { -    const missedEvents = await this.Model.findMissedEvents(); -    return Bluebird.map(missedEvents, event => event.save()); -  } - -  async updateJobs() { -    // Reschedule missed events before we stop jobs to avoid -    // accidentally stopping the job that has not triggered yet -    // (if event schedule resonates with updateJobs schedule) -    await this.rescheduleMissedEvents(); - -    this.stopAllJobs(); - -    const events = await this.Model.findNextEvents(); -    if (!events.length) console.log('WARNING: no upcoming events'); -    this.jobs = events.map(event => new CronJob( -      event.schedule, -      () => this.run(event._id) -    )); - -    this.startAllJobs(); -  } - -  async run(id) { -    const event = await this.Model.findById(id); - -    try { -      event.start(); -      await handleAttendClassJob(event); -      return event.complete(); -    } catch (error) { -      event.fail(error); -    } -  } -} - -  module.exports = app => { -  app.use('/events', new Events({ Model })); +  app.use('/events', service({ Model })); + +  const scheduler = new Scheduler(Model); +  scheduler.registerHandler('class', handleAttendClassJob); +  scheduler.registerHandler('test', handleTestJob);  }; diff --git a/src/services/logs/log.service.js b/src/services/events/log.service.js index 899ec86..62d96a9 100644 --- a/src/services/logs/log.service.js +++ b/src/services/events/log.service.js @@ -1,5 +1,5 @@  const service = require('feathers-mongoose'); -const Model = require('./log.model.js'); +const Model = require('./models.js').Log;  const LogService = service({ Model }); diff --git a/src/services/events/models.js b/src/services/events/models.js new file mode 100644 index 0000000..72b10d7 --- /dev/null +++ b/src/services/events/models.js @@ -0,0 +1,7 @@ +const mongoose = require('mongoose'); +const { Client } = require('mongo-cronjob'); + +const client = new Client(mongoose.connection); + +module.exports = client; + diff --git a/src/services/index.js b/src/services/index.js index e02a4b8..c7a6cc5 100644 --- a/src/services/index.js +++ b/src/services/index.js @@ -1,6 +1,6 @@  const Users = require('./users/user.service.js');  const Events = require('./events/event.service.js'); -const Logs = require('./logs/log.service.js'); +const Logs = require('./events/log.service.js');  const Auth = require('./auth/auth.service.js');  module.exports = app => { diff --git a/src/services/logs/log.model.js b/src/services/logs/log.model.js deleted file mode 100644 index 64b7da6..0000000 --- a/src/services/logs/log.model.js +++ /dev/null @@ -1,7 +0,0 @@ -const { model } = require('mongoose'); -const schema = require('./log.schema.js'); - -const Model = model('Log', schema); - - -module.exports = Model; diff --git a/src/services/logs/log.schema.js b/src/services/logs/log.schema.js deleted file mode 100644 index bb8d4a5..0000000 --- a/src/services/logs/log.schema.js +++ /dev/null @@ -1,7 +0,0 @@ -const { Schema, Types } = require('mongoose'); - -module.exports = new Schema({ -  eventId: Types.ObjectId, -  message: String -}, { timestamps: true }); - | 
