kobp
Version:
Koa Boilerplate with MikroORM
93 lines • 3.11 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.BaseRoutedController = exports.KobpRouter = void 0;
const koa_router_1 = __importDefault(require("koa-router"));
class KobpRouter extends koa_router_1.default {
}
exports.KobpRouter = KobpRouter;
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()];
}
}
exports.BaseRoutedController = BaseRoutedController;
//# sourceMappingURL=base.controller.js.map