simrail.pro_CZ/packages/backend/src/http/responseBuilder.ts

79 lines
1.6 KiB
TypeScript

import { assert } from "node:console";
export interface IResponse<T>
{
success: boolean;
data: T;
code: number;
}
export class BaseResponseBuilder<T>
{
protected success: IResponse<T>["success"] = undefined!;
protected data: IResponse<T>["data"] = undefined!;
protected code: IResponse<T>["code"] = undefined!;
public constructor(data?: Partial<IResponse<T>>)
{
if (!data)
{
return;
}
if ("success" in data)
{
this.success = data.success as IResponse<T>["success"];
}
if ("data" in data)
{
this.data = data.data as IResponse<T>["data"];
}
if ("code" in data)
{
this.code = data.code as IResponse<T>["code"];
}
}
public setData(data: T)
{
this.data = data;
return this;
}
public setCode(code: number)
{
this.code = code;
return this;
}
public toJSON()
{
const { success, data, code } = this;
assert(typeof (success) === "boolean", "expected success to be boolean");
assert(typeof (code) === "number", "expected success to be number");
return {
success, data, code,
};
}
}
export class SuccessResponseBuilder<T> extends BaseResponseBuilder<T>
{
public constructor(options?: IResponse<T>)
{
super(options);
this.success = true;
}
}
export class ErrorResponseBuilder<T> extends BaseResponseBuilder<T>
{
public constructor(options?: IResponse<T>)
{
super(options);
this.success = false;
}
}