104 lines
14 KiB
JavaScript
104 lines
14 KiB
JavaScript
|
import config from "config";
|
||
|
import Logger from "./Logger";
|
||
|
export default class Controller {
|
||
|
static route(route, params = [], absolute = false) {
|
||
|
let path = this.routes[route];
|
||
|
if (path === undefined)
|
||
|
throw new Error(`Unknown route for name ${route}.`);
|
||
|
if (typeof params === 'string' || typeof params === 'number') {
|
||
|
path = path.replace(/:[a-zA-Z_-]+\??/, '' + params);
|
||
|
}
|
||
|
else if (Array.isArray(params)) {
|
||
|
let i = 0;
|
||
|
for (const match of path.matchAll(/:[a-zA-Z_-]+\??/)) {
|
||
|
if (match.length > 0) {
|
||
|
path = path.replace(match[0], typeof params[i] !== 'undefined' ? params[i] : '');
|
||
|
}
|
||
|
i++;
|
||
|
}
|
||
|
path = path.replace(/\/+/, '/');
|
||
|
}
|
||
|
else {
|
||
|
for (const key in params) {
|
||
|
if (params.hasOwnProperty(key)) {
|
||
|
path = path.replace(new RegExp(`:${key}\\??`), params[key]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return `${absolute ? config.get('public_url') : ''}${path}`;
|
||
|
}
|
||
|
getGlobalHandlers() {
|
||
|
return [];
|
||
|
}
|
||
|
hasGlobalHandlers() {
|
||
|
return this.getGlobalHandlers().length > 0;
|
||
|
}
|
||
|
setupGlobalHandlers(router) {
|
||
|
for (const globalHandler of this.getGlobalHandlers()) {
|
||
|
router.use(this.wrap(globalHandler));
|
||
|
}
|
||
|
}
|
||
|
getRoutesPrefix() {
|
||
|
return '/';
|
||
|
}
|
||
|
setupRoutes(router) {
|
||
|
this.router = router;
|
||
|
this.routes();
|
||
|
}
|
||
|
use(handler) {
|
||
|
var _a;
|
||
|
(_a = this.router) === null || _a === void 0 ? void 0 : _a.use(this.wrap(handler));
|
||
|
}
|
||
|
get(path, handler, routeName, ...middlewares) {
|
||
|
var _a, _b;
|
||
|
this.registerRoutes(path, handler, routeName);
|
||
|
for (const middleware of middlewares) {
|
||
|
(_a = this.router) === null || _a === void 0 ? void 0 : _a.get(path, this.wrap(middleware));
|
||
|
}
|
||
|
(_b = this.router) === null || _b === void 0 ? void 0 : _b.get(path, this.wrap(handler));
|
||
|
}
|
||
|
post(path, handler, routeName, ...middlewares) {
|
||
|
var _a, _b;
|
||
|
this.registerRoutes(path, handler, routeName);
|
||
|
for (const middleware of middlewares) {
|
||
|
(_a = this.router) === null || _a === void 0 ? void 0 : _a.post(path, this.wrap(middleware));
|
||
|
}
|
||
|
(_b = this.router) === null || _b === void 0 ? void 0 : _b.post(path, this.wrap(handler));
|
||
|
}
|
||
|
wrap(handler) {
|
||
|
return (req, res, next) => {
|
||
|
const promise = handler.call(this, req, res, next);
|
||
|
if (promise instanceof Promise) {
|
||
|
promise.catch(err => next(err));
|
||
|
}
|
||
|
};
|
||
|
}
|
||
|
registerRoutes(path, handler, routeName) {
|
||
|
if (typeof routeName !== 'string') {
|
||
|
routeName = handler.name
|
||
|
.replace(/(?:^|\.?)([A-Z])/g, (x, y) => '_' + y.toLowerCase())
|
||
|
.replace(/(^_|get_|post_)/g, '');
|
||
|
}
|
||
|
if (routeName.length === 0)
|
||
|
return;
|
||
|
let routePath = null;
|
||
|
if (path instanceof Array && path.length > 0) {
|
||
|
path = path[0];
|
||
|
}
|
||
|
if (typeof path === 'string') {
|
||
|
const prefix = this.getRoutesPrefix();
|
||
|
routePath = (prefix !== '/' ? prefix : '') + path;
|
||
|
}
|
||
|
if (!Controller.routes[routeName]) {
|
||
|
if (typeof routePath === 'string') {
|
||
|
Logger.info(`Route ${routeName} has path ${routePath}`);
|
||
|
Controller.routes[routeName] = routePath;
|
||
|
}
|
||
|
else {
|
||
|
Logger.warn(`Cannot assign path to route ${routeName}.`);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
Controller.routes = {};
|
||
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udHJvbGxlci5qcyIsInNvdXJjZVJvb3QiOiIuLyIsInNvdXJjZXMiOlsiQ29udHJvbGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxNQUFNLE1BQU0sVUFBVSxDQUFDO0FBRTlCLE1BQU0sQ0FBQyxPQUFPLE9BQWdCLFVBQVU7SUFHN0IsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFhLEVBQUUsU0FBc0IsRUFBRSxFQUFFLFdBQW9CLEtBQUs7UUFDbEYsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUksS0FBSyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUU1RSxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDMUQsSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsRUFBRSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZEO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNWLEtBQUssTUFBTSxLQUFLLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO2dCQUNsRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO29CQUNsQixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNwRjtnQkFDRCxDQUFDLEVBQUUs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
|