This commit is contained in:
2020-05-02 21:48:22 +02:00
parent 0eea261e56
commit 1541018701
7 changed files with 42 additions and 36 deletions

View File

@ -1,8 +1,8 @@
import { Request, Response } from 'express';
export interface CrudHandler {
public create(req: Request, res: Response): Promise<void>;
public read(req: Request, res: Response): Promise<void>;
public update(req: Request, res: Response): Promise<void>;
public delete(req: Request, res: Response): Promise<void>;
create(req: Request, res: Response): Promise<void>;
read(req: Request, res: Response): Promise<void>;
update(req: Request, res: Response): Promise<void>;
delete(req: Request, res: Response): Promise<void>;
}

View File

@ -4,16 +4,19 @@ import { ControlModel, DatabaseModel } from '@scode/modelling';
import { CrudHandler } from './CrudHandler';
import { HttpHandler } from './HttpHandler';
import { DatabaseCrudOptionsReader } from './DatabaseCrudOptionsReader';
import { DatabaseCrudOptions } from './DatabaseCrudOptions';
export class DatabaseCrudHandler extends HttpHandler implements CrudHandler {
protected cm: new () => ControlModel;
protected dm: new () => DatabaseModel;
protected cm:
new (object: Record<string, string|number|boolean>) => ControlModel;
protected dm: new (id?: number) => DatabaseModel;
protected options: DatabaseCrudOptionsReader;
public constructor<T extends ControlModel, U extends DatabaseModel> (
table: string,
cm: new () => ControlModel,
dm: new () => DatabaseModel
public constructor (
cm: new (object: Record<string, string|number|boolean>) => ControlModel,
dm: new (id?: number) => DatabaseModel,
options: DatabaseCrudOptions = {}
) {
super ();
this.cm = cm;
@ -24,7 +27,7 @@ export class DatabaseCrudHandler extends HttpHandler implements CrudHandler {
protected validate_body (
req: Request,
res: Response
): Promise<Record<string, unknown>> | Record<string, unknown> {
): Promise<Record<string, unknown> | null> | Record<string, unknown> | null {
if (typeof req.body === 'undefined') {
res.status (http.status_bad_request);
res.end ('body was undefined');
@ -48,8 +51,7 @@ export class DatabaseCrudHandler extends HttpHandler implements CrudHandler {
if (body_data === null)
return;
const cm = new this.cm;
cm.object = body_data;
const cm = new this.cm (body_data as Record<string|string, number|boolean>);
cm.update ();
const dm = new this.dm;
@ -71,7 +73,7 @@ export class DatabaseCrudHandler extends HttpHandler implements CrudHandler {
return;
}
const dm = new this.dm (req.headers.id);
const dm = new this.dm (parseInt (req.headers.id as string));
const found = await dm.read ();
const cm = new this.cm (dm.object);
@ -95,7 +97,7 @@ export class DatabaseCrudHandler extends HttpHandler implements CrudHandler {
return;
}
const dm = new this.dm (req.headers.id);
const dm = new this.dm (parseInt (req.headers.id as string));
const found = await dm.read ();
if (!found) {
res.status (http.status_not_found)
@ -107,10 +109,12 @@ export class DatabaseCrudHandler extends HttpHandler implements CrudHandler {
cm.update ();
for (const key of Object.keys (body_data))
cm.set (key, body_data[key]);
cm.set (key, body_data[key] as string|number|boolean);
cm.update ();
dm.object = cm.object;
for (const key of Object.keys (cm.object))
dm.set (key, cm.get (key));
const written = await dm.write ();
res.status (written ? http.status_ok : http.status_internal_server_error)
@ -127,7 +131,7 @@ export class DatabaseCrudHandler extends HttpHandler implements CrudHandler {
return;
}
const dm = new this.dm (req.headers.id);
const dm = new this.dm (parseInt (req.headers.id as string));
const found = await dm.read ();
if (!found) {
res.status (http.status_not_found)

View File

@ -1,5 +1,4 @@
import { Request, Response } from 'express';
import ControlModel from '@scode/modelling';
type Authorization = {
(req: Request, res: Response): Promise<boolean>;
@ -13,7 +12,6 @@ interface DatabaseCrudOptions {
update_authorization?: Authorization;
delete_authorization?: Authorization;
optional_columns?: Array<string>;
control_model?: Type<ControlModel>;
}
export { Authorization, DatabaseCrudOptions };

View File

@ -17,15 +17,19 @@ export class DatabaseCrudOptionsReader {
): AuthRunner {
if (typeof auth === 'undefined')
return (): Promise<boolean> => new Promise ((r) => r (true));
return (req, res): Promise<boolean> => new Promise ((resolve) => {
let resolved = false;
const result = await auth (req, res, (cb) => {
resolved = true;
resolve (typeof cb === 'undefined' || cb === true);
});
if (!resolved)
resolve (result);
});
return (req, res): Promise<boolean> => new Promise (
(resolve: (value: boolean) => void) => {
(async (): Promise<void> => {
let resolved = false;
const result = await auth (req, res, (cb: unknown) => {
resolved = true;
resolve (typeof cb === 'undefined' || cb === true);
});
if (!resolved)
resolve (result === true);
}) ();
}
);
}
public get optional_columns (): Array<string> | undefined {

View File

@ -1,6 +1,6 @@
import { Router } from 'express';
export class HttpHandler {
export abstract class HttpHandler {
public abstract register_handlers(router: Router): void;
public get_router (): Router {