diff --git a/src/Server.ts b/src/Server.ts index ca94ebc..70a083c 100644 --- a/src/Server.ts +++ b/src/Server.ts @@ -209,25 +209,25 @@ export class Server { - const errorResponse = (status: HttpStatus, opts?: { message?: string; data?: any; code?: string }) => { + const respond = (status: HttpStatus, opts?: { error?: boolean, message?: string; data?: any; code?: string }) => { return res .status(status) - .send({ error: true, status: status, code: opts?.code || HttpStatus[status], message: opts?.message, data: opts?.data }); + .send({ error: opts?.error ?? true, status: status, code: opts?.code || HttpStatus[status], message: opts?.message, data: opts?.data }); }; const variables = new Map(); for (let auth of routeMiddleware) { let worked = false; let goNext = () => (worked = true); - await auth.handle({ ...this.config.routes.context, req, res, next: goNext, errorResponse, variables }, auth.data); + await auth.handle({ ...this.config.routes.context, req, res, next: goNext, respond, variables }, auth.data); if (worked == false) return; } try { - return route.handler({ ...this.config.routes.context, req, res, next, errorResponse, variables }); + return route.handler({ ...this.config.routes.context, req, res, next, respond, variables }); } catch (error) { log('error', (error as Error).message ?? 'Unknown error'); - return errorResponse(HttpStatus.INTERNAL_SERVER_ERROR, { + return respond(HttpStatus.INTERNAL_SERVER_ERROR, { message: (error as Error).message ?? 'Unknown error', code: 'UNKNOWN_ROUTE_ERROR', }); diff --git a/src/documentation/index.ts b/src/documentation/index.ts index 36d2967..93a1b87 100644 --- a/src/documentation/index.ts +++ b/src/documentation/index.ts @@ -60,6 +60,32 @@ export default class Documentation { this.operationIds = new Set(); this.schemaNames = new Set(); + + this.addSchema("GenericResponse", { + type: "object", + required: ["success", "code", "status"], + properties: { + error: { + type: "boolean", + description: "Whether the request errored." + }, + status: { + type: "number", + description: "The HTTP status code.", + }, + code: { + type: "string", + description: "The error code." + }, + message: { + type: "string", + description: "The error message.", + }, + data: { + description: "The validation error messages." + } + } + }); } addSchema(name: string, schema: OpenAPI.SchemaObject, publicSchema = false) { diff --git a/src/types/httprouter.ts b/src/types/httprouter.ts index 749da51..39564cb 100644 --- a/src/types/httprouter.ts +++ b/src/types/httprouter.ts @@ -24,23 +24,24 @@ export interface RouteConfig express.Response>; -export type ExpressErrorResponse = express.Response>; +export type ExpressGenericResponse = express.Response>; export interface HTTPContext { // HTTP Context req: express.Request; res: express.Response; next: express.NextFunction; - errorResponse: ErrorResponse; + respond: GenericResponse; variables: Map; } diff --git a/src/types/server.ts b/src/types/server.ts index 8e0bdb4..a930946 100644 --- a/src/types/server.ts +++ b/src/types/server.ts @@ -1,5 +1,5 @@ import express from 'express'; -import { ExpressErrorResponse, HTTPContext } from './httprouter'; +import { ExpressGenericResponse, HTTPContext } from './httprouter'; import { APIInfoObject } from 'documentation'; import { WebSocketServer } from 'ws'; @@ -13,7 +13,7 @@ import { WebSocketServer } from 'ws'; export type CtxMiddlewareFunction = ( ctx: Context & HTTPContext, data: Data, -) => (express.NextFunction | ExpressErrorResponse | void) | Promise; +) => (express.NextFunction | ExpressGenericResponse | void) | Promise; export type MiddlewareFunction = ( req: express.Request, res: express.Response,