<?php class Blubbermessenger extends Migration { public function description() { return 'Changes the blubber-tool to make it even better and more messenger-like.'; } public function up() { $query = "CREATE TABLE `blubber_threads` ( `thread_id` CHAR(32) COLLATE latin1_bin NOT NULL, `context_type` ENUM('public','private','course','institute') COLLATE latin1_bin NOT NULL DEFAULT 'public', `context_id` VARCHAR(32) COLLATE latin1_bin NOT NULL DEFAULT '', `user_id` CHAR(32) COLLATE latin1_bin NOT NULL, `external_contact` TINYINT(1) NOT NULL DEFAULT 0, `content` TEXT COLLATE utf8mb4_unicode_ci DEFAULT NULL, `display_class` VARCHAR(64) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `visible_in_stream` TINYINT(1) NOT NULL DEFAULT 1, `commentable` TINYINT(1) NOT NULL DEFAULT 1, `metadata` TEXT COLLATE utf8mb4_unicode_ci NULL, `chdate` INT(11) DEFAULT NULL, `mkdate` INT(11) DEFAULT NULL, PRIMARY KEY (`thread_id`), KEY `context_type` (`context_type`), KEY `context_id` (`context_id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC"; DBManager::get()->exec($query); $query = "INSERT INTO `blubber_threads` ( `thread_id`, `context_type`, `context_id`, `user_id`, `external_contact`, `content`, `display_class`, `visible_in_stream`, `chdate`, `mkdate` ) SELECT `topic_id`, `context_type`, `Seminar_id`, `user_id`, `external_contact`, `description`, NULL, '1', `chdate`, `mkdate` FROM blubber WHERE parent_id = '0'"; DBManager::get()->exec($query); $query = "CREATE TABLE `blubber_comments` ( `comment_id` CHAR(32) COLLATE latin1_bin NOT NULL, `thread_id` CHAR(32) COLLATE latin1_bin NOT NULL, `user_id` CHAR(32) COLLATE latin1_bin NOT NULL DEFAULT '', `external_contact` TINYINT(1) NOT NULL DEFAULT 0, `content` TEXT COLLATE utf8mb4_unicode_ci DEFAULT NULL, `network` VARCHAR(64) COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL, `chdate` INT(11) DEFAULT NULL, `mkdate` INT(11) DEFAULT NULL, PRIMARY KEY (`comment_id`), KEY `thread_id` (`thread_id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB ROW_FORMAT=DYNAMIC"; DBManager::get()->exec($query); $query = "INSERT INTO `blubber_comments` ( `comment_id`, `thread_id`, `user_id`, `external_contact`, `content`, `chdate`, `mkdate` ) SELECT `topic_id`, `root_id`, `user_id`, `external_contact`, `description`, `chdate`, `mkdate` FROM blubber WHERE parent_id != '0'"; DBManager::get()->exec($query); DBManager::get()->exec("DROP TABLE `blubber`"); $query = "ALTER TABLE blubber_mentions CHANGE `topic_id` `thread_id` CHAR(32) COLLATE latin1_bin NOT NULL"; DBManager::get()->exec($query); DBManager::get()->exec("DROP TABLE blubber_reshares"); DBManager::get()->exec("DROP TABLE blubber_streams"); // Create config entries $query = "INSERT INTO `config` SET `field` = :field, `value` = :value, `type` = :type, `range` = :range, `section` = :section, `mkdate` = UNIX_TIMESTAMP(), `chdate` = UNIX_TIMESTAMP(), `description` = :description"; $config_statement = DBManager::get()->prepare($query); $config_statement->execute([ ':field' => 'BLUBBER_GLOBAL_MESSENGER_ACTIVATE', ':value' => '1', ':type' => 'boolean', ':range' => 'global', ':section' => 'global', ':description' => 'Ist Blubber unter Community global aktiv? Blubber in Veranstaltungen wird über das Plugin Blubber aktiviert oder deaktiviert.', ]); $config_statement->execute([ ':field' => 'BLUBBER_DEFAULT_THREAD', ':value' => '1', ':type' => 'string', ':range' => 'user', ':section' => '', ':description' => 'Dieses ist bei dem globalen Blubber-Messenger der vorausgewählte Blubber.', ]); // activate routes: require_once $GLOBALS['STUDIP_BASE_PATH'] . '/app/routes/Blubber.php'; RESTAPI\ConsumerPermissions::get()->activateRouteMap(new RESTAPI\Routes\Blubber()); // Blubber to be the primary messenger in courses $query = "SELECT pluginid FROM plugins WHERE pluginclassname = 'CoreForum'"; $forum_id = DBManager::get()->fetchColumn($query); $query = "SELECT id, modules FROM sem_classes WHERE forum = 'CoreForum'"; $select_sem_class = DBManager::get()->query($query); $sem_classes = $select_sem_class->fetchAll(PDO::FETCH_ASSOC); $query = "INSERT IGNORE INTO plugins_activated (pluginid, range_type, range_id, state) SELECT :forum_id, 'sem', seminare.Seminar_id, '1' FROM seminare JOIN sem_types ON seminare.status = sem_types.id JOIN sem_classes ON sem_types.class = sem_classes.id JOIN forum_entries ON forum_entries.seminar_id = seminare.Seminar_id WHERE sem_classes.id = :sem_class GROUP BY seminare.Seminar_id HAVING COUNT(*) > 1"; $activate_forum_for_courses = DBManager::get()->prepare($query); $query = "UPDATE sem_classes SET modules = :modules, forum = 'Blubber' WHERE id = :id"; $update = DBManager::get()->prepare($query); foreach ($sem_classes as $sem_class) { $modules = json_decode($sem_class['modules'], true); $forum_was_activated = $modules['CoreForum']['activated']; $modules['CoreForum']['activated'] = 0; $modules['Blubber']['activated'] = 1; $update->execute([ 'id' => $sem_class['id'], 'modules' => json_encode($modules), ]); if ($forum_was_activated) { // activate old forum in old courses that have more than one posting: $activate_forum_for_courses->execute([ 'forum_id' => $forum_id, 'sem_class' => $sem_class['id'], ]); } } // delete old blubber-stream avatars $blubberstreams_folder = "{$GLOBALS['DYNAMIC_CONTENT_PATH']}/blubberstream"; foreach (glob("{$blubberstreams_folder}/*") as $file) { @unlink($blubberstreams_folder . "/" . $file); } @rmdir($blubberstreams_folder); DBManager::get()->exec(" DELETE FROM activities WHERE object_type = 'blubber' "); } public function down() { DBManager::get()->exec("DROP TABLE `blubber_comments`, `blubber_threads`"); } }