kobp
Version:
Koa Boilerplate with MikroORM
85 lines • 2.72 kB
JavaScript
import Router from 'koa-router';
export class KobpRouter extends Router {
}
export class BaseRoutedController {
constructor(allRoutesMiddlewares = []) {
this.allRoutesMiddlewares = allRoutesMiddlewares;
}
getRouteMaps() {
return {
...(this.__drm || {}), /* will be injected from decorators package */
};
}
async handleSuccess(ctx, data) {
ctx.status = 200;
ctx.body = {
success: true,
data
};
}
/**
* Counter path of getRouter(). Use this method to register the controller to given router.
*
* @param path
* @param koaRouter
*/
register(path, koaRouter, ...middlewares) {
const r = this.getRouter();
// clean the path - path may ended with extra slashes that we don't need.
const cleanPath = path.trim().replace(/\/*$/, '');
koaRouter.use(cleanPath, ...middlewares, r.routes(), r.allowedMethods());
}
getRouter() {
const router = new KobpRouter();
const map = this.getRouteMaps();
for (const fname in map) {
let { method, path } = map[fname];
const { middlewares } = map[fname];
path = path || `/${fname}`;
if (typeof method === 'string') {
method = [method];
}
for (const _m of method) {
const mw = [...this.allRoutesMiddlewares, ...(middlewares || [])];
for (let i = 0; i < mw.length; i += 1) {
router[_m](path, mw[i]);
}
router[_m](path, async (ctx, _next) => {
try {
const out = await this[fname || 'index'](ctx);
const res = ctx.response;
if (!res.doNotHandleSuccess) {
await this.handleSuccess(ctx, out);
}
}
catch (error) {
ctx.throw(error);
}
});
}
}
return router;
}
/**
* Tell the context to disable default JSON output handler
*
* @example
* ```
* class SomeController {
* @Route('/')
* async call(context: KobpServiceContext): Promise<void> {
* this.setDoNotHandleSuccess(context)
* context.redirect('/login')
* }
* }
* ```
*/
setDoNotHandleSuccess(context) {
context.response.doNotHandleSuccess = true;
}
getMiddlewares() {
const r = this.getRouter();
return [r.routes(), r.allowedMethods()];
}
}
//# sourceMappingURL=base.controller.js.map