cal.pub0.org/packages/lib/server/getServerErrorFromUnknown.ts

67 lines
2.1 KiB
TypeScript
Raw Normal View History

import { PrismaClientKnownRequestError, NotFoundError } from "@prisma/client/runtime";
2022-06-10 18:38:46 +00:00
import Stripe from "stripe";
2022-06-14 20:07:39 +00:00
import { ZodError, ZodIssue } from "zod";
2022-06-10 18:38:46 +00:00
import { HttpError } from "../http-error";
2022-06-14 20:07:39 +00:00
function hasName(cause: unknown): cause is { name: string } {
return !!cause && typeof cause === "object" && "name" in cause;
}
function isZodError(cause: unknown): cause is ZodError {
return cause instanceof ZodError || (hasName(cause) && cause.name === "ZodError");
}
function parseZodErrorIssues(issues: ZodIssue[]): string {
return issues
.map((i) =>
i.code === "invalid_union"
2022-06-14 20:43:50 +00:00
? i.unionErrors.map((ue) => parseZodErrorIssues(ue.issues)).join("; ")
: i.code === "unrecognized_keys"
? i.message
: `'${i.code}' in '${i.path}': ${i.message}`
2022-06-14 20:07:39 +00:00
)
2022-06-14 20:43:50 +00:00
.join("; ");
2022-06-14 20:07:39 +00:00
}
export function getServerErrorFromUnknown(cause: unknown): HttpError {
2022-06-14 20:07:39 +00:00
if (isZodError(cause)) {
console.log("cause", cause);
return new HttpError({
statusCode: 400,
message: parseZodErrorIssues(cause.issues),
cause,
});
}
if (cause instanceof SyntaxError) {
return new HttpError({
statusCode: 500,
message: "Unexpected error, please reach out for our customer support.",
});
}
2022-06-13 16:31:00 +00:00
if (cause instanceof PrismaClientKnownRequestError) {
2022-06-10 18:38:46 +00:00
return new HttpError({ statusCode: 400, message: cause.message, cause });
}
if (cause instanceof NotFoundError) {
return new HttpError({ statusCode: 404, message: cause.message, cause });
}
2022-06-14 20:07:39 +00:00
if (cause instanceof Stripe.errors.StripeInvalidRequestError) {
return new HttpError({ statusCode: 400, message: cause.message, cause });
2022-06-10 18:38:46 +00:00
}
if (cause instanceof HttpError) {
return cause;
}
2022-06-14 20:07:39 +00:00
if (cause instanceof Error) {
return new HttpError({ statusCode: 500, message: cause.message, cause });
2022-06-10 18:38:46 +00:00
}
if (typeof cause === "string") {
// @ts-expect-error https://github.com/tc39/proposal-error-cause
return new Error(cause, { cause });
}
return new HttpError({
statusCode: 500,
message: `Unhandled error of type '${typeof cause}'. Please reach out for our customer support.`,
});
2022-06-10 18:38:46 +00:00
}