Skip to content

Commit ab2159c

Browse files
authored
feat(task-decorator): Create Task & TaskHandler decorator (#2)
1 parent 2bdd020 commit ab2159c

32 files changed

+1913
-121
lines changed

sample/.env renamed to .env

File renamed without changes.

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## Current
44

5+
- **feat(task)**: provide a `@Task(name)` decorator to define your injectable tasks
56
- **fix(hooks)**: Set all worker hooks (was only `job:success`)
67
- **refactor(configuration)**: Remove `ConfigurationService` class and use a plain object `RunnerOptions`
78
- **refactor()**: Rename `GraphileWorkerService` to `WorkerService`

README.md

Lines changed: 59 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
# [Graphile Worker](https://github.com/graphile/worker) for [Nest](https://github.com/nestjs/nest)
1+
# Graphile Worker for Nest.js
22

33
[![npm version](https://badge.fury.io/js/nestjs-graphile-worker.svg)](https://badge.fury.io/js/nestjs-graphile-worker)
44

5-
This is wrapper for Nest.js and [Graphile Worker](https://github.com/graphile/worker).
5+
This is wrapper for [Nest.js](https://github.com/nestjs/nest) and [Graphile Worker](https://github.com/graphile/worker).
66

77
What is Graphile worker ?
88

@@ -14,9 +14,10 @@ Why you should prefer Graphile Worker instead of [Bull](https://github.com/nestj
1414

1515
## Features
1616

17-
- use a `GraphileWorkerModule` to register Graphile Worker with a `asRootAsync` to pass dynamic parameters
17+
- use a `GraphileWorkerModule.forRoot` to register Graphile Worker (support `asRootAsync` as well)
1818
- provide a `WorkerService` to add jobs or start runner
19-
- provide a `OnWorkerEvenet` decorator to add custom behavior on `job:success` for example
19+
- provide a `@OnWorkerEvent` decorator to add custom behavior on `job:success` for example
20+
- provide a `@Task(name)` decorator to define your injectable tasks
2021

2122
## Installation
2223

@@ -80,6 +81,46 @@ import { helloTask } from './hello.task';
8081
export class AppModule {}
8182
```
8283

84+
## Create task
85+
86+
To create task you need to define an `@Injectable` class with `@Task(name)` decorator who contains a decorated method `@TaskHandler`:
87+
88+
```ts
89+
import { Injectable, Logger } from '@nestjs/common';
90+
import { Helpers } from 'graphile-worker';
91+
import { Task, TaskHandler } from '../../src/index';
92+
93+
@Injectable()
94+
@Task('hello')
95+
export class HelloTask {
96+
private logger = new Logger(HelloTask.name);
97+
98+
@TaskHandler()
99+
handler(payload: any, _helpers: Helpers) {
100+
this.logger.log(`handle ${JSON.stringify(payload)}`);
101+
}
102+
}
103+
```
104+
105+
Then do not forget to register this class as provider in your module:
106+
107+
```ts
108+
import { Module } from '@nestjs/common';
109+
import { HelloTask } from './hello.task';
110+
// ...
111+
112+
@Module({
113+
imports: [
114+
/* ... */
115+
],
116+
controllers: [
117+
/* ... */
118+
],
119+
providers: [HelloTask],
120+
})
121+
export class AppModule {}
122+
```
123+
83124
## Create jobs
84125

85126
You may use `WorkerService`:
@@ -101,9 +142,7 @@ export class AppController {
101142
@Post('bulk')
102143
@HttpCode(201)
103144
async addJobs() {
104-
const jobs: Array<{ identifier: string; payload?: unknown }> = new Array(
105-
100,
106-
)
145+
const jobs = new Array(100)
107146
.fill(undefined)
108147
.map((_, i) => ({ identifier: 'hello', payload: { hello: i } }));
109148

@@ -131,12 +170,14 @@ bootstrap();
131170

132171
## `OnWorkerEvent` decorator
133172

173+
This decorator allow you to listen all [GRaphile Worker event](https://github.com/graphile/worker#workerevents)
174+
134175
You need to add `@GraphileWorkerListener` decorator on your class and then set `@OnWorkerEvent(eventName)` on method:
135176

136177
```ts
137-
import { GraphileWorkerListener, OnWorkerEvent } from '@app/graphile-worker';
138178
import { Injectable, Logger } from '@nestjs/common';
139179
import { WorkerEventMap } from 'graphile-worker';
180+
import { GraphileWorkerListener, OnWorkerEvent } from '../../src/index';
140181

141182
@Injectable()
142183
@GraphileWorkerListener()
@@ -146,26 +187,29 @@ export class AppService {
146187
@OnWorkerEvent('job:success')
147188
onJobSuccess({ job }: WorkerEventMap['job:success']) {
148189
this.logger.debug(`job #${job.id} finished`);
149-
// output: [Nest] 1732 - 09/14/2021, 12:42:45 PM DEBUG [AppService] job #349 finished
190+
}
191+
192+
@OnWorkerEvent('job:error')
193+
onJobError({ job, error }: WorkerEventMap['job:error']) {
194+
this.logger.error(`job #${job.id} fail ${JSON.stringify(error)}`);
150195
}
151196
}
152197
```
153198

154-
You can find a complete list of available event on [Graphile Worker's documentation](https://github.com/graphile/worker#workerevents).
155-
156199
## Test
157200

158201
```bash
159202
# unit tests
160203
$ npm run test
161204

162-
# e2e tests
163-
$ npm run test:e2e
164-
165205
# test coverage
166206
$ npm run test:cov
167207
```
168208

169209
# Sample
170210

171-
You can find a [sample](./sample/README.md) who use library.
211+
You can find a [sample](./sample/) who use library. To run it, simply `npm install` and then:
212+
213+
```sh
214+
docker-compose up
215+
```

docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ version: '3.3'
22
services:
33
backend:
44
image: node:16-alpine
5-
working_dir: /usr/src/app/sample
6-
command: sh -c "npm install && npm run start:dev"
5+
working_dir: /usr/src/app
6+
command: sh -c "npm run sample"
77
volumes:
88
- ./.:/usr/src/app
99
ports:

nodemon.json

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"watch": ["src", "sample"],
3+
"ext": "ts",
4+
"ignore": ["./**/*.spec.ts"],
5+
"exec": "tsc && node dist/sample/src/main.js"
6+
}

0 commit comments

Comments
 (0)