NHttp Controller

Micro routing controller for Deno with decorator support.

limited to nhttp only. requires nhttp version 1.1.5 or higher.

Installation

deno.land

import {...} from "https://deno.land/x/nhttp_controller@0.4.0/mod.ts";

nest.land

import {...} from "https://x.nest.land/nhttp_controller@0.4.0/mod.ts";

Usage

import { NHttp } from "https://deno.land/x/nhttp@{version}/mod.ts";
import {
  addControllers,
  BaseController,
  Controller,
  Get,
  Post,
  Status,
} from "https://deno.land/x/nhttp_controller@0.4.0/mod.ts";

@Controller("/hello")
class HelloController extends BaseController {
  @Get()
  findAll() {
    return { name: "john" };
  }

  @Get("/:id")
  findById() {
    const { params } = this.requestEvent;
    return params;
  }

  @Status(201)
  @Post()
  save() {
    const { body } = this.requestEvent;
    return body;
  }
}

class App extends NHttp {
  constructor() {
    super();
    this.use("/api", addControllers([HelloController]));
  }
}

await new App().listen(3000);

Decorator

Controller

@Controller(path?: string).

...
@Controller("/hello")
class HelloController extends BaseController {...}
...

Method

@METHOD(path?: string).

Support => @Get, @Post, @Put, @Delete, @Patch, @Head, @Options, @Any, @Trace, @Connect.

...
@Controller("/hello")
class HelloController extends BaseController {

    @Get()
    hello() {
        return "hello";
    }
}
...

Status

@Status(code: number | (rev, next) => number).

...
@Controller("/hello")
class HelloController extends BaseController {

    @Status(201)
    @Post()
    save() {
        return "Created";
    }

    @Status((rev) => {
        // logic here
        return 200;
    })
    @Put('/:id')
    update() {
        return "Updated";
    }
}
...

@Header(object | (rev, next) => object).

...
@Controller("/hello")
class HelloController extends BaseController {

    @Header({ "Content-Type": "text/html" })
    @Get()
    hello() {
        return "<h1>Hello</h1>";
    }

    @Header((rev) => {
        let type = rev.url.includes(".css") ? "text/css" : "text/plain";
        return { "Content-Type": type };
    })
    @Get()
    hello2() {
        return Deno.readFile('./path/to/file');
    }
}
...

Type

@Type(contentType:string | (rev, next) => string).

...
@Controller("/hello")
class HelloController extends BaseController {

    @Type("html")
    @Get()
    hello() {
        return "<h1>Hello</h1>";
    }
}
...

View

@View(name: string | (rev, next) => string).

requires viewEngine

...
@Controller("/hello")
class HelloController extends BaseController {

    @View("index")
    @Get()
    hello() {
        return {
            title: "Page Title"
        };
    }
}
...

Middlewares

@Wares(…middlewares).

...
@Controller("/hello")
class HelloController extends BaseController {

    @Wares((rev, next) => {
        rev.foo = "foo";
        return next();
    })
    @Get()
    hello() {
        const { foo } = this.requestEvent;
        return foo;
    }
}
...

Upload

@Upload(options).

Relation to multipart

...
@Controller("/hello")
class HelloController extends BaseController {

    @Upload({
        name: 'image',
        required: true,
        maxSize: '2mb'
    })
    @Post()
    hello() {
        const { body, file } = this.requestEvent;
        console.log(file)
        console.log(body)
        return 'Success upload';
    }
}
...

Inject

@Inject(value: any, …args: any).

...

class HelloService {

    async findAll() {
        const data = await db.findAll();
        return { data, status: 200 }; 
    }

    async save(body) {
        await db.save(body);
        return { message: 'success save', status: 201 }; 
    }
}

@Controller("/hello")
class HelloController extends BaseController {

    @Inject(HelloService)
    private readonly service!: HelloService;

    @Get()
    findAll() {
        return this.service.findAll();
    }

    @Status(201)
    @Post()
    save() {
        const { body } = this.requestEvent;
        return this.service.save(body);
    }
}
...

addControllers

addControllers(classControllers: class[]).

...
app.use(addControllers([HelloController, OtherController]));
app.use('/api/v1', addControllers([HelloController, OtherController]));
app.use('/api/v1', middlewares, addControllers([HelloController, OtherController]));
...

License

MIT