import { Request, Response } from "express"; interface PRASResponse extends Response { pras: { ok: (message: string, data: any, code: string, extra: any) => void; created: (message: string, data: any, code: string, extra: any) => void; badRequest: (message: string, data: any, code: string, extra: any) => void; unauthorized: ( message: string, data: any, code: string, extra: any ) => void; forbidden: (message: string, data: any, code: string, extra: any) => void; notFound: (message: string, data: any, code: string, extra: any) => void; serverError: (message: string, data: any, code: string, extra: any) => void; customMessage: ( statusCode: number, message: string, data: any, code: string, extra: any ) => void; }; } export class PRAS { private getPRASResultObject( status: string, message: string, data: any, code: string, extra: any ) { return { status: status || "OK", message: message || "", data: data || null, code: code || "UNKNOWN_CODE", extra: extra || null, }; } public responseMiddleware() { return (req: Request, res: PRASResponse, next: Function): void => { res.pras = { ok: (message, data, code, extra) => { res .status(200) .json(this.getPRASResultObject("OK", message, data, code, extra)); }, created: (message, data, code, extra) => { res .status(201) .json(this.getPRASResultObject("OK", message, data, code, extra)); }, badRequest: (message, data, code, extra) => { res .status(400) .json(this.getPRASResultObject("FAIL", message, data, code, extra)); }, unauthorized: (message, data, code, extra) => { res .status(401) .json(this.getPRASResultObject("FAIL", message, data, code, extra)); }, forbidden: (message, data, code, extra) => { res .status(403) .json(this.getPRASResultObject("FAIL", message, data, code, extra)); }, notFound: (message, data, code, extra) => { res .status(404) .json(this.getPRASResultObject("FAIL", message, data, code, extra)); }, serverError: (message, data, code, extra) => { res .status(500) .json( this.getPRASResultObject("ERROR", message, data, code, extra) ); }, customMessage: (statusCode, message, data, code, extra) => { let status; if (statusCode >= 500) { status = "ERROR"; } else if (statusCode >= 400) { status = "FAIL"; } else { status = "OK"; } res .status(statusCode) .json(this.getPRASResultObject(status, message, data, code, extra)); }, }; next(); }; } } export default new PRAS();