UNPKG

unleash-server

Version:

Unleash is an enterprise ready feature toggles service. It provides different strategies for handling feature toggles.

113 lines 3.74 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const express_1 = require("express"); const permissions_1 = require("../types/permissions"); const util_1 = require("./util"); const no_access_error_1 = __importDefault(require("../error/no-access-error")); const content_type_checker_1 = __importDefault(require("../middleware/content_type_checker")); const checkPermission = (permission) => async (req, res, next) => { if (!permission || permission === permissions_1.NONE) { return next(); } if (req.checkRbac && (await req.checkRbac(permission))) { return next(); } return res.status(403).json(new no_access_error_1.default(permission)).end(); }; /** * Base class for Controllers to standardize binding to express Router. * * This class will take care of the following: * - try/catch inside RequestHandler * - await if the RequestHandler returns a promise. * - access control */ class Controller { constructor(config) { this.ownLogger = config.getLogger(`controller/${this.constructor.name}`); this.app = (0, express_1.Router)(); this.config = config; } useRouteErrorHandler(handler) { return async (req, res) => { try { await handler(req, res); } catch (error) { (0, util_1.handleErrors)(res, this.ownLogger, error); } }; } useContentTypeMiddleware(options) { const { middleware = [], acceptedContentTypes = [] } = options; return options.method === 'get' || options.acceptAnyContentType ? middleware : [(0, content_type_checker_1.default)(...acceptedContentTypes), ...middleware]; } route(options) { this.app[options.method](options.path, checkPermission(options.permission), this.useContentTypeMiddleware(options), this.useRouteErrorHandler(options.handler.bind(this))); } get(path, handler, permission) { this.route({ method: 'get', path, handler, permission, }); } post(path, handler, permission, ...acceptedContentTypes) { this.route({ method: 'post', path, handler, permission, acceptedContentTypes, }); } put(path, handler, permission, ...acceptedContentTypes) { this.route({ method: 'put', path, handler, permission, acceptedContentTypes, }); } patch(path, handler, permission, ...acceptedContentTypes) { this.route({ method: 'patch', path, handler, permission, acceptedContentTypes, }); } delete(path, handler, permission) { this.route({ method: 'delete', path, handler, permission, acceptAnyContentType: true, }); } fileupload(path, filehandler, handler, permission) { this.app.post(path, checkPermission(permission), filehandler.bind(this), this.useRouteErrorHandler(handler.bind(this))); } use(path, router) { this.app.use(path, router); } // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types useWithMiddleware(path, router, middleware) { this.app.use(path, middleware, router); } get router() { return this.app; } } exports.default = Controller; module.exports = Controller; //# sourceMappingURL=controller.js.map