diff --git a/exercice6.ts b/exercice6.ts new file mode 100644 index 0000000..23c25c8 --- /dev/null +++ b/exercice6.ts @@ -0,0 +1,81 @@ +import { Application, Context, Next, Router } from "jsr:@oak/oak"; + +export enum APIErrorCode { + NOT_IMPLEMENTED = "NOT_IMPLEMENTED", + SERVER_ERROR = "SERVER_ERROR", +} + +export interface APIError { + code: APIErrorCode; + message: string; +} + +export interface APISuccess { + success: true; + data: T; + error?: never; +} + +export interface APIFailure { + success: false; + data?: never; + error: APIError; +} + +export type APIResponse = APISuccess | APIFailure; + +class APIException extends Error { + readonly code: APIErrorCode; + readonly status: number; + + constructor(code: APIErrorCode, status: number, message: string) { + super(message); + this.code = code; + this.status = status; + } +} + +async function errorMiddleware(ctx: Context, next: Next) { + try { + // On passe à la prochaine fonction de la chaîne + await next(); + } catch (err) { + if (err instanceof APIException) { + const responseBody: APIFailure = { + success: false, + error: { + code: err.code, + message: err.message, + } + }; + + ctx.response.status = err.status; + ctx.response.body = responseBody; + } else { + console.error(err); + + const responseBody: APIFailure = { + success: false, + error: { + code: APIErrorCode.SERVER_ERROR, + message: "Unexpected server error", + } + }; + + ctx.response.status = 500; + ctx.response.body = responseBody; + } + } +} + +const router = new Router(); + +router.get("/", errorMiddleware, (ctx) => { + throw new APIException(APIErrorCode.NOT_IMPLEMENTED, 501, "I need more time..."); +}); + +const app = new Application(); +app.use(router.routes()); +app.use(router.allowedMethods()); + +app.listen({ port: 8000 });