-- Ops-B analytics (ECR-007) CREATE TABLE IF NOT EXISTS analytics_sessions ( session_id varchar(64) PRIMARY KEY, device_key varchar(128) NOT NULL, user_id uuid NULL REFERENCES users(id), started_at timestamptz NOT NULL DEFAULT now(), ended_at timestamptz NULL, exit_page text NULL, duration_ms int NULL ); CREATE INDEX IF NOT EXISTS idx_analytics_sessions_started ON analytics_sessions(started_at DESC); CREATE INDEX IF NOT EXISTS idx_analytics_sessions_user ON analytics_sessions(user_id); CREATE INDEX IF NOT EXISTS idx_analytics_sessions_device ON analytics_sessions(device_key); CREATE TABLE IF NOT EXISTS analytics_events ( id uuid PRIMARY KEY DEFAULT gen_random_uuid(), session_id varchar(64) NOT NULL REFERENCES analytics_sessions(session_id), user_id uuid NULL REFERENCES users(id), name varchar(64) NOT NULL, page_path text NULL, props jsonb NOT NULL DEFAULT '{}', client_ts timestamptz NOT NULL, received_at timestamptz NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_analytics_events_received ON analytics_events(received_at DESC); CREATE INDEX IF NOT EXISTS idx_analytics_events_name_day ON analytics_events(name, ((received_at AT TIME ZONE 'UTC')::date)); CREATE INDEX IF NOT EXISTS idx_analytics_events_page ON analytics_events(page_path) WHERE page_path IS NOT NULL; CREATE INDEX IF NOT EXISTS idx_analytics_events_session ON analytics_events(session_id);