3.2.2 • Published 2 years ago

@jeje-devs/plume-server v3.2.2

Weekly downloads
-
License
ISC
Repository
-
Last release
2 years ago

PlumeServer

Table of contents

General info

PlumeServer is an easy to use tool to create a quick Web API using Node.js and Express.js

Example:

import { Controller, HttpGet, FromRoute, PlumeServer, Injectable, Result, ok } from '@jeje-devs/plume-server';

@Injectable()
export class PlanetService
{
    public getPlanets(name: string): Array<string>
    {
        return ['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Saturne', 'Uranus', 'Neptune']
            .filter(x => x.toLowerCase().includes(name.toLowerCase()));
    }
}

@Controller('api/planets')
export class PlanetController
{
    public constructor(
        private readonly _planetService: PlanetService) { }

    @HttpGet(':name')
    public async getPlanets(@FromRoute('name') name: string): Promise<Result<Array<string>>>
    {
        return ok(this._planetService.getPlanets(name));
    }
}

const host = PlumeServer.createHost();
host.serve(8080);

Technologies

  • Node.js
  • Express.js
  • Typescript

Setup

npm install @jeje-devs/plume-server

Usage

Create a controller class using the decorator @Controller:

@Controller('api/route')
export class MyController

Create the different http methods using the decorators:

@HttpGet('hello')
public async sayHello(): Promise<Result<string>>
{
    return ok('Hello World!');
}

The available methods are

  • HttpGet
  • HttpPost
  • HttpPut
  • HttpPatch
  • HttpDelete

Query and Route params

To send query params, add parameters to the endpoint method with the decorator @FromQuery. For routes params, you need to use @FromRoute The types must be string, number or boolean

// Endpoint url: /api/controller/cars?model=208&brand=Peugeot
@HttpGet('cars')
public async getCars(@FromQuery('model') model: string, @FromQuery('brand') brand: string): Promise<Result<Array<Car>>>
{
    // ...
}

@HttpGet('cars/:id')
public async getCarById(@FromRoute('id') id: number): Promise<Result<Car>>
{
    // ...
}

The argument is the property name sent by the client.

Body params

For body params, you need to use the @FromBody

@HttpPost('cars')
public addCar(@FromBody() car: Car)
{
    // ...
}

Example

Here is an example of what you can achieve:

import { Controller, HttpGet, HttpPost, HttpPut, HttpDelete, FromBody, Injectable, Result, ok, noContent } from '@jeje-devs/plume-server';
import { Car } from 'src/models/car.model';
import { CarService } from 'src/services/car.service';

@Controller('api/cars')
export class CarController
{
    public constructor(
        private readonly _carService: CarService) { }

    @HttpGet()
    public async getCars(@FromQuery('name') name: string, @FromBody('brand') brand: string): Promise<Result<Array<Car>>>
    {
        const data = await this._carService.getCars(name, brand);
        return ok(data);
    }

    @HttpPost()
    public async createCar(@FromBody() car: Car): Promise<Result<void>>
    {
        await this._carService.createCar(car);
        return noContent();
    }

    @HttpPut(':id')
    public async updateCar(@FromRoute('id') id: number, @FromBody() car: Car): Promise<Result<void>>
    {
        await this._carService.updateCar(id, car);
        return noContent();
    }

    @HttpDelete(':id')
    public async deleteCar(@FromRoute('id') id: number): Promise<Result<void>>
    {
        await this._carService.deleteCar(id);
        return noContent();
    }
}

Dependency injection

You can add other classes and register them with the mandatory @Injectable decorator. Typically, every other service classes referenced by the @Controller classes need to be registered, otherwise the application will not run. You will need to add the dependencies in the class constructor.

import { Controller, HttpGet, Injectable, Result, ok } from '@jeje-devs/plume-server';

@Injectable()
export class ElementService
{
    public getElements(): Array<string>
    {
        return ['Fire', 'Water', 'Wind', 'Earth'];
    }
}

@Controller('api/elements')
export class ElementController
{
    public constructor(
        private readonly _elementService: ElementService) { }

    @HttpGet()
    public async getElements(): Promise<Result<Array<string>>>
    {
        const data = this._elementService.getElements();
        return ok(data);
    }
}

Starting server

To start the server you need to run the PlumeServer.createHost and host.serve methods:

import { Controller, PlumeServer } from '@jeje-devs/plume-server';

import 'src/controller/car.controller';

const port = 8080;

const singletonToInject = {
    value1: 'Foo',
    value2: 'Bar'
};

const host = PlumeServer.createHost();
host.onApiErrors = (err: any) => console.error(err);
host.registerInstance('customSingleton', singletonToInject);
host.serve(port).then(() => console.log('Server is running'));

Contributors

Links

3.2.2

2 years ago

3.2.1

2 years ago

3.2.0

2 years ago

3.1.0

2 years ago

3.0.1

2 years ago

3.0.0

2 years ago

2.1.2

2 years ago

2.1.1

2 years ago

2.1.0

2 years ago

2.0.2

2 years ago

2.0.1

2 years ago

2.0.0-pre1

2 years ago

1.2.2

2 years ago

1.2.1

2 years ago

1.2.0

2 years ago

1.1.7

2 years ago

1.1.6

2 years ago

1.1.5

2 years ago

1.1.4

2 years ago

1.1.3

2 years ago

1.1.1

2 years ago

1.1.0

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago