'use strict'; module.exports = { async up(queryInterface) { await queryInterface.sequelize.transaction(async (transaction) => { await queryInterface.sequelize.query(` ALTER TABLE falukant_data.character ADD COLUMN IF NOT EXISTS hair_color VARCHAR(7), ADD COLUMN IF NOT EXISTS eye_color VARCHAR(7); CREATE OR REPLACE FUNCTION falukant_data.initialize_character_appearance() RETURNS trigger LANGUAGE plpgsql AS $$ BEGIN IF TG_OP = 'UPDATE' THEN NEW.hair_color := COALESCE(NEW.hair_color, OLD.hair_color); NEW.eye_color := COALESCE(NEW.eye_color, OLD.eye_color); END IF; IF NEW.hair_color IS NULL THEN NEW.hair_color := (ARRAY[ '#211b18', '#493024', '#69432d', '#95603c', '#c69c60', '#d8bf83', '#a34826' ])[1 + floor(random() * 7)::int]; END IF; IF NEW.eye_color IS NULL THEN NEW.eye_color := (ARRAY[ '#493026', '#795532', '#8b7544', '#56704c', '#497c9c', '#75858b' ])[1 + floor(random() * 6)::int]; END IF; RETURN NEW; END; $$; DROP TRIGGER IF EXISTS initialize_character_appearance ON falukant_data.character; CREATE TRIGGER initialize_character_appearance BEFORE INSERT OR UPDATE ON falukant_data.character FOR EACH ROW EXECUTE FUNCTION falukant_data.initialize_character_appearance(); UPDATE falukant_data.character SET hair_color = hair_color WHERE hair_color IS NULL OR eye_color IS NULL; ALTER TABLE falukant_data.character ALTER COLUMN hair_color SET NOT NULL, ALTER COLUMN eye_color SET NOT NULL; DO $$ BEGIN IF NOT EXISTS ( SELECT 1 FROM pg_constraint WHERE conrelid = 'falukant_data.character'::regclass AND conname = 'character_appearance_colors_valid' ) THEN ALTER TABLE falukant_data.character ADD CONSTRAINT character_appearance_colors_valid CHECK ( hair_color ~ '^#[0-9a-fA-F]{6}$' AND eye_color ~ '^#[0-9a-fA-F]{6}$' ); END IF; END; $$; `, { transaction }); }); }, async down(queryInterface) { await queryInterface.sequelize.transaction(async (transaction) => { await queryInterface.sequelize.query(` DROP TRIGGER IF EXISTS initialize_character_appearance ON falukant_data.character; DROP FUNCTION IF EXISTS falukant_data.initialize_character_appearance(); ALTER TABLE falukant_data.character DROP CONSTRAINT IF EXISTS character_appearance_colors_valid, DROP COLUMN IF EXISTS hair_color, DROP COLUMN IF EXISTS eye_color; `, { transaction }); }); }, };