From 202dd4ca76fc2d95580891982167fd3f17bd38f7 Mon Sep 17 00:00:00 2001 From: John Yeo Date: Fri, 24 Oct 2025 17:46:37 +0100 Subject: [PATCH] chore: added errors to skip --- .../external/webhooks/connectWebhookRouter.ts | 6 +++- .../honoMiddlewares/errorSkipMiddleware.ts | 15 +++++++++ server/src/internal/api/events/eventRouter.ts | 2 -- .../src/utils/routerUtils/expressErrorSkip.ts | 9 ++++++ .../src/utils/routerUtils/webhookErrorSkip.ts | 31 +++++++++++++++++++ 5 files changed, 60 insertions(+), 3 deletions(-) create mode 100644 server/src/utils/routerUtils/webhookErrorSkip.ts diff --git a/server/src/external/webhooks/connectWebhookRouter.ts b/server/src/external/webhooks/connectWebhookRouter.ts index 2d2b61e56..26f40bc21 100644 --- a/server/src/external/webhooks/connectWebhookRouter.ts +++ b/server/src/external/webhooks/connectWebhookRouter.ts @@ -14,6 +14,7 @@ import { import type { HonoEnv } from "@/honoUtils/HonoEnv.js"; import { OrgService } from "@/internal/orgs/OrgService.js"; import type { ExtendedRequest } from "@/utils/models/Request.js"; +import { handleWebhookErrorSkip } from "../../utils/routerUtils/webhookErrorSkip.js"; import { handleStripeWebhookEvent } from "../stripe/handleStripeWebhookEvent.js"; export const connectWebhookRouter: Router = express.Router(); @@ -117,7 +118,10 @@ export const handleConnectWebhook = async (c: Context) => { }); return c.json({ message: "Webhook received" }, 200); } catch (error) { - logger.error(`Stripe webhook, error: ${error}`, { error }); + const shouldSkip = handleWebhookErrorSkip({ error, logger }); + if (!shouldSkip) { + logger.error(`Stripe webhook, error: ${error}`, { error }); + } return c.json({ message: "Webhook received, internal server error" }, 200); } }; diff --git a/server/src/honoMiddlewares/errorSkipMiddleware.ts b/server/src/honoMiddlewares/errorSkipMiddleware.ts index 22890ec70..121bf19b6 100644 --- a/server/src/honoMiddlewares/errorSkipMiddleware.ts +++ b/server/src/honoMiddlewares/errorSkipMiddleware.ts @@ -113,6 +113,14 @@ const STRIPE_RULES = [ statusCode: 400, code: ErrCode.InvalidRequest, }, + { + name: "Not a valid URL error", + match: (err: Error) => + err instanceof Stripe.errors.StripeError && + err.message.includes("Not a valid URL"), + statusCode: 400, + code: ErrCode.InvalidRequest, + }, ] as const; /** Zod-specific error handling rules */ @@ -124,6 +132,13 @@ const ZOD_RULES = [ statusCode: 400, format: (err: ZodError) => formatZodError(err), }, + { + name: "Zod error on /checkout (email validation)", + match: (err: Error, c: Context) => + err instanceof ZodError && c.req.url.includes("/checkout"), + statusCode: 400, + format: (err: ZodError) => formatZodError(err), + }, ] as const; const createErrorResponse = ({ diff --git a/server/src/internal/api/events/eventRouter.ts b/server/src/internal/api/events/eventRouter.ts index 02c803f42..a0558f96d 100644 --- a/server/src/internal/api/events/eventRouter.ts +++ b/server/src/internal/api/events/eventRouter.ts @@ -207,8 +207,6 @@ eventsRouter.post("", async (req: any, res: any) => { try { const body = req.body; - console.log("body", body); - if (!body.event_name && !body.feature_id) { throw new RecaseError({ message: "event_name or feature_id is required", diff --git a/server/src/utils/routerUtils/expressErrorSkip.ts b/server/src/utils/routerUtils/expressErrorSkip.ts index 1ef435ae5..27eb60c63 100644 --- a/server/src/utils/routerUtils/expressErrorSkip.ts +++ b/server/src/utils/routerUtils/expressErrorSkip.ts @@ -145,6 +145,15 @@ export const handleExpressErrorSkip = ({ code: ErrCode.InvalidRequest, }); } + + // Not a valid URL error + if (error.message.includes("Not a valid URL")) { + req.logger.warn(`Not a valid URL error, org: ${req.org?.slug}`); + return res.status(400).json({ + message: error.message, + code: ErrCode.InvalidRequest, + }); + } } // No skip case matched diff --git a/server/src/utils/routerUtils/webhookErrorSkip.ts b/server/src/utils/routerUtils/webhookErrorSkip.ts new file mode 100644 index 000000000..232a1590a --- /dev/null +++ b/server/src/utils/routerUtils/webhookErrorSkip.ts @@ -0,0 +1,31 @@ +import type { Logger } from "../../external/logtail/logtailUtils.js"; + +/** + * Checks if a webhook error should be skipped (not logged). + * Returns true if error should be skipped, false otherwise. + */ +export const handleWebhookErrorSkip = ({ + error, + logger, +}: { + error: any; + logger?: Logger; +}): boolean => { + const errorMessage = String(error); + + // Skip "live mode key used" errors + if ( + errorMessage.includes("but a live mode key was used to make this request.") + ) { + return true; + } + + // Skip "Not a valid URL" errors + if (errorMessage.includes("Not a valid URL")) { + logger?.warn("Webhook error: Not a valid URL"); + return true; + } + + // Don't skip this error + return false; +};