pub const AUDIT_TABLE_DDL: &str = r#"
CREATE TABLE IF NOT EXISTS cratestack_audit (
event_id UUID PRIMARY KEY,
schema_name TEXT NOT NULL,
model TEXT NOT NULL,
operation TEXT NOT NULL,
primary_key JSONB NOT NULL,
actor JSONB NOT NULL,
tenant TEXT,
before JSONB,
after JSONB,
request_id TEXT,
occurred_at TIMESTAMPTZ NOT NULL,
delivered_at TIMESTAMPTZ,
attempts BIGINT NOT NULL DEFAULT 0,
last_error TEXT
);
CREATE INDEX IF NOT EXISTS cratestack_audit_model_idx
ON cratestack_audit (schema_name, model, occurred_at DESC);
CREATE INDEX IF NOT EXISTS cratestack_audit_tenant_idx
ON cratestack_audit (tenant, occurred_at DESC)
WHERE tenant IS NOT NULL;
CREATE INDEX IF NOT EXISTS cratestack_audit_undelivered_idx
ON cratestack_audit (occurred_at)
WHERE delivered_at IS NULL;
"#;Expand description
DDL for the audit log table. Banks typically run migrations
through their own tooling — this DDL is exposed so the
crate::SqlxRuntime can idempotently ensure the table exists
during bootstrap.