Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
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
- Host: GitHub
- URL: https://github.com/melkonline/nestjs-microservices-cqrs
- Owner: melkonline
- License: mit
- Created: 2021-01-30T12:01:46.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2021-02-08T13:24:52.000Z (almost 4 years ago)
- Last Synced: 2024-09-17T01:05:30.919Z (4 months ago)
- Topics: cqrs, ddd, event-sourcing, eventsourcing, microservices, nest, nestjs, nestjs-cqrs, nestjs-microservices
- Language: TypeScript
- Homepage:
- Size: 12.7 KB
- Stars: 9
- Watchers: 2
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
[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.
# 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).