import { prisma } from "@/lib/db"; /** True if we've already handled this provider event (idempotency). */ export async function alreadyProcessed(eventId: string): Promise { const existing = await prisma.webhookEvent.findUnique({ where: { eventId } }); // Only a successfully "processed" event is considered handled. Rows logged as // "failed" (or "skipped") must be reprocessable when the provider retries. return existing?.status === "processed"; } /** Record a webhook delivery for the admin log (best-effort; unique on eventId). */ export async function logWebhook( provider: "stripe" | "paypal", eventId: string, type: string, status: "processed" | "failed" | "skipped", error?: string ): Promise { await prisma.webhookEvent .upsert({ where: { eventId }, create: { provider, eventId, type, status, error }, update: { status, error }, }) .catch((e) => console.error("[webhook-log] write failed", e)); }