Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/melkonline/nestjs-microservices-cqrs

NestJS Microservices CQRS - Modified CQRS module to subscribe/publish Events globally instead of locally
https://github.com/melkonline/nestjs-microservices-cqrs

cqrs ddd event-sourcing eventsourcing microservices nest nestjs nestjs-cqrs nestjs-microservices

Last synced: 2 months ago
JSON representation

NestJS Microservices CQRS - Modified CQRS module to subscribe/publish Events globally instead of locally

Awesome Lists containing this project

README

        


Nest Logo

[travis-image]: https://api.travis-ci.org/nestjs/nest.svg?branch=master
[travis-url]: https://travis-ci.org/nestjs/nest
[linux-image]: https://img.shields.io/travis/nestjs/nest/master.svg?label=linux
[linux-url]: https://travis-ci.org/nestjs/nest

A progressive Node.js framework for building efficient and scalable server-side applications.



NPM Version
Package License
NPM Downloads
Travis
Linux
Coverage
Discord
Backers on Open Collective
Sponsors on Open Collective



# nestjs-microservices-cqrs

## Description

#### NestJS Microservices CQRS
NestJS Microservices CQRS - Modified CQRS module to subscribe/publish Events globally instead of locally

##### How It Works?

Overriding `@nestjs/cqrs` module, its `EventBus` is changed in order to subscribe to events globally
when registering `Handlers`.

Publishing `Events` will emit them instead of executing their corresponding handlers.

By default, any `Event` to which at least one `Handler` is registered, will be subscribed `Globally`.

Also, `publish` method of this module's `EventBus` will publish the `Event` globally, and not locally.

Therefore, the `Handler` will be executed after we received the `Event` from the network.

## Installation

```bash
$ npm install --save @melkonline/nestjs-microservices-cqrs
```

## Quick Start

#### In your main.ts:

```TypeScript
import { NestjsMicroservicesCqrs } from "@melkonline/nestjs-microservices-cqrs";

async function bootstrap() {
const app = await NestFactory.create(AppModule);
app.connectMicroservice(app.get(NestjsMicroservicesCqrs).init(microserviceConfig), {
inheritAppConfig: true,
});
await app.startAllMicroservices();
app.get(NestjsMicroservicesCqrs).run();
app.listen(3456);
}
bootstrap();
```

#### In your app.module.ts:

```TypeScript
import { NestjsMicroservicesCqrsModule } from '@melkonline/nestjs-microservices-cqrs';

@Module({
imports: [
/** All other modules */
NestjsMicroservicesCqrsModule
],
controllers: [/* ...Controllers */],
providers: [
/**
...Services
...CommandHandlers
...EventHandlers
*/
],
})
export class AppModule {}
```

#### In your `Event`:

```TypeScript
import { SerializableEvent, ISerializableEvent } from '@melkonline/nestjs-microservices-cqrs';

export class TaskCreatedEvent extends SerializableEvent implements ISerializableEvent {
constructor(public readonly createTaskDto: CreateTaskDto) {
super();
}
}
```

#### Using `EventBus`:

```TypeScript
import { EventBus } from '@melkonline/nestjs-microservices-cqrs';
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
private readonly eventBus: EventBus,
) {}

@Get('test')
test() {
const data = new CreateTaskDto();
data.type = 'testing the module';
return this.eventBus.publish(new TaskCreatedEvent(data));
}
}
```

#### Still Want `local` Events?

Simply add `@LocalEvent()` decorator to your `Event` class.

```TypeScript
import { LocalEvent } from '@melkonline/nestjs-microservices-cqrs';

@LocalEvent()
export class TaskCreatedEvent implements IEvent {
constructor(public readonly data: CreateTaskDto) {}
}
```

Such events will be neither subscribed, nor published globally, instead they will work locally as traditional.

#### Microservice Route Is Also Available:

Beside subscribing to the `Event` via `Handler`, you still can subscribe as a route via `@EventPattern()`
decorator as traditional:

```TypeScript
@Controller()
export class AppController {
constructor(
private readonly appService: AppService,
private readonly eventBus: EventBus,
) {}

@EventPattern('TaskCreatedEvent')
someOtherWayToHandleOurEvent(@Payload() message) {
console.log('someOtherWayToHandleOurEvent', message);
}
}
```

## License

NestJS Microservices CQRS is [MIT licensed](LICENSE).