const { Types } = require('mongoose'); const Agenda = require('agenda'); const _ = require('lodash'); const { getConnection } = require('../../connectDb.js'); const handleAttendClassJob = require('../../handlers'); class Events { setup(app) { this.collectionName = 'events'; // Reuse mongoose connection const connection = getConnection(); this.agenda = new Agenda(); this.agenda.mongo( connection.collection(this.collectionName).conn.db, this.collectionName ); // Define jobs this.agenda.define('attend class', handleAttendClassJob); // Logs this.agenda.on('start', job => console.log(`Starting ${job.attrs.name} job`)); this.agenda.on('complete', job => console.log(`Job ${job.attrs.name} finished`)); this.agenda.on('fail', (err, job) => console.log(`Job failed with the error ${err}`)); return this.agenda.start(); } create(data, params) { return this.agenda.schedule(data.date, 'attend class', data); } find(params) { return this.agenda.jobs({}, { nextRunAt: -1, 'data.participants': -1 }); } findOneById(id) { return this.agenda .jobs({ _id: Types.ObjectId(id) }) .then(results => results[0]); } async patch(id, attrs, params) { console.log(`Patch ${id}`); const job = await this.findOneById(id); job.attrs = _.merge(job.attrs, attrs); return this.agenda.saveJob(job); } async remove(id) { console.log(`Remove ${id}`); return this.agenda.cancel({ _id: Types.ObjectId(id) }); } } module.exports = app => app.use('/events', new Events());