-- +goose Up CREATE TABLE game_exports ( id TEXT PRIMARY KEY, game_id INTEGER REFERENCES games(id) ON DELETE SET NULL, initiator_id INTEGER REFERENCES users(id) ON DELETE SET NULL, state TEXT NOT NULL DEFAULT 'preparing' CHECK (state IN ('preparing', 'ready', 'failed')), snapshot JSONB NOT NULL, source_server TEXT NOT NULL, created_at TIMESTAMPTZ NOT NULL DEFAULT clock_timestamp(), owner_id TEXT, lease_until TIMESTAMPTZ, package_id TEXT NOT NULL DEFAULT '', size BIGINT NOT NULL DEFAULT 0, sha256 TEXT NOT NULL DEFAULT '', object_key TEXT NOT NULL UNIQUE, failure TEXT NOT NULL DEFAULT '', cleaned_at TIMESTAMPTZ, CHECK (state <> 'ready' OR (package_id <> '' AND size > 0 AND sha256 <> '')) ); CREATE UNIQUE INDEX game_exports_active ON game_exports(game_id) WHERE state IN ('preparing', 'ready'); CREATE INDEX game_exports_game ON game_exports(game_id, created_at DESC); CREATE INDEX game_exports_pending ON game_exports(created_at) WHERE state = 'preparing'; -- +goose Down DROP TABLE game_exports;