82 lines
1.7 KiB
TypeScript
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 });
|