moleculer-agenda-mixin

0.1.1 • Public • Published

Coverage Status Known Vulnerabilities

moleculer-agenda-mixin NPM version

The Agenda Mixin for Moleculer.

Install

npm install moleculer-agenda-mixin --save

Usage

const date = require('date.js');
const AgendaMixin = require('../index');

// Options to config agenda mixin
options = {
  // initOnStart: true - starts the agenda after starting the service
  initOnStart: false,
  // if initOnStart: false - then you need to connect the agenda to the events of your application
  // it helps when you have scheduled tasks that can start immediately after starting and they
  // are dependent on other parts of the application
  events: {
    'services.started': {
      async handler() {
        await this.agendaStart();
      },
    },
    // and stop if your need it
    'services.stopped': {
      async handler() {
        await this.agendaStop();
      },
    },
  }
};

module.exports = {
  name: 'workers',
  version: 1,
  // The first is the agenda options the second is the mixin options
  mixins: [AgendaMixin({ db: { address: process.env.AGENDA_MONGO_URI } }, options)],
  events: {
    'agenda.started': {
      async handler() {
        await this.agenda.cancel({ name: 'checkPayments' });
        await this.agenda.schedule('everyday at 10:00', 'checkPayments');
      },
    },
  },
  actions: {
    checkPayments: {
      async handler(ctx) {
        const timeNow = new Date();
        const dayAgo = date('1 day ago');
        await ctx.call('v1.payments.tryToPay', {
          query: { nextPay: { $gte: dayAgo, $lte: timeNow }, active: true }
        });
      },
    },
    payEnd: {
      params: {
        id: 'any',
      },
      async handler(ctx) {
        const { id } = ctx.params;
        // In action services, you can use a clean agenda to schedule jobs
        this.agenda.schedule('1 day', 'payEnd', { id });
      },
    },
  },
  created() {
    // all tasks in this list after the "agendaStart" method are defined as available agenda tasks
    this.jobs = {
      checkPayments: async (_job) => {
        this.broker.call('v1.workers.checkPayments', {});
      },
      payEnd: async (job) => {
        // In action services, you can use a clean agenda to schedule jobs
        const { id } = job.attrs.data;
        this.broker.call('v1.notifications.payEnd', { id });
      },
    };
  },
};

For more information on use, refer to the Agenda documentation.

License

The project is available under the MIT license.

Dependents (0)

Package Sidebar

Install

npm i moleculer-agenda-mixin

Weekly Downloads

0

Version

0.1.1

License

MIT

Unpacked Size

7.55 kB

Total Files

5

Last publish

Collaborators

  • masfree