52 lines
1.3 KiB
TypeScript
52 lines
1.3 KiB
TypeScript
import { ZodError } from "dbtype";
|
|
|
|
export interface ErrorFormat {
|
|
code: number;
|
|
message: string;
|
|
detail?: string;
|
|
}
|
|
|
|
export class ClientRequestError extends Error {
|
|
code: number;
|
|
|
|
constructor(code: number, message: string) {
|
|
super(message);
|
|
this.name = "client request error";
|
|
this.code = code;
|
|
}
|
|
}
|
|
|
|
const code_to_message_table: { [key: number]: string | undefined } = {
|
|
400: "BadRequest",
|
|
404: "NotFound",
|
|
};
|
|
|
|
export const error_handler = ({ code, error, set }: { code: string, error: Error, set: { status?: number | string } }) => {
|
|
if (error instanceof ClientRequestError) {
|
|
set.status = error.code;
|
|
return {
|
|
code: error.code,
|
|
message: code_to_message_table[error.code] ?? "",
|
|
detail: error.message,
|
|
} satisfies ErrorFormat;
|
|
}
|
|
if (error instanceof ZodError) {
|
|
set.status = 400;
|
|
return {
|
|
code: 400,
|
|
message: "BadRequest",
|
|
detail: error.errors.map((x) => x.message).join(", "),
|
|
} satisfies ErrorFormat;
|
|
}
|
|
|
|
set.status = 500;
|
|
return {
|
|
code: 500,
|
|
message: "Internal Server Error",
|
|
detail: error.message,
|
|
}
|
|
};
|
|
|
|
export const sendError = (code: number, message?: string): never => {
|
|
throw new ClientRequestError(code, message ?? "");
|
|
};
|