From 148000d816877591d4ea998750ab5847373d3fad Mon Sep 17 00:00:00 2001 From: Kiran K Date: Mon, 14 Jul 2025 09:26:17 +0530 Subject: [PATCH] Refactor payout processing to use invoiceId only Simplifies the payload for payout processing by removing unused fields and the shared utils file --- .../(ee)/api/cron/payouts/charge-succeeded/route.ts | 13 ++++++++----- .../payouts/charge-succeeded/send-paypal-payouts.ts | 5 +---- .../payouts/charge-succeeded/send-stripe-payouts.ts | 5 +---- .../(ee)/api/cron/payouts/charge-succeeded/utils.ts | 9 --------- .../app/(ee)/api/stripe/webhook/charge-succeeded.ts | 4 ---- 5 files changed, 10 insertions(+), 26 deletions(-) delete mode 100644 apps/web/app/(ee)/api/cron/payouts/charge-succeeded/utils.ts diff --git a/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/route.ts b/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/route.ts index 05c52a5de1e..5264ccb421f 100644 --- a/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/route.ts +++ b/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/route.ts @@ -2,12 +2,16 @@ import { handleAndReturnErrorResponse } from "@/lib/api/errors"; import { verifyQstashSignature } from "@/lib/cron/verify-qstash"; import { prisma } from "@dub/prisma"; import { log } from "@dub/utils"; +import { z } from "zod"; import { sendPaypalPayouts } from "./send-paypal-payouts"; import { sendStripePayouts } from "./send-stripe-payouts"; -import { payloadSchema } from "./utils"; export const dynamic = "force-dynamic"; +const payloadSchema = z.object({ + invoiceId: z.string(), +}); + // POST /api/cron/payouts/charge-succeeded // This route is used to process the charge-succeeded event from Stripe // we're intentionally offloading this to a cron job to avoid blocking the main thread @@ -17,8 +21,7 @@ export async function POST(req: Request) { const rawBody = await req.text(); await verifyQstashSignature({ req, rawBody }); - const body = payloadSchema.parse(JSON.parse(rawBody)); - const { invoiceId } = body; + const { invoiceId } = payloadSchema.parse(JSON.parse(rawBody)); const invoice = await prisma.invoice.findUnique({ where: { @@ -53,11 +56,11 @@ export async function POST(req: Request) { await Promise.allSettled([ sendStripePayouts({ - payload: body, + invoiceId, }), sendPaypalPayouts({ - payload: body, + invoiceId, }), ]); diff --git a/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/send-paypal-payouts.ts b/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/send-paypal-payouts.ts index d2041ad2ece..4546fff7bf8 100644 --- a/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/send-paypal-payouts.ts +++ b/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/send-paypal-payouts.ts @@ -3,11 +3,8 @@ import { resend } from "@dub/email/resend"; import { VARIANT_TO_FROM_MAP } from "@dub/email/resend/constants"; import PartnerPayoutProcessed from "@dub/email/templates/partner-payout-processed"; import { prisma } from "@dub/prisma"; -import { Payload } from "./utils"; - -export async function sendPaypalPayouts({ payload }: { payload: Payload }) { - const { invoiceId } = payload; +export async function sendPaypalPayouts({ invoiceId }: { invoiceId: string }) { const payouts = await prisma.payout.findMany({ where: { invoiceId, diff --git a/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/send-stripe-payouts.ts b/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/send-stripe-payouts.ts index 67aeb837900..cd849775169 100644 --- a/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/send-stripe-payouts.ts +++ b/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/send-stripe-payouts.ts @@ -8,11 +8,8 @@ import PartnerPayoutProcessed from "@dub/email/templates/partner-payout-processe import { prisma } from "@dub/prisma"; import { currencyFormatter, pluralize } from "@dub/utils"; import { Prisma } from "@prisma/client"; -import { Payload } from "./utils"; - -export async function sendStripePayouts({ payload }: { payload: Payload }) { - const { invoiceId } = payload; +export async function sendStripePayouts({ invoiceId }: { invoiceId: string }) { const commonInclude = Prisma.validator()({ partner: { select: { diff --git a/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/utils.ts b/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/utils.ts deleted file mode 100644 index d6d47033a85..00000000000 --- a/apps/web/app/(ee)/api/cron/payouts/charge-succeeded/utils.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { z } from "zod"; - -export const payloadSchema = z.object({ - chargeId: z.string(), - invoiceId: z.string(), - achCreditTransfer: z.boolean(), -}); - -export type Payload = z.infer; diff --git a/apps/web/app/(ee)/api/stripe/webhook/charge-succeeded.ts b/apps/web/app/(ee)/api/stripe/webhook/charge-succeeded.ts index 04b3fe82053..307cb513b5c 100644 --- a/apps/web/app/(ee)/api/stripe/webhook/charge-succeeded.ts +++ b/apps/web/app/(ee)/api/stripe/webhook/charge-succeeded.ts @@ -64,11 +64,7 @@ export async function chargeSucceeded(event: Stripe.Event) { const qstashResponse = await qstash.publishJSON({ url: `${APP_DOMAIN_WITH_NGROK}/api/cron/payouts/charge-succeeded`, body: { - chargeId, invoiceId: invoice.id, - achCreditTransfer: Boolean( - charge.payment_method_details?.ach_credit_transfer, - ), }, });