import { sequelize } from '../utils/sequelize.js'; export async function createTriggers() { const createTriggerFunction = ` CREATE OR REPLACE FUNCTION community.create_user_param_visibility_trigger() RETURNS TRIGGER AS $$ BEGIN -- Check if UserParamVisibility already exists for this UserParam IF NOT EXISTS ( SELECT 1 FROM community.user_param_visibility WHERE param_id = NEW.id ) THEN -- Insert the default visibility (Invisible) INSERT INTO community.user_param_visibility (param_id, visibility) VALUES (NEW.id, ( SELECT id FROM type.user_param_visibility WHERE description = 'Invisible' )); END IF; -- If NEW is null, then we have nothing to do IF NEW IS NULL THEN RETURN NULL; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; `; const createInsertTrigger = ` CREATE OR REPLACE TRIGGER trigger_create_user_param_visibility AFTER INSERT ON community.user_param FOR EACH ROW WHEN (NEW.id IS NOT NULL) EXECUTE FUNCTION community.create_user_param_visibility_trigger(); `; const createUpdateTrigger = ` CREATE OR REPLACE TRIGGER trigger_update_user_param_visibility AFTER UPDATE ON community.user_param FOR EACH ROW WHEN (NEW.id IS NOT NULL) EXECUTE FUNCTION community.create_user_param_visibility_trigger(); `; const createDiaryHistoryTriggerFunction = ` CREATE OR REPLACE FUNCTION community.insert_diary_history() RETURNS TRIGGER AS $$ BEGIN INSERT INTO community.diary_history (diary_id, user_id, old_text, old_created_at, old_updated_at) VALUES (OLD.id, OLD.user_id, OLD.text, OLD.created_at, OLD.updated_at); -- If NEW is null, then we have nothing to do IF NEW IS NULL THEN RETURN NULL; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; `; const createDiaryHistoryTrigger = ` CREATE OR REPLACE TRIGGER diary_update_trigger BEFORE UPDATE ON community.diary FOR EACH ROW WHEN (OLD.id IS NOT NULL) EXECUTE FUNCTION community.insert_diary_history(); `; const createTitleHistoryTriggerFunction = ` CREATE OR REPLACE FUNCTION forum.insert_title_history() RETURNS TRIGGER AS $$ BEGIN INSERT INTO forum.title_history (title_id, old_title, changed_by, old_updated_at) VALUES (OLD.id, OLD.title, OLD.created_by, OLD.updated_at); RETURN NEW; END; $$ LANGUAGE plpgsql; `; const createTitleHistoryTrigger = ` CREATE OR REPLACE TRIGGER title_update_trigger BEFORE UPDATE ON forum.title FOR EACH ROW WHEN (OLD.id IS NOT NULL) EXECUTE FUNCTION forum.insert_title_history(); `; const createCharacterCreationTriggerMethod = ` CREATE OR REPLACE FUNCTION falukant_data.create_character_creation_trigger() RETURNS TRIGGER AS $$ BEGIN INSERT INTO falukant_data.knowledge (product_id, character_id) SELECT id, NEW.id FROM falukant_type.product; RETURN NEW; END; $$ LANGUAGE plpgsql; `; const createCharacterCreationTrigger = ` CREATE OR REPLACE TRIGGER character_creation_trigger AFTER INSERT ON falukant_data.character FOR EACH ROW WHEN (NEW.id IS NOT NULL) EXECUTE FUNCTION falukant_data.create_character_creation_trigger(); `; const createKnowledgeTriggerMethod = ` CREATE OR REPLACE FUNCTION falukant_data.create_knowledge_trigger() RETURNS TRIGGER AS $$ BEGIN NEW.knowledge = random() * 61 + 20; RETURN NEW; END; $$ LANGUAGE plpgsql; `; const createKnowledgeTrigger = ` CREATE OR REPLACE TRIGGER knowledge_trigger BEFORE INSERT ON falukant_data.knowledge FOR EACH ROW WHEN (NEW.id IS NOT NULL) EXECUTE FUNCTION falukant_data.create_knowledge_trigger(); `; try { await sequelize.query(createTriggerFunction); await sequelize.query(createInsertTrigger); await sequelize.query(createUpdateTrigger); await sequelize.query(createDiaryHistoryTriggerFunction); await sequelize.query(createDiaryHistoryTrigger); await sequelize.query(createTitleHistoryTriggerFunction); await sequelize.query(createTitleHistoryTrigger); await sequelize.query(createCharacterCreationTriggerMethod); await sequelize.query(createCharacterCreationTrigger); await sequelize.query(createKnowledgeTriggerMethod); await sequelize.query(createKnowledgeTrigger); console.log('Triggers created successfully'); } catch (error) { console.error('Error creating triggers:', error); } }