Files
m1-sor-exercises/exercice6.ts

82 lines
1.7 KiB
TypeScript

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<T> {
success: true;
data: T;
error?: never;
}
export interface APIFailure {
success: false;
data?: never;
error: APIError;
}
export type APIResponse<T> = APISuccess<T> | 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 });