-- 010_unify_races.sql — unify finished_races and live_races into a single -- `races` table with a 5-state status. -- -- After this migration the `races` table holds both the live -- surface (lobby | countdown | racing) and the finished archive -- (finished | cancelled). live_race_drivers keeps the same shape -- (one row per (race, driver)). The former `finished_races` columns -- are kept verbatim; the former `live_races` columns are added -- (started_ms is reused, created_ms was there too). -- 1) Rename finished_races -> races. ALTER TABLE finished_races RENAME TO races; -- 2) Drop the old finished-only check and replace with a unified one. ALTER TABLE races DROP CONSTRAINT IF EXISTS finished_races_status_check; ALTER TABLE races ADD CONSTRAINT races_status_check CHECK (status IN ('lobby', 'countdown', 'racing', 'finished', 'cancelled')); -- 2a) Add the live-only columns to the (former) finished table. ALTER TABLE races ADD COLUMN IF NOT EXISTS updated_ms BIGINT NOT NULL DEFAULT 0; -- 3) Drop the old index that referenced the old table name and -- recreate it. The new keyset index sorts on (status, finished_ms -- DESC, id DESC) so the list view can read live+finished together -- when needed. DROP INDEX IF EXISTS finished_races_finished_ms_id_idx; CREATE INDEX IF NOT EXISTS races_status_finished_idx ON races (status, finished_ms DESC, id DESC); DROP INDEX IF EXISTS finished_races_host_idx; -- host_id no longer exists, but the -- index name may have survived. Defensive drop. CREATE INDEX IF NOT EXISTS races_started_idx ON races (status, started_ms DESC, id DESC); -- 4) Move live rows from live_races into races BEFORE renaming -- live_race_drivers, so the FK has somewhere to point. INSERT INTO races (id, name, track_id, max_cars, laps, time_limit_s, status, created_ms, started_ms, finished_ms, updated_ms, podium) SELECT id, name, track_id, max_cars, laps, time_limit_s, status, created_ms, started_ms, 0, updated_ms, '[]'::jsonb FROM live_races ON CONFLICT (id) DO UPDATE SET name = EXCLUDED.name, track_id = EXCLUDED.track_id, max_cars = EXCLUDED.max_cars, laps = EXCLUDED.laps, time_limit_s = EXCLUDED.time_limit_s, status = EXCLUDED.status, created_ms = EXCLUDED.created_ms, started_ms = EXCLUDED.started_ms, updated_ms = EXCLUDED.updated_ms; -- 5) live_race_drivers: rename to race_drivers and re-target the FK -- at the unified races table. ALTER TABLE live_race_drivers RENAME TO race_drivers; ALTER TABLE race_drivers DROP CONSTRAINT IF EXISTS live_race_drivers_race_id_fkey; ALTER TABLE race_drivers ADD CONSTRAINT race_drivers_race_id_fkey FOREIGN KEY (race_id) REFERENCES races(id) ON DELETE CASCADE; -- 6) Drop the now-redundant live tables. DROP TABLE IF EXISTS live_race_drivers; DROP TABLE IF EXISTS live_races;