diff --git a/packages/webserver/src/index.ts b/packages/webserver/src/index.ts index f9c5ca5..17e43c0 100644 --- a/packages/webserver/src/index.ts +++ b/packages/webserver/src/index.ts @@ -1,5 +1,6 @@ export * from "./RouteRegisterFactory"; export * from "./middleware"; export * from "./requests"; +export * from "./response"; export * from "./RouteRegisterFactory"; export * from "./WebServerService"; diff --git a/packages/webserver/src/response/index.ts b/packages/webserver/src/response/index.ts new file mode 100644 index 0000000..19c5a07 --- /dev/null +++ b/packages/webserver/src/response/index.ts @@ -0,0 +1,59 @@ +import { FastifyReply } from "fastify"; + +/** + * The basic response schema + */ +export interface IResponse { + result?: T, + status : string +} + +/** + * Supported status codes + */ +export enum Status { + Ok = 200, + BadRequest = 400, + Unauthorized = 401, + Forbidden = 403, + Conflict = 409, + PayloadTooLarge = 413, + UnprocessableEntity = 422 +} + +/** + * Create a response + */ +function createResponse(status: Status, result?: T): IResponse { + switch(status) { + case Status.Ok: + return { result, status: "OK" }; + case Status.BadRequest: + return { result, status: "Bad Request" }; + case Status.Unauthorized: + return { result, status: "Unauthorized" } + case Status.Forbidden: + return { result, status: "Forbidden" } + case Status.Conflict: + return { result, status: "Conflict" } + case Status.Conflict: + return { result, status: "Payload Too Large" } + case Status.UnprocessableEntity: + return { result, status: "Unprocessable Entity" } + } + throw new Error(`Unknown response code: ${status}`); +} + +/** + * Respond to a request + */ +export function respond(reply: FastifyReply, status: Status, result?: T) { + try { + let response = createResponse(status, result); + reply.status(status); + reply.send(response); + } catch(e) { + reply.status(500); + reply.send({ status: "Internal Server Error" }); + } +}