From b8ec6cd9316e02d1773853e278c2aef8e6681447 Mon Sep 17 00:00:00 2001 From: OG T Date: Sun, 7 Jun 2026 16:35:05 +0800 Subject: [PATCH] fix: make traffic payout metrics resilient when ledger table missing --- apps/web/src/app/api/traffic/route.ts | 48 +++++++++++++++++++-------- 1 file changed, 34 insertions(+), 14 deletions(-) diff --git a/apps/web/src/app/api/traffic/route.ts b/apps/web/src/app/api/traffic/route.ts index 1a15e96..6e3dc5d 100644 --- a/apps/web/src/app/api/traffic/route.ts +++ b/apps/web/src/app/api/traffic/route.ts @@ -12,6 +12,15 @@ function asRecordJson(value: unknown): Record | undefined { return undefined; } +function isMissingTableError(error: unknown): boolean { + return ( + typeof error === "object" && + error !== null && + "code" in error && + (error as { code: string }).code === "P2021" + ); +} + export async function GET(request: NextRequest) { if (MONITOR_TOKEN) { const token = request.headers.get("x-traffic-token"); @@ -90,22 +99,33 @@ export async function GET(request: NextRequest) { metadata: true, }, }), - prisma.ledgerEntry.count({ - where: { - created_at: { gte: since }, - phase: "CAPTURE", - response_status: "SUCCESS", - }, - }), - prisma.ledgerEntry.count({ - where: { - created_at: { gte: since }, - phase: "RELEASE", - response_status: "SUCCESS", - }, - }), ]); + let capturedPayoutCount = 0; + let releasedPayoutCount = 0; + try { + [capturedPayoutCount, releasedPayoutCount] = await Promise.all([ + prisma.ledgerEntry.count({ + where: { + created_at: { gte: since }, + phase: "CAPTURE", + response_status: "SUCCESS", + }, + }), + prisma.ledgerEntry.count({ + where: { + created_at: { gte: since }, + phase: "RELEASE", + response_status: "SUCCESS", + }, + }), + ]); + } catch (error) { + if (!isMissingTableError(error)) { + throw error; + } + } + const actionSummary = Object.fromEntries( summaryRows.map((row) => [row.action, row._count._all]) );