48 lines
1.9 KiB
SQL
48 lines
1.9 KiB
SQL
-- Webhook-Subscriptions für externe Integrationen.
|
|
-- ====================================================================
|
|
-- Externe Systeme abonnieren Events ("employee.created",
|
|
-- "employee.updated", "lead.created", etc.) und erhalten POST-Requests
|
|
-- mit JSON-Payload. Signatur via HMAC-SHA256 mit Secret pro Endpoint.
|
|
--
|
|
-- Delivery-Log: jede Zustellung wird protokolliert (für Retry-
|
|
-- Diagnose und Audit).
|
|
|
|
create table if not exists public.webhook_subscriptions (
|
|
id uuid primary key default gen_random_uuid(),
|
|
name text not null,
|
|
url text not null,
|
|
events text[] not null default array[]::text[],
|
|
secret text not null, -- für HMAC-Signatur
|
|
active boolean not null default true,
|
|
created_at timestamptz not null default now(),
|
|
updated_at timestamptz not null default now()
|
|
);
|
|
|
|
create index if not exists webhook_subscriptions_active_idx
|
|
on public.webhook_subscriptions (active) where active = true;
|
|
|
|
drop trigger if exists trg_webhook_subscriptions_updated_at
|
|
on public.webhook_subscriptions;
|
|
create trigger trg_webhook_subscriptions_updated_at
|
|
before update on public.webhook_subscriptions
|
|
for each row execute function public.set_updated_at();
|
|
|
|
create table if not exists public.webhook_deliveries (
|
|
id uuid primary key default gen_random_uuid(),
|
|
subscription_id uuid references public.webhook_subscriptions(id)
|
|
on delete cascade,
|
|
event text not null,
|
|
payload jsonb not null,
|
|
status_code integer,
|
|
response_body text,
|
|
error text,
|
|
delivered_at timestamptz not null default now()
|
|
);
|
|
|
|
create index if not exists webhook_deliveries_subscription_idx
|
|
on public.webhook_deliveries (subscription_id, delivered_at desc);
|
|
|
|
alter table public.webhook_subscriptions enable row level security;
|
|
alter table public.webhook_deliveries enable row level security;
|
|
-- Service-Role-only.
|