|
|
@ -0,0 +1,59 @@ |
|
|
|
import { FastifyReply } from "fastify"; |
|
|
|
|
|
|
|
/** |
|
|
|
* The basic response schema |
|
|
|
*/ |
|
|
|
export interface IResponse<T> { |
|
|
|
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<T = any>(status: Status, result?: T): IResponse<T> { |
|
|
|
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<T = any>(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" }); |
|
|
|
} |
|
|
|
} |