GithubHelp home page GithubHelp logo

unlight / nestjs-cqrx Goto Github PK

View Code? Open in Web Editor NEW
3.0 3.0 0.0 87 KB

EventStoreDB NestJS CQRS module

License: MIT License

JavaScript 6.88% Shell 0.71% TypeScript 92.41%
eventstore cqrs nestjs eventstoredb nestjs-cqrx

nestjs-cqrx's Introduction

nestjs-cqrx

EventStoreDB NestJS CQRS module.

Based on

Features

  • Asynchronous commit/publish
  • Event handler decorator

Install

npm install --save nestjs-cqrx

Usage

import { CqrxModule } from 'nestjs-cqrx';

@Module({
    imports: [
        CqrxModule.forRoot({
            eventstoreDbConnectionString: 'esdb://localhost:2113?tls=false',
        }),
    ],
})
export class AppModule {}

You can generate connection string on Connection details page

Example of User model

import { ConflictException } from '@nestjs/common';
import { AggregateRoot, EventHandler } from 'nestjs-cqrx';

import { UserRegistered } from '../events';

export class User extends AggregateRoot {
    isRegistered = false;
    email!: string;
    password!: string;

    @EventHandler(UserRegistered)
    createUser(event: UserRegistered): void {
        this.isRegistered = true;
        this.email = event.data.email;
        this.password = event.data.password;
    }

    register(email: string, password: string) {
        if (this.isRegistered) {
            throw new ConflictException();
        }

        this.apply(
            new UserRegistered({
                email,
                password,
            }),
        );
    }
}

Example of events

import { Event } from 'nestjs-cqrx';

type UserRegisteredDto = { email: string; password: string };

export class UserRegistered extends Event<UserRegisteredDto> {}
@Module({
    imports: [
        CqrxModule.forFeature(
            [User],
            // Subscribe and transform events from eventstore
            [['UserRegistered', event => new UserRegistered(event)]],
        ),
    ],
})
export class UserModule {}
// Signature of transformers
type Transformer = [
    /* Recorded event type */ string,
    /* Function which accept stream event (plain object) */ (
        event: RecordedEvent,
    ) => Event,
];

['UserRegistered', event => new UserRegistered(event)] can be shorthanded to UserRegistered

Note: If you have decorator EventsHandler (from @nestjs/cqrs) of some event, it will be automatically added to transform service.

Example apps pros/cons

example / example-tick-tack-toe-cqrx

[+] good option (save event to db, subscribe to event from db)
[–] synchronous (we must wait when event will be saved then reply to client)

[+] official nestjs/cqrs implementation, command handlers (fire new command via saga)
[+] faster, we reply processing to client, and do command on
[–] can emit only 1 event from saga

Similar Projects

Development

Resources

Todo

  • find lib for creating errors

nestjs-cqrx's People

Contributors

semantic-release-bot avatar unlight avatar

Stargazers

 avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

nestjs-cqrx's Issues

The automated release is failing 🚨

🚨 The automated release from the master branch failed. 🚨

I recommend you give this issue a high priority, so other packages depending on you can benefit from your bug fixes and new features again.

You can find below the list of errors reported by semantic-release. Each one of them has to be resolved in order to automatically publish your package. I’m sure you can fix this πŸ’ͺ.

Errors are usually caused by a misconfiguration or an authentication problem. With each error reported below you will find explanation and guidance to help you to resolve it.

Once all the errors are resolved, semantic-release will release your package the next time you push a commit to the master branch. You can also manually restart the failed CI job that runs semantic-release.

If you are not sure how to resolve this, here are some links that can help you:

If those don’t help, or if this issue is reporting something you think isn’t right, you can always ask the humans behind semantic-release.


No npm token specified.

An npm token must be created and set in the NPM_TOKEN environment variable on your CI environment.

Please make sure to create an npm token and to set it in the NPM_TOKEN environment variable on your CI environment. The token must allow to publish to the registry https://registry.npmjs.org/.


Good luck with your project ✨

Your semantic-release bot πŸ“¦πŸš€

Publish event without adding to stream

Is there a way to publish an event from the aggregate without adding the event to the underlying aggregates stream? lets say I want to publish an integration event, or an event that I do not want stored in the aggregates stream? it seems currently not possible under the current architecture of the AggregateRoot? publishing is hardcoded to add to the event stream

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    πŸ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. πŸ“ŠπŸ“ˆπŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❀️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.