'use strict'; /** * A relationship may only become married after a wedding party. Older data * contains a few relationships that skipped that transition; besides showing * the wrong status this also prevents ordering the required wedding party. */ module.exports = { async up(queryInterface) { await queryInterface.sequelize.query(` WITH invalid_marriages AS ( SELECT r.id, r.character1_id, r.character2_id FROM falukant_data.relationship r INNER JOIN falukant_type.relationship relationship_type ON relationship_type.id = r.relationship_type_id AND relationship_type.tr = 'married' WHERE NOT EXISTS ( SELECT 1 FROM falukant_data.party p INNER JOIN falukant_type.party party_type ON party_type.id = p.party_type_id AND party_type.for_marriage = TRUE INNER JOIN falukant_data."character" party_host ON party_host.user_id = p.falukant_user_id WHERE party_host.id IN (r.character1_id, r.character2_id) AND p.created_at >= r.created_at ) ), reset_relationships AS ( UPDATE falukant_data.relationship r SET relationship_type_id = ( SELECT id FROM falukant_type.relationship WHERE tr = 'engaged' ) FROM invalid_marriages invalid_marriage WHERE r.id = invalid_marriage.id RETURNING r.id ), reset_honeymoon_flags AS ( UPDATE falukant_data.relationship_state relationship_state SET flags_json = COALESCE(relationship_state.flags_json, '{}'::jsonb) - 'honeymoonPregnancyScheduled' FROM invalid_marriages invalid_marriage WHERE relationship_state.relationship_id = invalid_marriage.id RETURNING invalid_marriage.character1_id, invalid_marriage.character2_id ) UPDATE falukant_data."character" mother SET pregnancy_due_at = NULL, pregnancy_father_character_id = NULL FROM reset_honeymoon_flags invalid_marriage INNER JOIN falukant_data."character" character1 ON character1.id = invalid_marriage.character1_id INNER JOIN falukant_data."character" character2 ON character2.id = invalid_marriage.character2_id WHERE mother.id = CASE WHEN LOWER(character1.gender) IN ('female', 'f') THEN character1.id WHEN LOWER(character2.gender) IN ('female', 'f') THEN character2.id END AND mother.pregnancy_father_character_id = CASE WHEN LOWER(character1.gender) IN ('female', 'f') THEN character2.id WHEN LOWER(character2.gender) IN ('female', 'f') THEN character1.id END; `); }, async down() { // The original state cannot be reconstructed safely without inventing a wedding. }, };