Add operation flows and activity logs for betas and campaigns
This commit is contained in:
@@ -286,3 +286,96 @@ CREATE TABLE IF NOT EXISTS server_creation_jobs (
|
||||
map_slug TEXT NOT NULL,
|
||||
expected_map TEXT NOT NULL
|
||||
);
|
||||
|
||||
-- Persist state transitions atomically, including changes made by background workers.
|
||||
-- Polls with unchanged status/error do not produce duplicate activity entries.
|
||||
CREATE TABLE IF NOT EXISTS beta_events (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
beta_id INTEGER NOT NULL REFERENCES betas(id) ON DELETE CASCADE,
|
||||
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
|
||||
message TEXT NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_beta_events ON beta_events(beta_id, id);
|
||||
CREATE TRIGGER IF NOT EXISTS beta_activity_open AFTER INSERT ON betas
|
||||
BEGIN
|
||||
INSERT INTO beta_events (beta_id, created_at, message)
|
||||
VALUES (NEW.id, NEW.opened_at, 'Beta opened');
|
||||
END;
|
||||
|
||||
CREATE TABLE IF NOT EXISTS campaign_events (
|
||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
deployment_id TEXT NOT NULL REFERENCES deployments(id) ON DELETE CASCADE,
|
||||
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ','now')),
|
||||
message TEXT NOT NULL
|
||||
);
|
||||
CREATE INDEX IF NOT EXISTS idx_campaign_events ON campaign_events(deployment_id, id);
|
||||
CREATE TRIGGER IF NOT EXISTS campaign_activity_file AFTER INSERT ON deployment_files
|
||||
BEGIN
|
||||
INSERT INTO campaign_events (deployment_id, message)
|
||||
VALUES (NEW.deployment_id, NEW.server || ': ' || NEW.verb || ' ' || NEW.rel_path);
|
||||
END;
|
||||
CREATE TRIGGER IF NOT EXISTS campaign_activity_open AFTER INSERT ON deployments
|
||||
BEGIN
|
||||
INSERT INTO campaign_events (deployment_id, created_at, message)
|
||||
VALUES (NEW.id, NEW.started_at, 'Campaign started: ' || NEW.action);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS beta_activity_state AFTER UPDATE OF state ON betas
|
||||
WHEN OLD.state IS NOT NEW.state
|
||||
BEGIN
|
||||
INSERT INTO beta_events (beta_id, message) VALUES (NEW.id, CASE NEW.state
|
||||
WHEN 'ready-promote' THEN 'All beta servers are ready for review and promotion'
|
||||
WHEN 'promoted' THEN 'Beta promoted'
|
||||
WHEN 'rolled-back' THEN 'Beta rolled back'
|
||||
ELSE 'Beta state: ' || NEW.state END);
|
||||
END;
|
||||
CREATE TRIGGER IF NOT EXISTS campaign_activity_finish AFTER UPDATE OF finished_at ON deployments
|
||||
WHEN OLD.finished_at IS NULL AND NEW.finished_at IS NOT NULL
|
||||
BEGIN
|
||||
INSERT INTO campaign_events (deployment_id, created_at, message)
|
||||
VALUES (NEW.id, NEW.finished_at, 'Campaign processing finished; see server statuses for held or manual work');
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS beta_activity_server_insert AFTER INSERT ON beta_servers
|
||||
|
||||
BEGIN
|
||||
INSERT INTO beta_events (beta_id, message) VALUES (NEW.beta_id, NEW.server || ': ' || CASE WHEN NEW.stage = 'deploying' THEN 'Deploying artifacts'
|
||||
WHEN NEW.stage = 'awaiting-empty' THEN 'Waiting for an empty server'
|
||||
WHEN NEW.stage = 'restarting' THEN 'Restarting server'
|
||||
WHEN NEW.stage = 'awaiting-health' THEN 'Verifying health'
|
||||
WHEN NEW.stage = 'awaiting-match' THEN 'Waiting for a completed match'
|
||||
WHEN NEW.stage = 'ready' THEN 'Ready for promotion'
|
||||
WHEN NEW.stage = 'failed' THEN 'Failed' ELSE NEW.stage END || CASE WHEN NEW.error IS NOT NULL THEN ' — ' || NEW.error ELSE '' END);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS beta_activity_server_update AFTER UPDATE ON beta_servers
|
||||
WHEN OLD.stage IS NOT NEW.stage OR OLD.error IS NOT NEW.error OR OLD.restarted_at IS NOT NEW.restarted_at
|
||||
BEGIN
|
||||
INSERT INTO beta_events (beta_id, message) VALUES (NEW.beta_id, NEW.server || ': ' || CASE WHEN NEW.stage = 'deploying' THEN 'Deploying artifacts'
|
||||
WHEN NEW.stage = 'awaiting-empty' THEN 'Waiting for an empty server'
|
||||
WHEN NEW.stage = 'restarting' THEN 'Restarting server'
|
||||
WHEN NEW.stage = 'awaiting-health' THEN 'Verifying health'
|
||||
WHEN NEW.stage = 'awaiting-match' THEN 'Waiting for a completed match'
|
||||
WHEN NEW.stage = 'ready' THEN 'Ready for promotion'
|
||||
WHEN NEW.stage = 'failed' THEN 'Failed' ELSE NEW.stage END || CASE WHEN NEW.error IS NOT NULL THEN ' — ' || NEW.error ELSE '' END);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS campaign_activity_server_insert AFTER INSERT ON deployment_servers
|
||||
|
||||
BEGIN
|
||||
INSERT INTO campaign_events (deployment_id, message) VALUES (NEW.deployment_id, NEW.server || ': ' || CASE WHEN NEW.restart_state = 'pending' AND NEW.restarted_at IS NOT NULL THEN 'Restart requested; verifying health' WHEN NEW.restart_state = 'pending' THEN 'Waiting for an empty server or restart capacity'
|
||||
WHEN NEW.restart_state = 'done' THEN 'Server complete'
|
||||
WHEN NEW.restart_state = 'failed' THEN 'Failed'
|
||||
WHEN NEW.restart_state = 'manual' THEN 'Manual restart required'
|
||||
WHEN NEW.restart_state = 'held' THEN 'Changes held' ELSE NEW.restart_state END || CASE WHEN NEW.error IS NOT NULL THEN ' — ' || NEW.error ELSE '' END);
|
||||
END;
|
||||
|
||||
CREATE TRIGGER IF NOT EXISTS campaign_activity_server_update AFTER UPDATE ON deployment_servers
|
||||
WHEN OLD.restart_state IS NOT NEW.restart_state OR OLD.error IS NOT NEW.error OR OLD.restarted_at IS NOT NEW.restarted_at
|
||||
BEGIN
|
||||
INSERT INTO campaign_events (deployment_id, message) VALUES (NEW.deployment_id, NEW.server || ': ' || CASE WHEN NEW.restart_state = 'pending' AND NEW.restarted_at IS NOT NULL THEN 'Restart requested; verifying health' WHEN NEW.restart_state = 'pending' THEN 'Waiting for an empty server or restart capacity'
|
||||
WHEN NEW.restart_state = 'done' THEN 'Server complete'
|
||||
WHEN NEW.restart_state = 'failed' THEN 'Failed'
|
||||
WHEN NEW.restart_state = 'manual' THEN 'Manual restart required'
|
||||
WHEN NEW.restart_state = 'held' THEN 'Changes held' ELSE NEW.restart_state END || CASE WHEN NEW.error IS NOT NULL THEN ' — ' || NEW.error ELSE '' END);
|
||||
END;
|
||||
|
||||
Reference in New Issue
Block a user