CREATE OR REPLACE FUNCTION trigger_user_status_change_notifications() RETURNS TRIGGER AS $$ DECLARE status_change "AccountStatusChange"; BEGIN -- Check for admin status change IF OLD.admin IS DISTINCT FROM NEW.admin THEN IF NEW.admin = true THEN status_change := 'ADMIN_TRUE'; ELSE status_change := 'ADMIN_FALSE'; END IF; INSERT INTO "Notification" ("userId", "type", "aboutAccountStatusChange") VALUES (NEW.id, 'ACCOUNT_STATUS_CHANGE', status_change); END IF; -- Check for verified status change IF OLD.verified IS DISTINCT FROM NEW.verified THEN IF NEW.verified = true THEN status_change := 'VERIFIED_TRUE'; ELSE status_change := 'VERIFIED_FALSE'; END IF; INSERT INTO "Notification" ("userId", "type", "aboutAccountStatusChange") VALUES (NEW.id, 'ACCOUNT_STATUS_CHANGE', status_change); END IF; -- Check for moderator status change IF OLD.moderator IS DISTINCT FROM NEW.moderator THEN IF NEW.moderator = true THEN status_change := 'MODERATOR_TRUE'; ELSE status_change := 'MODERATOR_FALSE'; END IF; INSERT INTO "Notification" ("userId", "type", "aboutAccountStatusChange") VALUES (NEW.id, 'ACCOUNT_STATUS_CHANGE', status_change); END IF; -- Check for spammer status change IF OLD.spammer IS DISTINCT FROM NEW.spammer THEN IF NEW.spammer = true THEN status_change := 'SPAMMER_TRUE'; ELSE status_change := 'SPAMMER_FALSE'; END IF; INSERT INTO "Notification" ("userId", "type", "aboutAccountStatusChange") VALUES (NEW.id, 'ACCOUNT_STATUS_CHANGE', status_change); END IF; -- Return NULL for AFTER triggers as the return value is ignored. RETURN NULL; END; $$ LANGUAGE plpgsql; -- Drop the trigger if it exists to ensure a clean setup DROP TRIGGER IF EXISTS user_status_change_notifications_trigger ON "User"; -- Create the trigger to fire after updates on specific status columns CREATE TRIGGER user_status_change_notifications_trigger AFTER UPDATE OF admin, verified, moderator, spammer ON "User" FOR EACH ROW EXECUTE FUNCTION trigger_user_status_change_notifications();