Files
cfw-autumn/server/src/utils/routerUtils.ts
2025-06-13 10:58:53 +01:00

68 lines
1.6 KiB
TypeScript

import { ErrCode } from "@autumn/shared";
import RecaseError, {
formatZodError,
handleRequestError,
} from "./errorUtils.js";
import { ZodError } from "zod";
import { StatusCodes } from "http-status-codes";
import Stripe from "stripe";
export const routeHandler = async ({
req,
res,
action,
handler,
}: {
req: any;
res: any;
action: string;
handler: (req: any, res: any) => Promise<void>;
}) => {
try {
await handler(req, res);
} catch (error) {
try {
if (error instanceof RecaseError) {
if (error.code === ErrCode.EntityNotFound) {
req.logtail.warn(
`${error.message}, org: ${req.org?.slug || req.orgId}`,
);
return res.status(404).json({
message: error.message,
code: error.code,
});
}
}
} catch (error) {}
let originalUrl = req.originalUrl;
if (error instanceof Stripe.errors.StripeError) {
if (
originalUrl.includes("/billing_portal") &&
error.message.includes("Provide a configuration or create your default")
) {
req.logtail.warn(`Billing portal config error, org: ${req.org?.slug}`);
return res.status(404).json({
message: error.message,
code: ErrCode.InvalidRequest,
});
}
}
if (error instanceof ZodError && req.originalUrl.includes("/attach")) {
error = new RecaseError({
message: formatZodError(error),
code: ErrCode.InvalidInputs,
statusCode: StatusCodes.BAD_REQUEST,
});
}
handleRequestError({
error,
req,
res,
action,
});
}
};