Core webhook ingestion plug.
Processes incoming webhook requests by:
- Extracting the raw body from
conn.assigns[:raw_body](populated byAccrue.Webhook.CachingBodyReaderin the pipeline) - Verifying the
Stripe-Signatureheader viaAccrue.Webhook.Signature - Projecting the verified event into
%Accrue.Webhook.Event{} - Storing the verified event and raw body in
conn.privatefor downstream processing
Signature failures raise Accrue.SignatureError, rescued to HTTP 400.
Transactional pipeline
After verification, Accrue.Webhook.Ingest.run/4 atomically persists the
webhook event, enqueues an Oban dispatch job, and records an accrue_events
ledger entry -- all in a single Ecto.Multi transaction.