add docuseal webhook receiver with event log + completion notification
POST /api/docuseal/webhook/<token> validates the path token against DOCUSEAL_WEBHOOK_TOKEN, persists every event to docuseal_events with the full payload as jsonb, and emails Will via Resend on form.completed or form.declined. Token rotates via Secret Manager.
This commit is contained in:
@@ -0,0 +1,29 @@
|
|||||||
|
-- DocuSeal webhook event log.
|
||||||
|
--
|
||||||
|
-- Append-only audit trail of every event delivered by DocuSeal to
|
||||||
|
-- /api/docuseal/webhook/<token>. The full webhook body is preserved as
|
||||||
|
-- jsonb in `payload` so we never lose information; the extracted columns
|
||||||
|
-- are for fast lookup and downstream notification logic.
|
||||||
|
--
|
||||||
|
-- RLS is on with no policies; only the service-role key (used by the
|
||||||
|
-- webhook receiver in main.el) can read or write.
|
||||||
|
|
||||||
|
create table if not exists public.docuseal_events (
|
||||||
|
id bigserial primary key,
|
||||||
|
event_type text not null,
|
||||||
|
received_at timestamptz not null default now(),
|
||||||
|
event_timestamp timestamptz,
|
||||||
|
submission_id bigint,
|
||||||
|
signer_email text,
|
||||||
|
signer_name text,
|
||||||
|
payload jsonb not null,
|
||||||
|
ua text,
|
||||||
|
ip text
|
||||||
|
);
|
||||||
|
|
||||||
|
create index if not exists docuseal_events_submission_id_idx on public.docuseal_events (submission_id);
|
||||||
|
create index if not exists docuseal_events_email_idx on public.docuseal_events (signer_email);
|
||||||
|
create index if not exists docuseal_events_event_type_idx on public.docuseal_events (event_type);
|
||||||
|
create index if not exists docuseal_events_received_at_idx on public.docuseal_events (received_at desc);
|
||||||
|
|
||||||
|
alter table public.docuseal_events enable row level security;
|
||||||
Reference in New Issue
Block a user