Skip to content

apricote/nest-pg-boss

Repository files navigation

@apricote/nest-pg-boss

Use pg-boss in your Nest.js service!

NPM Version Package License NPM Downloads CI Status

Installation

npm install @apricote/nest-pg-boss

Usage

Setup

To begin using @apricote/nest-pg-boss, initialize the root module:

import { PGBossModule } from "@apricote/nest-pg-boss";

// app.module.ts
@Module({
  imports: [
    PGBossModule.forRootAsync({
      application_name: "default",
      useFactory: (config: ConfigService) => ({
        // Connection details
        host: config.get<string>("DB_HOST"),
        user: config.get<string>("DB_USERNAME"),
        password: config.get<string>("DB_PASSWORD"),
        database: config.get<string>("DB_DATABASE"),
        schema: "public",
        max: config.get<number>("DB_POOL_MAX"),
      }),
      inject: [ConfigService],
    }),
  ],
})
export class AppModule {}

For a list of available settings, check out the pg-boss docs.

Jobs

// jobs.ts
import { createJob } from "@apricote/nest-pg-boss"

interface IFoobarJobData {
  foo: string
  bar: boolean
}

const FoobarJob = createJob<IFoobarJobData>("foobar")

Create new Jobs

// module.ts
import { PGBossModule } from "@apricote/nest-pg-boss";
import { FoobarService } from "./service.ts";

@Module({
  imports: PGBossModule.forJobs([FoobarJob]),
  providers: [FoobarService]
})
class FoobarModule {}
// service.ts
import { JobService } from "@apricote/nest-pg-boss";
import { FoobarJob, IFoobarJobData } from "./jobs.ts";

@Injectable()
class FoobarService {
  constructor(
    @FoobarJob.Inject()
    private readonly foobarJobService: JobService<IFoobarJobData>,
  ) {}

  async sendJob() {
    await this.foobarJobService.send({ foo: "oof", bar: true }, {});
  }
}

Process Jobs

Jobs can be processed by using the @FoobarJob.Handle() decorator.

// service.ts
@Injectable()
class FoobarService {
  /* ... */

  @FoobarJob.Handle()
  async handleJob(job: Job<FoobarJobData>) {
    // do something
  }
}

You can optionally pass an object with WorkOptions to .Handle():

@FoobarJob.Handle({ teamSize: 10, teamConcurrency: 2 })

Test

# unit tests
$ npm run test

# e2e tests
$ npm run test:e2e

# test coverage
$ npm run test:cov

License

@apricote/nest-pg-boss is MIT licensed.