complete handler structure

This commit is contained in:
2020-04-08 20:46:48 +02:00
parent 715f64408d
commit 89a861a2dd
6 changed files with 1272 additions and 72 deletions

41
lib/classes/Handler.ts Normal file
View File

@ -0,0 +1,41 @@
import { Request, Response } from '@types/express/index.d.ts';
import Transaction from './Transaction.ts';
export default abstract class Handler {
private _handlers: array<Function> = [];
private _method_handlers: Record<string, Function> = {};
protected register_handler (f: Function): void {
this._handlers.push (f);
}
protected register_handler (method: string, f: Function): void {
const m = method.toUpperCase ();
if (typeof this._method_handlers[m] !== 'undefined')
throw new Error (`Handler for ${m} already registered`);
this._method_handlers[m] = f;
}
private async run_method_handler (method: string, t: Transaction): void {
const m = method.toUpperCase ();
if (this._method_handlers[m] !== 'undefined')
await this._method_handlers[m] (t);
}
public async run_http_handler (req: Request, res: Response): void {
const t = new Transaction (req, res);
for (const handler of this._handlers) {
// eslint-disable-next-line no-await-in-loop
if (await handler (t) === false) {
if (!t.status.has_status)
t.status.error ();
t.finalize ();
return;
}
}
await this.run_method_handler ('ALL', t);
await this.run_method_handler (t.req.method, t);
}
public abstract get path(): string;
}

View File

@ -17,7 +17,31 @@ export default class Status {
return this._status !== -1;
}
/*
* Status setters
*/
public ok (): void {
this._status = http.status_ok;
}
public ok_no_content (): void {
this._status = http.status_ok_no_content;
}
public bad_request (): void {
this._status = http.status_bad_request;
}
public unauthorized (): void {
this._status = http.status_unauthorized;
}
public forbidden (): void {
this._status = http.status_forbidden;
}
public not_found (): void {
this._status = http.status_not_found;
}
}