import crypto from "crypto"; import { db } from "@epicure/db"; import { webhooks, webhookDeliveries } from "@epicure/db"; import { eq, and } from "@epicure/db"; import { deliverWebhook } from "@/lib/webhook-delivery"; export const WEBHOOK_EVENTS = [ "recipe.created", "recipe.updated", "recipe.published", "recipe.deleted", "meal_plan.updated", "shopping_list.completed", "comment.added", ] as const; export type WebhookEvent = (typeof WEBHOOK_EVENTS)[number]; export async function dispatchWebhook(userId: string, event: WebhookEvent, payload: object) { const hooks = await db .select() .from(webhooks) .where(and(eq(webhooks.userId, userId), eq(webhooks.active, true))); const filtered = hooks.filter((h) => h.events.length === 0 || h.events.includes(event)); await Promise.allSettled( filtered.map(async (hook) => { const { statusCode, success } = await deliverWebhook(hook.url, hook.secret, event, payload); await db.insert(webhookDeliveries).values({ id: crypto.randomUUID(), webhookId: hook.id, event, payload: payload as Record, statusCode, success, attempts: 1, createdAt: new Date(), }); }) ); }