npm package: @suaveslow/nest-agenda
Description: A thin NestJS wrapper around Agenda
Author: suaveslow
Latest version: 1.0.2

<h1 align="center"></h1>

<div align="center">
  <a href="http://nestjs.com/" target="_blank">
    <img src="https://nestjs.com/img/logo_text.svg" width="150" alt="Nest Logo" />
  </a>
</div>

<h3 align="center">A module for Utilizing Agenda with NestJS</h3>
<h4 align="center">Generated by @nestjsplus/dyn-schematics</h4>

<div align="center">
  <a href="https://nestjs.com" target="_blank">
    <img src="https://img.shields.io/badge/built%20with-NestJs-red.svg" alt="Built with NestJS">
  </a>
  <a href="https://github.com/nestjsplus/dyn-schematics">
    <img src="https://img.shields.io/badge/Built%20with-%40nestjsplus%2Fdyn--schematics-brightgreen" alt="Built with @nestjsplus/dyn-schematics">
  </a>
</div>

### Credit
All credit goes to [John Biundo](https://github.com/johnbiundo) and the amazing [NestJS framework](https://nestjs.com/)

### About

This module provides a thin wrapper around [Agenda](https://github.com/agenda/agenda). Agenda is a NodeJS job scheduler that works with MongoDB.

The module was generated using [@nestjsplus/dyn-schematics](https://github.com/nestjsplus/dyn-schematics), a schematics package for NestJS that generates *dynamic modules* using the pattern [described here](https://dev.to/nestjs/advanced-nestjs-how-to-build-completely-dynamic-nestjs-modules-1370). There's a complete tutorial on [using the custom schematics here](https://dev.to/nestjs/build-a-nestjs-module-for-knex-js-or-other-resource-based-libraries-in-5-minutes-12an).

### Installation

```bash
npm i @suaveslow/nest-agenda
```

### Quick Start

To configure Agenda, import the `AgendaModule` module using the familiar `register()` / `registerAsync()` pattern.

Once configured, inject the `SINGLETON` agenda api interface object into any service using the `AGENDA_INSTANCE` injection token.

```typescript
// src/app.module.ts

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { NestAgendaModule } from 'nest-agenda';

@Module({
  imports: [
    NestAgendaModule.registerAsync({
      useFactory: async() => ({
        db: { address: 'mongoConnectionString' }
      })
    }),
  ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}
```

Now you have access to a `AGENDA_INSTANCE` token that is associated with the Agenda API, which you can inject into any provider, and use the resulting Agenda API object directly. For example, you might do this:

```typescript
// src/app.service.ts
import { Inject, Injectable } from '@nestjs/common';
import { AGENDA_INSTANCE } from 'nest-agenda';

@Injectable()
export class AppService {
  constructor(@Inject(AGENDA_INSTANCE) private readonly agenda) {}

  async index() {
    this.agenda.define("say hello", (job) => console.log('hello there!'));
    await this.agenda.every("5 seconds", "say hello");
  }
  ...
```

Here, you've injected the Agenda instance as a local property of the service class, and can access any of the Agenda API through that property.

You can use any of the following methods to provide the `NestAgendaOptions` to the module. These follow the [usual patterns for custom providers](https://docs.nestjs.com/fundamentals/custom-providers):

- `register()`: pass a plain JavaScript object
- `registerAsync()`: pass a dynamic object via:
  - `useFactory`: supply a factory function to return the object; the factory should implement the appropriate [options factory](https://github.com/suaveslow/nest-agenda/blob/master/src/interfaces/nest-agenda-options-factory.interface.ts) interface
  - `useClass`: bind to a provider/service that supplies the object; that service should implement the appropriate [options factory](https://github.com/suaveslow/nest-agenda/blob/master/src/interfaces/nest-agenda-options-factory.interface.ts) interface
  - `useExisting`: bind to an existing (provided elsewhere) provider/service to supply the object; that service should implement the appropriate [options factory](https://github.com/suaveslow/nest-agenda/blob/master/src/interfaces/nest-agenda-options-factory.interface.ts) interface

### About @nestjsplus/dyn-schematics

[Nest Dynamic Package Generator Schematics](https://github.com/nestjsplus/dyn-schematics) generates a starter template for building NestJS dynamic packages.  It uses the `@nestjs/cli` core package, and provides customized schematics for generating modular NestJS applications.  See [here](https://github.com/nestjsplus/dyn-schematics) for the full set of available schematics, and documentation.  Read these articles for more background:

- [Advanced NestJS: How to build completely dynamic NestJS modules](https://dev.to/nestjs/advanced-nestjs-how-to-build-completely-dynamic-nestjs-modules-1370) - covers the design pattern used by this module
- [Build a NestJS Module for Knex.js (or other resource-based libraries) in 5 Minutes](https://dev.to/nestjs/build-a-nestjs-module-for-knex-js-or-other-resource-based-libraries-in-5-minutes-12an) - covers a custom schematic that can be used to generate a module template based on this pattern

### License

Licensed under the MIT License - see the [LICENSE](LICENSE) file for details.