aboutsummaryrefslogtreecommitdiff
path: root/db/migrations/1.105_step_00247_forum.php
blob: cdcf74c8bdfa820892a5c2f0708bc7d8b4002ae5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
<?php

class Step00247Forum extends Migration
{
    function description()
    {
        return 'Add forum as core-plugin';
    }

    function up()
    {
        // check if the plugin has been installed previously and is in a know db-state
        $forumpp_version = DBManager::get()->query("SELECT version FROM schema_version
            WHERE domain = 'ForumPP'")->fetchColumn();

        if ($forumpp_version !== false && $forumpp_version != 6) {  // version 6 is the DB-Version of the latest ForumPP-Plugin
            throw new Exception(_('Sie verwenden das ForumPP-Plugin in einer alten Version. '
                . 'Bitte aktualisieren Sie es zuerst auf die neueste Version, sonst kann '
                . 'Die Stud.IP-Migration nicht ausgeführt werden'));

        } else if ($forumpp_version == 6) { // prepare the tables for the rest of the migration
            // rename the forum-tables
            DBManager::get()->exec("RENAME TABLE
                forumpp_abo_users           TO forum_abo_users,
                forumpp_categories          TO forum_categories,
                forumpp_categories_entries  TO forum_categories_entries,
                forumpp_entries             TO forum_entries,
                forumpp_favorites           TO forum_favorites,
                forumpp_likes               TO forum_likes,
                forumpp_visits              TO forum_visits");

        } else {  // create the necessary tables for the forum from scratch
            DBManager::get()->exec("
                CREATE TABLE IF NOT EXISTS `forum_categories` (
                    `category_id` varchar(32) NOT NULL,
                    `seminar_id` varchar(32) NOT NULL,
                    `entry_name` varchar(255) NOT NULL,
                    `pos` INT NOT NULL DEFAULT '0',
                    PRIMARY KEY ( `category_id` )
                ) ENGINE=MyISAM
            ");

            DBManager::get()->exec("
                CREATE TABLE IF NOT EXISTS `forum_categories_entries` (
                    `category_id` varchar(32) NOT NULL,
                    `topic_id` varchar(32) NOT NULL,
                    `pos` INT NOT NULL DEFAULT '0',
                    PRIMARY KEY ( `category_id` , `topic_id` )
                ) ENGINE=MyISAM
            ");


            DBManager::get()->exec("
                CREATE TABLE IF NOT EXISTS `forum_entries` (
                    `topic_id` varchar(32) NOT NULL,
                    `seminar_id` varchar(32) NOT NULL,
                    `user_id` varchar(32) NOT NULL,
                    `name` varchar(255) NOT NULL,
                    `content` text NOT NULL,
                    `area` TINYINT NOT NULL DEFAULT '0',
                    `mkdate` int(20) NOT NULL,
                    `chdate` int(20) NOT NULL,
                    `author` varchar(255) NOT NULL,
                    `author_host` varchar(255) NOT NULL,
                    `lft` int(11) NOT NULL,
                    `rgt` int(11) NOT NULL,
                    `depth` int(11) NOT NULL,
                    `anonymous` tinyint(4) NOT NULL DEFAULT '0',
                    PRIMARY KEY (`topic_id`)
                ) ENGINE=MyISAM
            ");

            DBManager::get()->exec("
                CREATE TABLE IF NOT EXISTS `forum_likes` (
                  `topic_id` varchar(32) NOT NULL,
                  `user_id` varchar(32) NOT NULL,
                  PRIMARY KEY (`topic_id`,`user_id`)
                ) ENGINE=MyISAM
            ");

            DBManager::get()->exec("
                CREATE TABLE IF NOT EXISTS `forum_visits` (
                    user_id varchar(32) NOT NULL,
                    seminar_id varchar(32) NOT NULL,
                    visitdate int(11) NOT NULL,
                    last_visitdate int(11) NOT NULL,
                    PRIMARY KEY ( `user_id` , `seminar_id` )
                ) ENGINE=MyISAM
            ");

            DBManager::get()->exec("
                CREATE TABLE IF NOT EXISTS `forum_favorites` (
                    user_id varchar(32) NOT NULL,
                    topic_id varchar(32) NOT NULL,
                    PRIMARY KEY ( `user_id` , `topic_id` )
                ) ENGINE=MyISAM
            ");

            DBManager::get()->exec("
                CREATE TABLE IF NOT EXISTS `forum_abo_users` (
                    `topic_id` varchar(32) NOT NULL,
                    `user_id` varchar(32) NOT NULL,
                    PRIMARY KEY (`topic_id`,`user_id`)
                ) ENGINE=MyISAM
            ");
        }

        // add new table for the issue-connection
        DBManager::get()->exec("CREATE TABLE IF NOT EXISTS `forum_entries_issues` (
            `topic_id` varchar(32) NOT NULL,
            `issue_id` varchar(32) NOT NULL,
            PRIMARY KEY (`topic_id`,`issue_id`)
        ) ENGINE=MyISAM");

        // add some highly needed indices
        DBManager::get()->exec("ALTER TABLE `forum_entries` ADD INDEX (  `seminar_id` ,  `lft` )");
        DBManager::get()->exec("ALTER TABLE `forum_entries` ADD INDEX (  `seminar_id` ,  `rgt` )");
        DBManager::get()->exec("ALTER TABLE `forum_entries` ADD INDEX (  `user_id` )");
        DBManager::get()->exec("ALTER TABLE `forum_categories` ADD INDEX (  `seminar_id` )");

        // get highest position
        $navpos = DBManager::get()->query("SELECT navigationpos FROM plugins
            ORDER BY navigationpos DESC")->fetchColumn() + 1;

        // insert plugin into db
        $stmt = DBManager::get()->prepare("INSERT INTO plugins
            (pluginclassname, pluginpath, pluginname, plugintype, enabled, navigationpos)
            VALUES ('CoreForum', 'core/Forum', 'Forum', 'ForumModule,StandardPlugin,StudipModule', 'yes', ?)");
        $stmt->execute([$navpos]);

        // get id of newly created plugin (we purposely do not use PDO::lastInserId())
        $plugin_id = DBManager::get()->query("SELECT pluginid FROM plugins
            WHERE pluginpath = 'core/Forum'")->fetchColumn();

        // set all default roles for the plugin (including nobody)
        $stmt = DBManager::get()->prepare("INSERT INTO roles_plugins
            (roleid, pluginid) VALUES (?, ?)");
        foreach (range(1,7) as $role_id) {
            $stmt->execute([$role_id, $plugin_id]);
        }


        // remove old ForumPP-plugin
        $old_forum = DBManager::get()->query("SELECT * FROM plugins
            WHERE pluginclassname = 'ForumPP'")->fetch(PDO::FETCH_ASSOC);

        if ($old_forum) {
            DBManager::get()->exec("DELETE FROM plugins
                WHERE pluginclassname = 'ForumPP'");
            DBManager::get()->exec("DELETE FROM plugins_activated
                WHERE pluginid = " . $old_forum['pluginid']);
            DBManager::get()->exec("DELETE FROM plugins_default_activations
                WHERE pluginid = " . $old_forum['pluginid']);
            DBManager::get()->exec("DELETE FROM roles_plugins
                WHERE pluginid = " . $old_forum['pluginid']);
            DBManager::get()->exec("DELETE FROM schema_version
                WHERE domain = 'ForumPP'");
        }

        // remove user-settings for the old forum
        DBManager::get()->exec("DELETE FROM user_config WHERE `field` = 'FORUM_SETTINGS'");
    }

    function down()
    {
    }
}