saleor-apps-redis_apl/apps/taxes/src/modules/app/webhook-response.ts
2023-08-03 09:25:15 +02:00

58 lines
1.6 KiB
TypeScript

import { NextApiResponse } from "next";
import { AvalaraError } from "avatax/lib/AvaTaxClient";
import { ZodError } from "zod";
import { createLogger, Logger } from "../../lib/logger";
class WebhookErrorResolver {
private logger: Logger;
constructor() {
this.logger = createLogger({ event: "WebhookErrorResolver" });
}
private resolveErrorMessage(error: unknown) {
if (error instanceof ZodError) {
this.logger.error(error.message, "Unexpected Zod error caught:");
this.logger.debug(error.stack, "Error details:");
return error.message;
}
if (error instanceof AvalaraError) {
this.logger.error(error.message, "Unexpected Avalara error caught:");
this.logger.debug(error.stack, "Error stack:");
this.logger.debug(error.target, "Error target:");
return error.message;
}
if (error instanceof Error) {
this.logger.error(error.stack, "Unexpected error caught:");
return error.message;
}
return "Internal server error";
}
resolve(error: unknown) {
return this.resolveErrorMessage(error);
}
}
export class WebhookResponse {
private logger: Logger;
constructor(private res: NextApiResponse) {
this.logger = createLogger({ event: "WebhookResponse" });
}
error(error: unknown) {
const errorResolver = new WebhookErrorResolver();
const errorMessage = errorResolver.resolve(error);
this.logger.debug({ errorMessage }, "Responding to Saleor with error:");
return this.res.status(500).json({ error: errorMessage });
}
success(data?: unknown) {
return this.res.status(200).json(data ?? {});
}
}