Files
yourpart3/backend/migrations-active/20261104000000-add-character-development-ages.cjs
Torsten Schulz (local) 8e8e92aa62
All checks were successful
Deploy to production / deploy (push) Successful in 2m26s
Mache Charakterentwicklungsmigration wiederholbar
2026-11-04 14:37:11 +01:00

79 lines
3.2 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 puberty_start_age SMALLINT,
ADD COLUMN IF NOT EXISTS fertile_from_age SMALLINT;
-- Shared by Sequelize and raw daemon INSERTs, including newborns and NPCs.
-- One real calendar day is one game year. These are game distributions,
-- not medical predictions or reconstructed medieval population data.
CREATE OR REPLACE FUNCTION falukant_data.initialize_character_development()
RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
IF TG_OP = 'UPDATE' THEN
NEW.puberty_start_age := COALESCE(NEW.puberty_start_age, OLD.puberty_start_age);
NEW.fertile_from_age := COALESCE(NEW.fertile_from_age, OLD.fertile_from_age);
END IF;
IF NEW.puberty_start_age IS NULL THEN
NEW.puberty_start_age :=
CASE WHEN lower(NEW.gender) IN ('female', 'f') THEN 8 ELSE 9 END
+ floor((random() + random()) * 3)::int;
END IF;
IF NEW.fertile_from_age IS NULL THEN
NEW.fertile_from_age := NEW.puberty_start_age + 2 + floor(random() * 2)::int;
END IF;
RETURN NEW;
END;
$$;
DROP TRIGGER IF EXISTS initialize_character_development ON falukant_data.character;
CREATE TRIGGER initialize_character_development
BEFORE INSERT OR UPDATE ON falukant_data.character
FOR EACH ROW EXECUTE FUNCTION falukant_data.initialize_character_development();
-- Existing pregnancies and relationships are deliberately untouched.
UPDATE falukant_data.character SET puberty_start_age = puberty_start_age
WHERE puberty_start_age IS NULL OR fertile_from_age IS NULL;
ALTER TABLE falukant_data.character
ALTER COLUMN puberty_start_age SET NOT NULL,
ALTER COLUMN fertile_from_age SET NOT NULL;
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conrelid = 'falukant_data.character'::regclass
AND conname = 'character_development_ages_valid'
) THEN
ALTER TABLE falukant_data.character
ADD CONSTRAINT character_development_ages_valid CHECK (
puberty_start_age BETWEEN 8 AND 18
AND fertile_from_age > puberty_start_age
AND fertile_from_age <= 21
);
END IF;
END;
$$;
`, { transaction });
});
},
async down(queryInterface) {
await queryInterface.sequelize.transaction(async (transaction) => {
await queryInterface.sequelize.query(`
DROP TRIGGER initialize_character_development ON falukant_data.character;
DROP FUNCTION falukant_data.initialize_character_development();
ALTER TABLE falukant_data.character
DROP CONSTRAINT character_development_ages_valid,
DROP COLUMN puberty_start_age,
DROP COLUMN fertile_from_age;
`, { transaction });
});
}
};