vertical-slice
TypeScript icon, indicating that this package has built-in type declarations

1.0.2 • Public • Published

vertical-slice

The goal is not to reproduce MediatR from Jim Bogard. I wanted to easily handle : One entry point = one handler

Installation

npm install vertical-slice

Usage

Controller

export class ProductController {
    @Get('')
    async getOverview(): Promise<GetProductsResponse[]> {
        return await verticalSlice.send<GetProductsResponse[]>(new GetProductsRequest());
    }
}

Handler

export class GetProductsHandler implements IHandler<GetProductsRequest, GetProductsResponse[]> {

    async handle(_request: GetProductsRequest): Promise<GetProductsResponse[]> {
        
        // Do logic and communication with DB here
        
        const result: GetProductsResponse[] = [{
            id: '1',
            title: 'Title01',
            description: 'Description01',
            makerName: 'AuthorName01',
            createdAt: new Date(),
            updatedAt: new Date(),
        },
        {
            id: '2',
            title: 'Title02',
            description: 'Description02',
            makerName: 'AuthorName02',
            createdAt: new Date(),
            updatedAt: new Date(),
        },
        {
            id: '3',
            title: 'Title03',
            description: 'Description03',
            makerName: 'AuthorName03',
            createdAt: new Date(),
            updatedAt: new Date(),
        }
    ]
        return new Promise(resolve => setTimeout(resolve, 5000)).then(() => result);
    }

}

const getProductsHandler = new GetProductsHandler();
verticalSlice.registerHandler(GetProductsRequest, getProductsHandler);

Notice the two last lines. It allow to register the Handler in Vertical-slice. Whitout this your handler won't be usable. Why not using a decorator ? It's about technical reasons. Using decorator to register a handler is less strongly typed than the method used.

Request

export class GetProductsRequest implements IRequest<GetProductsResponse[]> { }

Response

export interface GetProductsResponse {
    id: string;
    title: String;
    description: String;
    makerName: String;
    createdAt: Date;
    updatedAt: Date;
}

More examples here

Going further

Don't hesitate to open a discussion or a fork. I tried to have a strongly typed system to automatically register Handlers without that the user have to call himself a function to register, I didn't succeed. One possible way is using reflection with decorator.

An interesting package for reflection in typescript is tst-reflect

Source

Package Sidebar

Install

npm i vertical-slice

Weekly Downloads

0

Version

1.0.2

License

MIT

Unpacked Size

7.5 kB

Total Files

10

Last publish

Collaborators

  • the-stuttering-guy