Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/jassix/elysia-cqrs
🦊 Elysia plugin enabling the use of CQRS mediators within the application context.
https://github.com/jassix/elysia-cqrs
bun elysiajs plugin typescript
Last synced: 2 months ago
JSON representation
🦊 Elysia plugin enabling the use of CQRS mediators within the application context.
- Host: GitHub
- URL: https://github.com/jassix/elysia-cqrs
- Owner: jassix
- License: mit
- Created: 2024-08-06T22:26:18.000Z (5 months ago)
- Default Branch: main
- Last Pushed: 2024-10-10T01:01:10.000Z (3 months ago)
- Last Synced: 2024-10-10T05:37:07.786Z (3 months ago)
- Topics: bun, elysiajs, plugin, typescript
- Language: TypeScript
- Homepage: https://elysiajs.com/plugins/overview
- Size: 57.6 KB
- Stars: 19
- Watchers: 1
- Forks: 0
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# elysia-cqrs
Plugin for [Elysia](https://github.com/elysiajs/elysia) for using [CQRS pattern](https://en.wikipedia.org/wiki/Command_Query_Responsibility_Segregation).CQRS Plugin for Elysia is a lightweight extension that implements the Command Query Responsibility Segregation pattern into your Elysia-based application. This plugin allows you to effectively separate read and write operations, providing better scalability, maintainability, and testability of your code.
## Installation
```bash
bun add elysia-cqrs
```## Example
```typescript
// commands/create-user/command.ts (example)
import { ICommand } from 'elysia-cqrs'class CreateUserCommand extends ICommand {
constructor(public name: string) {
super()
}
}// commands/create-user/handler.ts (example)
import { ICommandHandler } from 'elysia-cqrs'
import { CreateUserCommand } from './command.ts'class CreateUserHandler implements ICommandHandler {
execute(command: CreateUserCommand) {
return `New user with name ${command.name} was created!`
}
}// index.ts (example)
import { Elysia } from 'elysia'
import { cqrs } from 'elysia-cqrs'
import { CreateUserCommand, CreateUserHandler } from '@/commands/create-user'const app = new Elysia()
.use(cqrs({
commands: [
[CreateUserCommand, new CreateUserHandler()]
]
}))
.post('/user', ({ body: { name }, commandMediator }) => {
return commandMediator.send(new CreateUserCommand(name))
}, {
body: t.Object({
name: t.String(),
})
})
.listen(5000)
```## API
This plugin decorates `commandMediator`, `eventMediator`, `queryMediator` into `Context`.### commandMediator
The `commandMediator` implements the `CommandMediator` class with these methods and properties:```typescript
class CommandMediator extends Mediator {
register(
command: Class,
handler: ICommandHandler,
): voidasync send(command: ICommand): Promise
}
```
###### * this is just a sample, not real code.***
### eventMediator
The `eventMediator` implements the `EventMediator` class with these methods and properties:```typescript
class EventMediator extends Mediator {
register(event: Class, handler: IEventHandler): void
send(event: IEvent): void
}
```
###### * this is just a sample, not real code.***
### queryMediator
The `queryMediator` implements the `QueryMediator` class with these methods and properties:```typescript
class QueryMediator extends Mediator {
register(
query: Class,
handler: IQueryHandler
): voidasync send(query: IQuery): Promise
}
```
###### * this is just a sample, not real code.***
### Base Classes
The library features foundational abstract classes like `ICommand`, `IEvent`, and `IQuery`. These are essential for ensuring standardization and polymorphism.***
### Handler interfaces
The module additionally offers a range of handler interfaces, drawing inspiration from the @nestsjs/cqrs package.```typescript
interface ICommandHandler<
TCommand extends ICommand = never,
TResponse = never,
> {
execute(command: TCommand): TResponse
}interface IEventHandler {
handle(event: TEvent): void
}interface IQueryHandler<
TQuery extends IQuery = never,
TResponse = never,
> {
execute(query: TQuery): TResponse
}
```## Config
Below is the configurable property for customizing the CQRS plugin.```typescript
interface CqrsPluginParams {
commands?: Array<[Class, ICommandHandler]>
events?: Array<[Class, IEventHandler]>
queries?: Array<[Class, IQueryHandler]>
}
```