import type { AfterLifecycleHookEvent, LifecycleHookContext } from '@admin/lib/lifecycle-hooks/types' import { emitWebhookEvent } from '@admin/actions/webhooks/emit-webhook-event' import { entityEventPayload } from '@admin/actions/webhooks/entity-event-payload' import { webhookEventSources } from '@admin/data/webhook-events' import { registerHook } from '@admin/lib/lifecycle-hooks/registry' let webhookHooksRegistered = false const ENTITY_EVENT_HOOKS: Array<{ hook: AfterLifecycleHookEvent suffix: string }> = [ { hook: 'afterCreate', suffix: 'created' }, { hook: 'afterUpdate', suffix: 'updated' }, { hook: 'afterDelete', suffix: 'deleted' }, { hook: 'afterPublish', suffix: 'published' }, { hook: 'afterUnpublish', suffix: 'unpublished' }, { hook: 'afterRestore', suffix: 'restored' }, { hook: 'afterReorder', suffix: 'reordered' } ] export function registerWebhookHooks(): void { if (webhookHooksRegistered) return webhookHooksRegistered = true for (const source of webhookEventSources) { if (source.kind === 'entity') { for (const { hook, suffix } of ENTITY_EVENT_HOOKS) { const event = `${source.schema}.${suffix}` if (!source.events.includes(event)) continue registerHook(source.schema, hook, (context) => { emitWebhookEvent(event, entityEventPayload(hook, context)) }) } continue } if (source.kind === 'single') { const event = `${source.schema}.updated` if (!source.events.includes(event)) continue const emitUpdated = (context: LifecycleHookContext) => { emitWebhookEvent(event, context.data ?? null) } registerHook(source.schema, 'afterCreate', emitUpdated) registerHook(source.schema, 'afterUpdate', emitUpdated) continue } const event = source.events[0] if (!event) continue registerHook(source.schema, 'afterCreate', (context) => { emitWebhookEvent(event, context.data ?? null) }) } }