76 lines
2.8 KiB
JavaScript
76 lines
2.8 KiB
JavaScript
'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 });
|
|
});
|
|
},
|
|
};
|