Files
evening_detective_server/migrations/20261013120000_team_uuid.sql
T
2026-10-11 16:00:18 +07:00

66 lines
2.7 KiB
PL/PgSQL

-- +goose Up
-- Finish venue transfers and back up all databases before this coordinated upgrade.
CREATE TEMP TABLE team_id_mapping (
old_id INTEGER PRIMARY KEY,
new_id UUID NOT NULL UNIQUE
) ON COMMIT DROP;
-- PostgreSQL 15 lacks uuidv7(); this one-time migration fills v7 time bits in a random UUID.
INSERT INTO team_id_mapping (old_id, new_id)
SELECT
id,
overlay(
overlay(
replace(gen_random_uuid()::text, '-', '')
placing lpad(to_hex(floor(extract(epoch FROM clock_timestamp()) * 1000)::bigint), 12, '0')
from 1 for 12
)
placing '7' from 13 for 1
)::uuid
FROM teams;
-- +goose StatementBegin
CREATE FUNCTION pg_temp.team_uuid(old_id INTEGER) RETURNS UUID
LANGUAGE SQL STABLE STRICT AS $$
SELECT m.new_id FROM team_id_mapping m WHERE m.old_id = $1;
$$;
-- +goose StatementEnd
ALTER TABLE actions DROP CONSTRAINT fk_actions_team;
ALTER TABLE applications DROP CONSTRAINT fk_applications_team;
ALTER TABLE team_answers DROP CONSTRAINT fk_team_answers_team;
ALTER TABLE game_reviews DROP CONSTRAINT game_reviews_team_id_fkey;
ALTER TABLE teams ALTER COLUMN id DROP DEFAULT;
ALTER TABLE teams ALTER COLUMN id TYPE UUID USING pg_temp.team_uuid(id);
ALTER TABLE actions ALTER COLUMN team_id TYPE UUID USING pg_temp.team_uuid(team_id);
ALTER TABLE applications ALTER COLUMN team_id TYPE UUID USING pg_temp.team_uuid(team_id);
ALTER TABLE team_answers ALTER COLUMN team_id TYPE UUID USING pg_temp.team_uuid(team_id);
ALTER TABLE game_reviews ALTER COLUMN team_id TYPE UUID USING pg_temp.team_uuid(team_id);
ALTER TABLE actions ADD CONSTRAINT fk_actions_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE;
ALTER TABLE applications ADD CONSTRAINT fk_applications_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE;
ALTER TABLE team_answers ADD CONSTRAINT fk_team_answers_team FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE;
ALTER TABLE game_reviews ADD CONSTRAINT game_reviews_team_id_fkey FOREIGN KEY (team_id) REFERENCES teams(id) ON DELETE CASCADE;
ALTER TABLE game_map_items ALTER COLUMN item_id TYPE TEXT USING item_id::text;
UPDATE game_map_items m
SET item_id = n.new_id::text
FROM team_id_mapping n
WHERE m.kind = 'team' AND m.item_id = n.old_id::text;
DROP SEQUENCE teams_id_seq;
DROP FUNCTION pg_temp.team_uuid(INTEGER);
-- Old packages contain numeric team IDs. Keep gameplay and media, discard transfer registries.
DELETE FROM game_returns;
DELETE FROM game_exports;
DELETE FROM game_imports;
-- +goose Down
-- +goose StatementBegin
DO $$ BEGIN
RAISE EXCEPTION 'Restore the pre-UUID database backup and previous application version to roll back';
END $$;
-- +goose StatementEnd