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 ?? "");
 | 
						|
};
 |