-- Migration 001: the schema of a webhook's event database. The models -- in internal/database must agree with it. The webhook, entrypoint and -- target ids here name rows in the main database, which has those -- tables; this file does not. CREATE TABLE events ( id uuid, created_at datetime, updated_at datetime, deleted_at datetime, webhook_id uuid NOT NULL, entrypoint_id uuid NOT NULL, method text NOT NULL, raw_query text, headers text, body text, content_type text, body_bytes integer NOT NULL, resubmitted_from_id uuid, PRIMARY KEY (id) ); CREATE INDEX idx_events_created_at ON events (created_at); CREATE INDEX idx_events_deleted_at ON events (deleted_at); CREATE INDEX idx_events_deleted_at_created_at ON events (deleted_at, created_at); CREATE INDEX idx_events_resubmitted_from_id ON events (resubmitted_from_id, deleted_at); CREATE INDEX idx_events_entrypoint_id ON events (entrypoint_id, deleted_at, resubmitted_from_id, created_at); CREATE TABLE deliveries ( id uuid, created_at datetime, updated_at datetime, deleted_at datetime, event_id uuid NOT NULL, target_id uuid NOT NULL, status text NOT NULL DEFAULT 'pending', finished_at datetime, replay numeric NOT NULL DEFAULT false, PRIMARY KEY (id), CONSTRAINT fk_events_deliveries FOREIGN KEY (event_id) REFERENCES events (id) ); CREATE INDEX idx_deliveries_deleted_at ON deliveries (deleted_at); CREATE INDEX idx_deliveries_event_id ON deliveries (event_id, deleted_at); CREATE INDEX idx_deliveries_status ON deliveries (status, deleted_at, finished_at, target_id); CREATE TABLE delivery_results ( id uuid, created_at datetime, updated_at datetime, deleted_at datetime, delivery_id uuid NOT NULL, attempt_num integer NOT NULL, success numeric, status_code integer, response_body text, error text, duration integer, PRIMARY KEY (id), CONSTRAINT fk_deliveries_delivery_results FOREIGN KEY (delivery_id) REFERENCES deliveries (id) ); CREATE INDEX idx_delivery_results_deleted_at ON delivery_results (deleted_at); CREATE INDEX idx_delivery_results_delivery_id ON delivery_results (delivery_id, deleted_at); CREATE TABLE event_totals ( id integer PRIMARY KEY AUTOINCREMENT, events integer NOT NULL, events_removed integer NOT NULL, last_event_at datetime ); -- The one row of event totals, all zero. INSERT INTO event_totals (events, events_removed) VALUES (0, 0); CREATE TABLE target_totals ( target_id uuid, deliveries integer NOT NULL, delivered integer NOT NULL, failed integer NOT NULL, deliveries_removed integer NOT NULL, failed_removed integer NOT NULL, PRIMARY KEY (target_id) ); CREATE TABLE entrypoint_totals ( entrypoint_id uuid, last_event_at datetime NOT NULL, PRIMARY KEY (entrypoint_id) );