Squashed migrations.

This commit is contained in:
flash 2019-05-01 21:39:35 +02:00
parent 3b84f4c9e0
commit a595326b51
45 changed files with 706 additions and 2045 deletions

View file

@ -1,171 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\InitialStructure;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
CREATE TABLE `msz_roles` (
`role_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`role_hierarchy` INT(11) NOT NULL DEFAULT '1',
`role_name` VARCHAR(255) NOT NULL,
`role_title` VARCHAR(64) NULL DEFAULT NULL,
`role_description` TEXT NULL,
`role_secret` TINYINT(1) NOT NULL DEFAULT '0',
`role_colour` INT(11) NOT NULL DEFAULT '0',
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`role_id`)
)
");
$conn->exec("
CREATE TABLE `msz_users` (
`user_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(255) NOT NULL,
`password` VARCHAR(255) NULL DEFAULT NULL,
`email` VARCHAR(255) NOT NULL,
`register_ip` VARBINARY(16) NOT NULL,
`last_ip` VARBINARY(16) NOT NULL,
`user_country` CHAR(2) NOT NULL DEFAULT 'XX',
`user_chat_key` VARCHAR(32) NULL DEFAULT NULL,
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
`deleted_at` TIMESTAMP NULL DEFAULT NULL,
`display_role` INT(10) UNSIGNED NULL DEFAULT NULL,
`user_website` VARCHAR(255) NOT NULL DEFAULT '',
`user_twitter` VARCHAR(20) NOT NULL DEFAULT '',
`user_github` VARCHAR(40) NOT NULL DEFAULT '',
`user_skype` VARCHAR(60) NOT NULL DEFAULT '',
`user_discord` VARCHAR(40) NOT NULL DEFAULT '',
`user_youtube` VARCHAR(255) NOT NULL DEFAULT '',
`user_steam` VARCHAR(255) NOT NULL DEFAULT '',
`user_twitchtv` VARCHAR(30) NOT NULL DEFAULT '',
`user_osu` VARCHAR(20) NOT NULL DEFAULT '',
`user_lastfm` VARCHAR(20) NOT NULL DEFAULT '',
`user_title` VARCHAR(64) NULL DEFAULT NULL,
`last_seen` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`user_id`),
UNIQUE INDEX `users_username_unique` (`username`),
UNIQUE INDEX `users_email_unique` (`email`),
INDEX `users_display_role_foreign` (`display_role`),
CONSTRAINT `users_display_role_foreign`
FOREIGN KEY (`display_role`)
REFERENCES `msz_roles` (`role_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
)
");
$conn->exec("
CREATE TABLE `msz_user_roles` (
`user_id` INT(10) UNSIGNED NOT NULL,
`role_id` INT(10) UNSIGNED NOT NULL,
UNIQUE INDEX `user_roles_unique` (`user_id`, `role_id`),
INDEX `user_roles_role_id_foreign` (`role_id`),
CONSTRAINT `user_roles_role_id_foreign`
FOREIGN KEY (`role_id`)
REFERENCES `msz_roles` (`role_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `user_roles_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
)
");
$conn->exec("
CREATE TABLE `msz_sessions` (
`session_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NOT NULL,
`session_key` VARCHAR(255) NOT NULL,
`session_ip` VARBINARY(16) NOT NULL,
`user_agent` VARCHAR(255) NULL DEFAULT NULL,
`expires_on` TIMESTAMP NULL DEFAULT NULL,
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
`session_country` CHAR(2) NOT NULL DEFAULT 'XX',
PRIMARY KEY (`session_id`),
INDEX `sessions_user_id_foreign` (`user_id`),
CONSTRAINT `sessions_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
)
");
$conn->exec("
CREATE TABLE `msz_login_attempts` (
`attempt_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`was_successful` TINYINT(1) NOT NULL,
`attempt_ip` VARBINARY(16) NOT NULL,
`attempt_country` CHAR(2) NOT NULL DEFAULT 'XX',
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
`user_agent` VARCHAR(255) NOT NULL DEFAULT '',
PRIMARY KEY (`attempt_id`),
INDEX `login_attempts_user_id_foreign` (`user_id`),
CONSTRAINT `login_attempts_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
)
");
$conn->exec("
CREATE TABLE `msz_news_categories` (
`category_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`category_name` VARCHAR(255) NOT NULL,
`category_description` TEXT NOT NULL,
`is_hidden` TINYINT(1) NOT NULL DEFAULT '0',
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`category_id`)
)
");
$conn->exec("
CREATE TABLE `msz_news_posts` (
`post_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`category_id` INT(10) UNSIGNED NOT NULL,
`is_featured` TINYINT(1) NOT NULL DEFAULT '0',
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`post_title` VARCHAR(255) NOT NULL,
`post_text` TEXT NOT NULL,
`scheduled_for` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`created_at` TIMESTAMP NULL DEFAULT NULL,
`updated_at` TIMESTAMP NULL DEFAULT NULL,
`deleted_at` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`post_id`),
INDEX `news_posts_category_id_foreign` (`category_id`),
INDEX `news_posts_user_id_foreign` (`user_id`),
CONSTRAINT `news_posts_category_id_foreign`
FOREIGN KEY (`category_id`)
REFERENCES `msz_news_categories` (`category_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `news_posts_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
)
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('DROP TABLE `msz_news_posts`');
$conn->exec('DROP TABLE `msz_news_categories`');
$conn->exec('DROP TABLE `msz_login_attempts`');
$conn->exec('DROP TABLE `msz_sessions`');
$conn->exec('DROP TABLE `msz_user_roles`');
$conn->exec('DROP TABLE `msz_users`');
$conn->exec('DROP TABLE `msz_roles`');
}

View file

@ -1,124 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\ForumStructure;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
CREATE TABLE `msz_forum_categories` (
`forum_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`forum_order` INT(10) UNSIGNED NOT NULL DEFAULT '1',
`forum_parent` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`forum_name` VARCHAR(255) NOT NULL,
`forum_type` TINYINT(4) NOT NULL DEFAULT '0',
`forum_description` TEXT NULL,
`forum_link` VARCHAR(255) NULL DEFAULT NULL,
`forum_link_clicks` INT(10) UNSIGNED NULL DEFAULT NULL,
`forum_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`forum_archived` TINYINT(1) NOT NULL DEFAULT '0',
`forum_hidden` TINYINT(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`forum_id`),
INDEX `forums_indices` (`forum_order`, `forum_parent`, `forum_type`)
)
");
$conn->exec("
CREATE TABLE `msz_forum_topics` (
`topic_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`forum_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`topic_type` TINYINT(4) NOT NULL DEFAULT '0',
`topic_title` VARCHAR(255) NOT NULL,
`topic_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`topic_bumped` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`topic_deleted` TIMESTAMP NULL DEFAULT NULL,
`topic_locked` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`topic_id`),
INDEX `topics_forum_id_foreign` (`forum_id`),
INDEX `topics_user_id_foreign` (`user_id`),
INDEX `topics_indices` (`topic_bumped`, `topic_type`),
CONSTRAINT `topics_forum_id_foreign`
FOREIGN KEY (`forum_id`)
REFERENCES `msz_forum_categories` (`forum_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `topics_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
)
");
$conn->exec("
CREATE TABLE `msz_forum_posts` (
`post_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`topic_id` INT(10) UNSIGNED NOT NULL,
`forum_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`post_ip` VARBINARY(16) NOT NULL,
`post_text` TEXT NOT NULL,
`post_parse` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0',
`post_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`post_edited` TIMESTAMP NULL DEFAULT NULL,
`post_deleted` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`post_id`),
INDEX `posts_topic_id_foreign` (`topic_id`),
INDEX `posts_forum_id_foreign` (`forum_id`),
INDEX `posts_user_id_foreign` (`user_id`),
INDEX `posts_indices` (`post_created`),
CONSTRAINT `posts_topic_id_foreign`
FOREIGN KEY (`topic_id`)
REFERENCES `msz_forum_topics` (`topic_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `posts_forum_id_foreign`
FOREIGN KEY (`forum_id`)
REFERENCES `msz_forum_categories` (`forum_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `posts_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
)
");
$conn->exec("
CREATE TABLE `msz_forum_topics_track` (
`user_id` INT(10) UNSIGNED NOT NULL,
`topic_id` INT(10) UNSIGNED NOT NULL,
`forum_id` INT(10) UNSIGNED NOT NULL,
`track_last_read` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE INDEX `topics_track_unique` (`user_id`, `topic_id`),
INDEX `topics_track_topic_id_foreign` (`topic_id`),
INDEX `topics_track_user_id_foreign` (`user_id`),
INDEX `topics_track_forum_id_foreign` (`forum_id`),
CONSTRAINT `topics_track_topic_id_foreign`
FOREIGN KEY (`topic_id`)
REFERENCES `msz_forum_topics` (`topic_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `topics_track_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `topics_track_forum_id_foreign`
FOREIGN KEY (`forum_id`)
REFERENCES `msz_forum_categories` (`forum_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
)
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('DROP TABLE `msz_forum_topics_track`');
$conn->exec('DROP TABLE `msz_forum_posts`');
$conn->exec('DROP TABLE `msz_forum_topics`');
$conn->exec('DROP TABLE `msz_forum_categories`');
}

View file

@ -1,83 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\ChangelogTables;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
CREATE TABLE `msz_changelog_actions` (
`action_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`action_name` VARCHAR(50) NOT NULL,
`action_colour` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`action_class` VARCHAR(20) NOT NULL,
PRIMARY KEY (`action_id`),
UNIQUE INDEX `action_class_unique` (`action_class`)
)
");
$conn->exec("
CREATE TABLE `msz_changelog_changes` (
`change_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`action_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`change_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`change_log` VARCHAR(255) NOT NULL,
`change_text` TEXT NULL,
PRIMARY KEY (`change_id`),
INDEX `changes_user_id_foreign` (`user_id`),
INDEX `changes_action_id_foreign` (`action_id`),
INDEX `changes_change_created_index` (`change_created`),
CONSTRAINT `changes_action_id_foreign`
FOREIGN KEY (`action_id`)
REFERENCES `msz_changelog_actions` (`action_id`)
ON UPDATE CASCADE
ON DELETE SET NULL,
CONSTRAINT `changes_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
)
");
$conn->exec("
CREATE TABLE `msz_changelog_tags` (
`tag_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`tag_name` VARCHAR(255) NOT NULL,
`tag_description` TEXT NULL,
`tag_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`tag_archived` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`tag_id`),
UNIQUE INDEX `tag_name` (`tag_name`),
INDEX `tag_archived` (`tag_archived`)
)
");
$conn->exec("
CREATE TABLE `msz_changelog_change_tags` (
`change_id` INT(10) UNSIGNED NOT NULL,
`tag_id` INT(10) UNSIGNED NOT NULL,
INDEX `tag_id_foreign_key` (`tag_id`),
UNIQUE INDEX `change_tag_unique` (`change_id`, `tag_id`),
CONSTRAINT `change_id_foreign_key`
FOREIGN KEY (`change_id`)
REFERENCES `msz_changelog_changes` (`change_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `tag_id_foreign_key`
FOREIGN KEY (`tag_id`)
REFERENCES `msz_changelog_tags` (`tag_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
)
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('DROP TABLE `msz_changelog_change_tags`');
$conn->exec('DROP TABLE `msz_changelog_tags`');
$conn->exec('DROP TABLE `msz_changelog_changes`');
$conn->exec('DROP TABLE `msz_changelog_actions`');
}

View file

@ -1,39 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\InitialPermissionsTable;
use PDO;
function migrate_up(PDO $conn): void
{
// if you need new permission sets, create a migration that adds a new column to this table.
$conn->exec("
CREATE TABLE `msz_permissions` (
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`role_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`user_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`user_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`changelog_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`changelog_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`news_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`news_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
UNIQUE INDEX `user_id` (`user_id`),
UNIQUE INDEX `role_id` (`role_id`),
CONSTRAINT `role_id_foreign`
FOREIGN KEY (`role_id`)
REFERENCES `msz_roles` (`role_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
)
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('DROP TABLE `msz_permissions`');
}

View file

@ -1,30 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddedGeneralAndForumPerms;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_permissions`
ADD COLUMN `general_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `role_id`,
ADD COLUMN `general_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `general_perms_allow`,
ADD COLUMN `forum_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `news_perms_deny`,
ADD COLUMN `forum_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `forum_perms_allow`,
ADD COLUMN `comments_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `forum_perms_deny`,
ADD COLUMN `comments_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `comments_perms_allow`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_permissions`
DROP COLUMN `general_perms_allow`,
DROP COLUMN `general_perms_deny`,
DROP COLUMN `forum_perms_allow`,
DROP COLUMN `forum_perms_deny,
DROP COLUMN `forum_perms_allow`,
DROP COLUMN `forum_perms_deny`;
');
}

View file

@ -1,28 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\UsersTableUpdates;
// gets rid of `updated_at`, ironically
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
DROP COLUMN `updated_at`,
ADD INDEX `users_user_country_index` (`user_country`),
ADD INDEX `users_created_at_index` (`created_at`),
ADD INDEX `users_last_seen_index` (`last_seen`);
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_users`
ADD COLUMN `updated_at` TIMESTAMP NULL DEFAULT NULL,
DROP INDEX `users_user_country_index`,
DROP INDEX `users_created_at_index`,
DROP INDEX `users_last_seen_index`;
');
}

View file

@ -1,66 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AuditLogStruct;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_permissions`
RENAME INDEX `user_id` TO `permissions_user_id_unique`,
RENAME INDEX `role_id` TO `permissions_role_id_unique`,
DROP FOREIGN KEY `role_id_foreign`,
DROP FOREIGN KEY `user_id_foreign`,
ADD CONSTRAINT `permissions_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
ADD CONSTRAINT `permissions_role_id_foreign`
FOREIGN KEY (`role_id`)
REFERENCES `msz_roles` (`role_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
');
$conn->exec("
CREATE TABLE `msz_audit_log` (
`log_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`log_action` VARCHAR(50) NOT NULL,
`log_params` TEXT NOT NULL,
`log_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`log_ip` VARBINARY(16) NULL DEFAULT NULL,
PRIMARY KEY (`log_id`),
INDEX `audit_log_user_id_foreign` (`user_id`),
CONSTRAINT `audit_log_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
)
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('DROP TABLE `msz_audit_log`');
$conn->exec('
ALTER TABLE `msz_permissions`
RENAME INDEX `permissions_user_id_unique` TO `user_id`,
RENAME INDEX `permissions_role_id_unique` TO `role_id`,
DROP FOREIGN KEY `permissions_user_id_foreign`,
DROP FOREIGN KEY `permissions_role_id_foreign`,
ADD CONSTRAINT `role_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
ADD CONSTRAINT `user_id_foreign`
FOREIGN KEY (`role_id`)
REFERENCES `msz_roles` (`role_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
');
}

View file

@ -1,22 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddUserColourColumn;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_users`
ADD COLUMN `user_colour` INT(11) NULL DEFAULT NULL AFTER `user_country`,
DROP COLUMN `user_chat_key`;
');
}
function migrate_down(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_users`
DROP COLUMN `user_colour`,
ADD COLUMN `user_chat_key` VARCHAR(32) NULL DEFAULT NULL AFTER `user_country`;
');
}

View file

@ -1,28 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddPasswordResetsTable;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec('
CREATE TABLE `msz_users_password_resets` (
`user_id` INT(10) UNSIGNED NOT NULL,
`reset_ip` VARBINARY(16) NOT NULL,
`reset_requested` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`verification_code` CHAR(12) NULL DEFAULT NULL,
UNIQUE INDEX `msz_users_password_resets_unique` (`user_id`, `reset_ip`),
INDEX `msz_users_password_resets_index` (`reset_requested`),
CONSTRAINT `msz_users_password_resets_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
)
');
}
function migrate_down(PDO $conn): void
{
$conn->exec('DROP TABLE `msz_users_password_resets`');
}

View file

@ -1,20 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddCountryToAuditLog;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_audit_log`
ADD COLUMN `log_country` CHAR(2) NOT NULL DEFAULT \'XX\' AFTER `log_ip`;
');
}
function migrate_down(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_audit_log`
DROP COLUMN `log_country`;
');
}

View file

@ -1,110 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddGlobalCommentsStuff;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec('
CREATE TABLE `msz_comments_categories` (
`category_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`category_name` VARCHAR(255) NOT NULL,
`category_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`category_locked` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`category_id`),
UNIQUE INDEX `comments_categories_name_unique` (`category_name`)
);
');
$conn->exec('
CREATE TABLE `msz_comments_posts` (
`comment_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`category_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`comment_reply_to` INT(10) UNSIGNED NULL DEFAULT NULL,
`comment_text` TEXT NOT NULL,
`comment_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`comment_pinned` TIMESTAMP NULL DEFAULT NULL,
`comment_edited` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`comment_deleted` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`comment_id`),
INDEX `comments_posts_category_foreign` (`category_id`),
INDEX `comments_posts_user_foreign` (`user_id`),
INDEX `comments_posts_reply_id` (`comment_reply_to`),
INDEX `comments_posts_dates` (
`comment_created`,
`comment_pinned`,
`comment_edited`,
`comment_deleted`
),
CONSTRAINT `comments_posts_category_foreign`
FOREIGN KEY (`category_id`)
REFERENCES `msz_comments_categories` (`category_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `comments_posts_user_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
);
');
$conn->exec("
CREATE TABLE `msz_comments_votes` (
`comment_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NOT NULL,
`comment_vote` ENUM('Like','Dislike') NULL,
UNIQUE INDEX `comments_vote_unique` (`comment_id`, `user_id`),
INDEX `comments_vote_user_foreign` (`user_id`),
INDEX `comments_vote_index` (`comment_vote`),
CONSTRAINT `comment_vote_id`
FOREIGN KEY (`comment_id`)
REFERENCES `msz_comments_posts` (`comment_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `comment_vote_user`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
);
");
$conn->exec("
ALTER TABLE `msz_news_posts`
ADD COLUMN `comment_section_id` INT UNSIGNED NULL DEFAULT NULL AFTER `deleted_at`,
ADD INDEX `news_posts_comment_section` (`comment_section_id`),
ADD CONSTRAINT `news_posts_comment_section`
FOREIGN KEY (`comment_section_id`)
REFERENCES `msz_comments_categories` (`category_id`)
ON UPDATE CASCADE
ON DELETE SET NULL;
");
// create a comment section for all news posts
$getNews = $conn->query('SELECT `post_id` FROM `msz_news_posts` WHERE `comment_section_id` IS NULL')
->fetchAll(PDO::FETCH_ASSOC);
$setNews = $conn->prepare('UPDATE `msz_news_posts` SET `comment_section_id` = :c WHERE `post_id` = :p');
foreach ($getNews as $post) {
$info = comments_category_create("news-{$post['post_id']}");
$setNews->execute([
'p' => $post['post_id'],
'c' => $info['category_id'],
]);
}
}
function migrate_down(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_news_posts`
DROP COLUMN `comment_section_id`,
DROP INDEX `news_posts_comment_section`,
DROP FOREIGN KEY `news_posts_comment_section`;
');
$conn->exec('DROP TABLE `msz_comments_votes`');
$conn->exec('DROP TABLE `msz_comments_posts`');
$conn->exec('DROP TABLE `msz_comments_categories`');
}

View file

@ -1,73 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddForumPermissions;
use PDO;
function migrate_up(PDO $conn): void
{
// this permission system is nearly identical to the global site one, aside from it having a forum_id field
$conn->exec("
CREATE TABLE `msz_forum_permissions` (
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`role_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`forum_id` INT(10) UNSIGNED NOT NULL,
`forum_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`forum_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
UNIQUE INDEX `forum_permissions_user_id_unique` (`user_id`),
UNIQUE INDEX `forum_permissions_role_id_unique` (`role_id`),
UNIQUE INDEX `forum_permissions_forum_id_unique` (`forum_id`),
CONSTRAINT `forum_permissions_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `forum_permissions_role_id_foreign`
FOREIGN KEY (`role_id`)
REFERENCES `msz_roles` (`role_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `forum_permissions_forum_id_foreign`
FOREIGN KEY (`forum_id`)
REFERENCES `msz_forum_categories` (`forum_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
)
");
$conn->exec('
CREATE VIEW `msz_forum_permissions_view` AS
WITH RECURSIVE permissions(user_id, role_id, forum_id, forum_perms_allow, forum_perms_deny) as (
SELECT
pp.`user_id`, pp.`role_id`,
pc.`forum_id`,
IFNULL(pp.`forum_perms_allow`, 0), IFNULL(pp.`forum_perms_deny`, 0)
FROM `msz_forum_categories` as pc
LEFT JOIN `msz_forum_permissions` as pp
ON pp.`forum_id` = pc.`forum_id`
GROUP BY `user_id`, `role_id`, `forum_id`
UNION ALL
SELECT
permissions.`user_id`, permissions.`role_id`,
cc.`forum_id`,
IFNULL(cp.`forum_perms_allow`, 0) | permissions.`forum_perms_allow`,
IFNULL(cp.`forum_perms_deny`, 0) | permissions.`forum_perms_deny`
FROM `msz_forum_categories` as cc
LEFT JOIN `msz_forum_permissions` as cp
ON cp.`forum_id` = cc.`forum_id`
INNER JOIN permissions
ON cc.`forum_parent` = permissions.`forum_id`
)
SELECT
`user_id`, `role_id`, `forum_id`,
(BIT_OR(`forum_perms_allow`) &~ BIT_OR(`forum_perms_deny`)) as `forum_perms`
FROM permissions
GROUP BY `user_id`, `role_id`, `forum_id`
');
}
function migrate_down(PDO $conn): void
{
$conn->exec('DROP VIEW `msz_forum_permissions_view`');
$conn->exec('DROP TABLE `msz_forum_permissions`');
}

View file

@ -1,33 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddRelationsTable;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec('
CREATE TABLE `msz_user_relations` (
`user_id` INT(10) UNSIGNED NOT NULL,
`subject_id` INT(10) UNSIGNED NOT NULL,
`relation_type` TINYINT(3) UNSIGNED NOT NULL,
`relation_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE INDEX `user_relations_unique` (`user_id`, `subject_id`),
INDEX `user_relations_subject_id_foreign` (`subject_id`),
CONSTRAINT `user_relations_subject_id_foreign`
FOREIGN KEY (`subject_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `user_relations_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
)
');
}
function migrate_down(PDO $conn): void
{
$conn->exec('DROP TABLE `msz_user_relations`');
}

View file

@ -1,22 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddProfileAboutSection;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
ADD COLUMN `user_about_content` TEXT NULL DEFAULT NULL AFTER `display_role`,
ADD COLUMN `user_about_parser` TINYINT(4) NOT NULL DEFAULT '0' AFTER `user_about_content`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_users`
DROP COLUMN `user_about_content`,
DROP COLUMN `user_about_parser`;
');
}

View file

@ -1,20 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddBackgroundSettingsField;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
ADD COLUMN `user_background_settings` TINYINT(4) DEFAULT '0' AFTER `user_about_parser`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_users`
DROP COLUMN `user_background_settings`;
');
}

View file

@ -1,32 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\ChatQuotesTable;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
CREATE TABLE `msz_chat_quotes` (
`quote_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`quote_parent` INT(10) UNSIGNED NULL DEFAULT NULL,
`quote_user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`quote_username` VARCHAR(30) NOT NULL,
`quote_user_colour` INT(10) UNSIGNED NOT NULL DEFAULT '1073741824',
`quote_timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`quote_text` TEXT NOT NULL,
PRIMARY KEY (`quote_id`),
INDEX `msz_chat_quotes_parent` (`quote_parent`),
INDEX `msz_chat_quotes_user_id_foreign` (`quote_user_id`),
CONSTRAINT `msz_chat_quotes_user_id_foreign`
FOREIGN KEY (`quote_user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
)
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('DROP TABLE `msz_chat_quotes`');
}

View file

@ -1,47 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\FixNewsTables;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_news_categories`
CHANGE COLUMN `is_hidden` `category_is_hidden` TINYINT(1) NOT NULL DEFAULT '0' AFTER `category_description`,
CHANGE COLUMN `created_at` `category_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `category_is_hidden`,
DROP COLUMN `updated_at`;
");
$conn->exec("
ALTER TABLE `msz_news_posts`
CHANGE COLUMN `comment_section_id` `comment_section_id` INT(10) UNSIGNED NULL DEFAULT NULL AFTER `user_id`,
CHANGE COLUMN `is_featured` `post_is_featured` TINYINT(1) NOT NULL DEFAULT '0' AFTER `comment_section_id`,
CHANGE COLUMN `scheduled_for` `post_scheduled` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `post_text`,
CHANGE COLUMN `created_at` `post_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `post_scheduled`,
CHANGE COLUMN `updated_at` `post_updated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP AFTER `post_created`,
CHANGE COLUMN `deleted_at` `post_deleted` TIMESTAMP NULL DEFAULT NULL AFTER `post_updated`,
ADD INDEX `news_posts_indices` (`post_is_featured`, `post_scheduled`, `post_created`);
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_news_posts`
CHANGE COLUMN `post_is_featured` `is_featured` TINYINT(1) NOT NULL DEFAULT '0' AFTER `category_id`,
CHANGE COLUMN `post_scheduled` `scheduled_for` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `post_text`,
CHANGE COLUMN `post_created` `created_at` TIMESTAMP NULL DEFAULT NULL AFTER `scheduled_for`,
CHANGE COLUMN `post_updated` `updated_at` TIMESTAMP NULL DEFAULT NULL AFTER `created_at`,
CHANGE COLUMN `post_deleted` `deleted_at` TIMESTAMP NULL DEFAULT NULL AFTER `updated_at`,
CHANGE COLUMN `comment_section_id` `comment_section_id` INT(10) UNSIGNED NULL DEFAULT NULL AFTER `deleted_at`,
DROP INDEX `news_posts_indices`;
");
$conn->exec("
ALTER TABLE `msz_news_categories`
CHANGE COLUMN `category_is_hidden` `is_hidden` TINYINT(1) NOT NULL DEFAULT '0' AFTER `category_description`,
CHANGE COLUMN `category_created` `created_at` TIMESTAMP NULL DEFAULT NULL AFTER `is_hidden`,
ADD COLUMN `updated_at` TIMESTAMP NULL DEFAULT NULL AFTER `created_at`;
");
}

View file

@ -1,20 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddForumAccentColours;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_categories`
ADD COLUMN `forum_colour` INT UNSIGNED NULL DEFAULT NULL AFTER `forum_description`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_forum_categories`
DROP COLUMN `forum_colour`;
');
}

View file

@ -1,41 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddTopicsTrackIndex;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_forum_topics_track`
ADD INDEX `forum_track_last_read` (`track_last_read`);
');
// i am actually brain dead, holy shit
$conn->exec('
ALTER TABLE `msz_forum_permissions`
DROP INDEX `forum_permissions_forum_id_unique`,
ADD UNIQUE INDEX `forum_permissions_unique` (`user_id`, `role_id`, `forum_id`),
DROP INDEX `forum_permissions_user_id_unique`,
ADD INDEX `forum_permissions_forum_id` (`forum_id`),
DROP INDEX `forum_permissions_role_id_unique`,
ADD INDEX `forum_permissions_role_id` (`role_id`);
');
}
function migrate_down(PDO $conn): void
{
$conn->exec('
ALTER TABLE `msz_forum_permissions`
DROP INDEX `forum_permissions_unique`,
ADD UNIQUE INDEX `forum_permissions_user_id_unique` (`user_id`),
DROP INDEX `forum_permissions_forum_id`,
ADD INDEX `forum_permissions_role_id_unique` (`role_id`),
DROP INDEX `forum_permissions_role_id`,
ADD INDEX `forum_permissions_forum_id_unique` (`forum_id`);
');
$conn->exec('
ALTER TABLE `msz_forum_topics_track`
DROP INDEX `forum_track_last_read`;
');
}

View file

@ -1,60 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\UndoLaravelDamage;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_login_attempts`
ALTER `was_successful` DROP DEFAULT;
");
$conn->exec("
ALTER TABLE `msz_login_attempts`
CHANGE COLUMN `user_id` `user_id` INT(10) UNSIGNED NULL DEFAULT NULL AFTER `attempt_id`,
CHANGE COLUMN `was_successful` `attempt_success` TINYINT(1) NOT NULL AFTER `user_id`,
CHANGE COLUMN `created_at` `attempt_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `attempt_country`,
CHANGE COLUMN `user_agent` `attempt_user_agent` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin' AFTER `attempt_created`,
DROP COLUMN `updated_at`;
");
$conn->exec("
ALTER TABLE `msz_roles`
CHANGE COLUMN `created_at` `role_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `role_colour`,
DROP COLUMN `updated_at`;
");
$conn->exec("
ALTER TABLE `msz_sessions`
ALTER `user_agent` DROP DEFAULT,
ALTER `expires_on` DROP DEFAULT;
");
$conn->exec("
ALTER TABLE `msz_sessions`
CHANGE COLUMN `user_agent` `session_user_agent` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin' AFTER `session_ip`,
CHANGE COLUMN `session_country` `session_country` CHAR(2) NOT NULL DEFAULT 'XX' COLLATE 'utf8mb4_bin' AFTER `session_user_agent`,
CHANGE COLUMN `expires_on` `session_expires` TIMESTAMP NOT NULL AFTER `session_country`,
CHANGE COLUMN `created_at` `session_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `session_expires`,
CHANGE COLUMN `updated_at` `session_active` TIMESTAMP NULL DEFAULT NULL AFTER `session_created`;
");
$conn->exec("
ALTER TABLE `msz_users`
CHANGE COLUMN `created_at` `user_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP AFTER `user_colour`,
CHANGE COLUMN `last_seen` `user_active` TIMESTAMP NULL DEFAULT NULL AFTER `user_created`,
CHANGE COLUMN `deleted_at` `user_deleted` TIMESTAMP NULL DEFAULT NULL AFTER `user_active`,
DROP INDEX `users_user_country_index`,
DROP INDEX `users_last_seen_index`,
DROP INDEX `users_created_at_index`,
ADD INDEX `users_indices` (`user_country`, `user_created`, `user_active`, `user_deleted`);
");
}
function migrate_down(PDO $conn): void
{
// can't be bothered to write a reverse for this migration
// honestly i might just remove migrate_down system since i don't really ever use it
$conn = $conn; // trick phpcs
}

View file

@ -1,102 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddPermissionOverrideFlag;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_permissions`
ADD COLUMN `general_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `general_perms_deny`,
ADD COLUMN `user_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `user_perms_deny`,
ADD COLUMN `changelog_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `changelog_perms_deny`,
ADD COLUMN `news_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `news_perms_deny`,
ADD COLUMN `forum_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `forum_perms_deny`,
ADD COLUMN `comments_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `comments_perms_deny`;
");
$conn->exec("
ALTER TABLE `msz_forum_permissions`
ADD COLUMN `forum_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `forum_perms_deny`;
");
$conn->exec('DROP VIEW `msz_forum_permissions_view`');
$conn->exec("
CREATE VIEW `msz_forum_permissions_view` AS
WITH RECURSIVE permissions(user_id, role_id, forum_id, forum_perms_allow, forum_perms_deny) as (
SELECT
pp.`user_id`, pp.`role_id`,
pc.`forum_id`,
IFNULL(pp.`forum_perms_allow`, 0), IFNULL(pp.`forum_perms_deny`, 0)
FROM `msz_forum_categories` as pc
LEFT JOIN `msz_forum_permissions` as pp
ON pp.`forum_id` = pc.`forum_id`
GROUP BY `user_id`, `role_id`, `forum_id`
UNION ALL
SELECT
permissions.`user_id`, permissions.`role_id`,
cc.`forum_id`,
IFNULL(cp.`forum_perms_allow`, 0) | (permissions.`forum_perms_allow` &~ IFNULL(cp.`forum_perms_override`, 0)),
IFNULL(cp.`forum_perms_deny`, 0) | (permissions.`forum_perms_deny` &~ IFNULL(cp.`forum_perms_override`, 0))
FROM `msz_forum_categories` as cc
LEFT JOIN `msz_forum_permissions` as cp
ON cp.`forum_id` = cc.`forum_id`
INNER JOIN permissions
ON cc.`forum_parent` = permissions.`forum_id`
)
SELECT
`user_id`, `role_id`, `forum_id`,
(BIT_OR(`forum_perms_allow`) &~ BIT_OR(`forum_perms_deny`)) as `forum_perms`
FROM permissions
GROUP BY `user_id`, `role_id`, `forum_id`
");
}
function migrate_down(PDO $conn): void
{
$conn->exec('DROP VIEW `msz_forum_permissions_view`');
$conn->exec("
CREATE VIEW `msz_forum_permissions_view` AS
WITH RECURSIVE permissions(user_id, role_id, forum_id, forum_perms_allow, forum_perms_deny) as (
SELECT
pp.`user_id`, pp.`role_id`,
pc.`forum_id`,
IFNULL(pp.`forum_perms_allow`, 0), IFNULL(pp.`forum_perms_deny`, 0)
FROM `msz_forum_categories` as pc
LEFT JOIN `msz_forum_permissions` as pp
ON pp.`forum_id` = pc.`forum_id`
GROUP BY `user_id`, `role_id`, `forum_id`
UNION ALL
SELECT
permissions.`user_id`, permissions.`role_id`,
cc.`forum_id`,
IFNULL(cp.`forum_perms_allow`, 0) | permissions.`forum_perms_allow`,
IFNULL(cp.`forum_perms_deny`, 0) | permissions.`forum_perms_deny`
FROM `msz_forum_categories` as cc
LEFT JOIN `msz_forum_permissions` as cp
ON cp.`forum_id` = cc.`forum_id`
INNER JOIN permissions
ON cc.`forum_parent` = permissions.`forum_id`
)
SELECT
`user_id`, `role_id`, `forum_id`,
(BIT_OR(`forum_perms_allow`) &~ BIT_OR(`forum_perms_deny`)) as `forum_perms`
FROM permissions
GROUP BY `user_id`, `role_id`, `forum_id`
");
$conn->exec("
ALTER TABLE `msz_forum_permissions`
DROP COLUMN `forum_perms_override`;
");
$conn->exec("
ALTER TABLE `msz_permissions`
DROP COLUMN `general_perms_override`,
DROP COLUMN `user_perms_override`,
DROP COLUMN `changelog_perms_override`,
DROP COLUMN `news_perms_override`,
DROP COLUMN `forum_perms_override`,
DROP COLUMN `comments_perms_override`;
");
}

View file

@ -1,22 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\RolesTableExtensions;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_roles`
CHANGE COLUMN `role_secret` `role_hidden` TINYINT(1) NOT NULL DEFAULT '0' AFTER `role_description`,
ADD COLUMN `role_can_leave` TINYINT(1) NOT NULL DEFAULT '0' AFTER `role_hidden`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_roles`
CHANGE COLUMN `role_hidden` `role_secret` TINYINT(1) NOT NULL DEFAULT '0' AFTER `role_description`,
DROP COLUMN `role_can_leave`;
");
}

View file

@ -1,20 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddSwitchFriendcodeField;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
ADD COLUMN `user_ninswitch` VARCHAR(14) NOT NULL DEFAULT '' AFTER `user_steam`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
DROP COLUMN `user_ninswitch`;
");
}

View file

@ -1,51 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddWarningsTable;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
CREATE TABLE `msz_user_warnings` (
`warning_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NOT NULL,
`user_ip` VARBINARY(16) NOT NULL,
`issuer_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`issuer_ip` VARBINARY(16) NOT NULL,
`warning_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`warning_duration` TIMESTAMP NULL DEFAULT NULL,
`warning_type` TINYINT(3) UNSIGNED NOT NULL,
`warning_note` VARCHAR(255) NOT NULL,
`warning_note_private` TEXT NULL DEFAULT NULL,
PRIMARY KEY (`warning_id`),
INDEX `user_warnings_user_foreign` (`user_id`),
INDEX `user_warnings_issuer_foreign` (`issuer_id`),
INDEX `user_warnings_indices` (`warning_created`, `warning_type`, `warning_duration`, `user_ip`),
CONSTRAINT `user_warnings_issuer_foreign`
FOREIGN KEY (`issuer_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL,
CONSTRAINT `user_warnings_user_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
)
");
$conn->exec("
CREATE TABLE `msz_ip_blacklist` (
`ip_subnet` VARBINARY(16) NOT NULL,
`ip_mask` TINYINT(3) UNSIGNED NOT NULL,
UNIQUE INDEX `ip_blacklist_unique` (`ip_subnet`, `ip_mask`)
)
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
DROP TABLE `msz_user_warnings`;
");
}

View file

@ -1,102 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\RemoveOverrideFlag;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_permissions`
DROP COLUMN `general_perms_override`,
DROP COLUMN `user_perms_override`,
DROP COLUMN `changelog_perms_override`,
DROP COLUMN `news_perms_override`,
DROP COLUMN `forum_perms_override`,
DROP COLUMN `comments_perms_override`;
");
$conn->exec('DROP VIEW `msz_forum_permissions_view`');
$conn->exec("
CREATE VIEW `msz_forum_permissions_view` AS
WITH RECURSIVE permissions(user_id, role_id, forum_id, forum_perms_allow, forum_perms_deny) as (
SELECT
pp.`user_id`, pp.`role_id`,
pc.`forum_id`,
IFNULL(pp.`forum_perms_allow`, 0), IFNULL(pp.`forum_perms_deny`, 0)
FROM `msz_forum_categories` as pc
LEFT JOIN `msz_forum_permissions` as pp
ON pp.`forum_id` = pc.`forum_id`
GROUP BY `user_id`, `role_id`, `forum_id`
UNION ALL
SELECT
permissions.`user_id`, permissions.`role_id`,
cc.`forum_id`,
IFNULL(cp.`forum_perms_allow`, 0) | permissions.`forum_perms_allow`,
IFNULL(cp.`forum_perms_deny`, 0) | permissions.`forum_perms_deny`
FROM `msz_forum_categories` as cc
LEFT JOIN `msz_forum_permissions` as cp
ON cp.`forum_id` = cc.`forum_id`
INNER JOIN permissions
ON cc.`forum_parent` = permissions.`forum_id`
)
SELECT
`user_id`, `role_id`, `forum_id`,
(BIT_OR(`forum_perms_allow`) &~ BIT_OR(`forum_perms_deny`)) as `forum_perms`
FROM permissions
GROUP BY `user_id`, `role_id`, `forum_id`
");
$conn->exec("
ALTER TABLE `msz_forum_permissions`
DROP COLUMN `forum_perms_override`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_permissions`
ADD COLUMN `forum_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `forum_perms_deny`;
");
$conn->exec('DROP VIEW `msz_forum_permissions_view`');
$conn->exec("
CREATE VIEW `msz_forum_permissions_view` AS
WITH RECURSIVE permissions(user_id, role_id, forum_id, forum_perms_allow, forum_perms_deny) as (
SELECT
pp.`user_id`, pp.`role_id`,
pc.`forum_id`,
IFNULL(pp.`forum_perms_allow`, 0), IFNULL(pp.`forum_perms_deny`, 0)
FROM `msz_forum_categories` as pc
LEFT JOIN `msz_forum_permissions` as pp
ON pp.`forum_id` = pc.`forum_id`
GROUP BY `user_id`, `role_id`, `forum_id`
UNION ALL
SELECT
permissions.`user_id`, permissions.`role_id`,
cc.`forum_id`,
IFNULL(cp.`forum_perms_allow`, 0) | (permissions.`forum_perms_allow` &~ IFNULL(cp.`forum_perms_override`, 0)),
IFNULL(cp.`forum_perms_deny`, 0) | (permissions.`forum_perms_deny` &~ IFNULL(cp.`forum_perms_override`, 0))
FROM `msz_forum_categories` as cc
LEFT JOIN `msz_forum_permissions` as cp
ON cp.`forum_id` = cc.`forum_id`
INNER JOIN permissions
ON cc.`forum_parent` = permissions.`forum_id`
)
SELECT
`user_id`, `role_id`, `forum_id`,
(BIT_OR(`forum_perms_allow`) &~ BIT_OR(`forum_perms_deny`)) as `forum_perms`
FROM permissions
GROUP BY `user_id`, `role_id`, `forum_id`
");
$conn->exec("
ALTER TABLE `msz_permissions`
ADD COLUMN `general_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `general_perms_deny`,
ADD COLUMN `user_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `user_perms_deny`,
ADD COLUMN `changelog_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `changelog_perms_deny`,
ADD COLUMN `news_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `news_perms_deny`,
ADD COLUMN `forum_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `forum_perms_deny`,
ADD COLUMN `comments_perms_override` INT(10) UNSIGNED NOT NULL DEFAULT '0' AFTER `comments_perms_deny`;
");
}

View file

@ -1,20 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AutomaticallyMarkEdited;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_posts`
CHANGE COLUMN `post_edited` `post_edited` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP AFTER `post_created`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_posts`
CHANGE COLUMN `post_edited` `post_edited` TIMESTAMP NULL DEFAULT NULL AFTER `post_created`;
");
}

View file

@ -1,20 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\RevertAutoEditMark;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_posts`
CHANGE COLUMN `post_edited` `post_edited` TIMESTAMP NULL DEFAULT NULL AFTER `post_created`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_posts`
CHANGE COLUMN `post_edited` `post_edited` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP AFTER `post_created`;
");
}

View file

@ -1,16 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\NukeChatQuotes;
use PDO;
require_once '2018_10_09_181724_chat_quotes_table.php';
function migrate_up(PDO $conn): void
{
\Misuzu\DatabaseMigrations\ChatQuotesTable\migrate_down($conn);
}
function migrate_down(PDO $conn): void
{
\Misuzu\DatabaseMigrations\ChatQuotesTable\migrate_up($conn);
}

View file

@ -1,22 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddBirthdayField;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
ADD COLUMN `user_birthdate` DATE NULL DEFAULT NULL AFTER `user_about_parser`,
DROP INDEX `users_indices`,
ADD INDEX `users_indices` (`user_country`, `user_created`, `user_active`, `user_deleted`, `user_birthdate`);
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
DROP COLUMN `user_birthdate`;
");
}

View file

@ -1,31 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddSignatureColumns;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
ADD COLUMN `user_signature_content` TEXT NULL AFTER `user_about_parser`,
ADD COLUMN `user_signature_parser` TINYINT(4) NOT NULL DEFAULT '0' AFTER `user_signature_content`;
");
$conn->exec("
ALTER TABLE `msz_forum_posts`
ADD COLUMN `post_display_signature` TINYINT(4) UNSIGNED NOT NULL DEFAULT '1' AFTER `post_parse`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_posts`
DROP COLUMN `post_display_signature`;
");
$conn->exec("
ALTER TABLE `msz_users`
DROP COLUMN `user_signature_content`,
DROP COLUMN `user_signature_parser`;
");
}

View file

@ -1,20 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\SuperUserFlag;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
ADD COLUMN `user_super` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0' AFTER `last_ip`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
DROP COLUMN `user_super`;
");
}

View file

@ -1,22 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddStaticForumCounts;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_categories`
ADD COLUMN `forum_count_topics` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `forum_hidden`,
ADD COLUMN `forum_count_posts` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `forum_count_topics`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_categories`
DROP COLUMN `forum_count_topics`,
DROP COLUMN `forum_count_posts`;
");
}

View file

@ -1,43 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddStaticTopicViewcount;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_topics`
ADD COLUMN `topic_count_views` INT UNSIGNED NOT NULL DEFAULT '0' AFTER `topic_title`;
");
$conn->exec("
CREATE TRIGGER `msz_forum_topics_track_increase_views`
AFTER INSERT ON `msz_forum_topics_track`
FOR EACH ROW BEGIN
UPDATE `msz_forum_topics`
SET `topic_count_views` = `topic_count_views` + 1
WHERE `topic_id` = NEW.topic_id;
END;
");
// Restore view counts
$conn->exec("
UPDATE `msz_forum_topics` AS t
INNER JOIN (
SELECT `topic_id`, COUNT(`user_id`) AS `count_views`
FROM `msz_forum_topics_track`
GROUP BY `topic_id`
) AS tt
ON tt.`topic_id` = t.`topic_id`
SET t.`topic_count_views` = tt.`count_views`
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("DROP TRIGGER `msz_forum_topics_track_increase_views`");
$conn->exec("
ALTER TABLE `msz_forum_topics`
DROP COLUMN `topic_count_views`;
");
}

View file

@ -1,22 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\RemoveTriggerFromTopicsTrack;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("DROP TRIGGER `msz_forum_topics_track_increase_views`");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
CREATE TRIGGER `msz_forum_topics_track_increase_views`
AFTER INSERT ON `msz_forum_topics_track`
FOR EACH ROW BEGIN
UPDATE `msz_forum_topics`
SET `topic_count_views` = `topic_count_views` + 1
WHERE `topic_id` = NEW.topic_id;
END;
");
}

View file

@ -1,20 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddTwoFactorAuth;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
ADD COLUMN `user_totp_key` CHAR(26) NULL DEFAULT NULL AFTER `display_role`;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_users`
DROP COLUMN `user_totp_key`;
");
}

View file

@ -1,30 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddTfaLoginTokenTable;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
CREATE TABLE `msz_auth_tfa` (
`user_id` INT UNSIGNED NOT NULL,
`tfa_token` CHAR(32) NOT NULL,
`tfa_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE INDEX `auth_tfa_token_unique` (`tfa_token`),
INDEX `auth_tfa_user_foreign` (`user_id`),
INDEX `auth_tfa_created_index` (`tfa_created`),
CONSTRAINT `auth_tfa_user_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
);
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
DROP TABLE `msz_auth_tfa`;
");
}

View file

@ -1,49 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\ChangeEnumToIntInCommentVotes;
use PDO;
function migrate_up(PDO $conn): void
{
// Step 1, add new column
$conn->exec("
ALTER TABLE `msz_comments_votes`
ADD COLUMN `comment_vote` TINYINT NOT NULL DEFAULT '0' AFTER `user_id`,
CHANGE COLUMN `comment_vote` `comment_vote_old` ENUM('Like','Dislike') NULL DEFAULT NULL COLLATE 'utf8mb4_bin' AFTER `comment_vote`,
ADD INDEX `comments_vote_old` (`comment_vote_old`);
");
// Step 2, migrate old values
$conn->exec(sprintf(
'
UPDATE `msz_comments_votes`
SET `comment_vote` = %d
WHERE `comment_vote_old` = "Like"
',
MSZ_COMMENTS_VOTE_LIKE
));
$conn->exec(sprintf(
'
UPDATE `msz_comments_votes`
SET `comment_vote` = %d
WHERE `comment_vote_old` = "Dislike"
',
MSZ_COMMENTS_VOTE_DISLIKE
));
// Step 3, nuke the old column
$conn->exec('
ALTER TABLE `msz_comments_votes`
DROP COLUMN `comment_vote_old`;
');
}
function migrate_down(PDO $conn): void
{
// this one only goes one way!
$conn->exec("TRUNCATE `msz_comments_votes`");
$conn->exec("
ALTER TABLE `msz_comments_votes`
CHANGE COLUMN `comment_vote` `comment_vote` ENUM('Like','Dislike') NULL DEFAULT NULL COLLATE 'utf8mb4_bin' AFTER `user_id`;
");
}

View file

@ -1,26 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\SessionsUpdates;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_sessions`
ADD COLUMN `session_ip_last` VARBINARY(16) NULL DEFAULT NULL AFTER `session_ip`,
ADD COLUMN `session_expires_bump` TINYINT UNSIGNED NOT NULL DEFAULT '1' AFTER `session_expires`,
ADD UNIQUE INDEX `sessions_key_unique` (`session_key`),
ADD INDEX `sessions_expires_index` (`session_expires`);
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_sessions`
DROP COLUMN `session_ip_last`,
DROP COLUMN `session_expires_bump`,
DROP INDEX `sessions_expires_index`,
DROP INDEX `sessions_key_unique`;
");
}

View file

@ -1,24 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddIndexToForumPostDeleted;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_posts`
DROP INDEX `posts_indices`,
ADD INDEX `posts_created_index` (`post_created`),
ADD INDEX `posts_deleted_index` (`post_deleted`);
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_posts`
DROP INDEX `posts_created_index`,
DROP INDEX `posts_deleted_index`,
ADD INDEX `posts_indices` (`post_created`);
");
}

View file

@ -1,26 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\FixForumIndices;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_categories`
DROP INDEX `forums_indices`,
ADD INDEX `forum_order_index` (`forum_order`),
ADD INDEX `forum_parent_index` (`forum_parent`),
ADD INDEX `forum_type_index` (`forum_type`);
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_categories`
DROP INDEX `forum_order_index`,
DROP INDEX `forum_parent_index`,
DROP INDEX `forum_type_index`,
ADD INDEX `forums_indices` (`forum_order`, `forum_parent`, `forum_type`);
");
}

View file

@ -1,63 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\MakeChangelogActionsStatic;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_changelog_changes`
CHANGE COLUMN `action_id` `change_action` INT(10) UNSIGNED NULL DEFAULT NULL AFTER `user_id`,
DROP INDEX `changes_user_id_foreign`,
ADD INDEX `changes_user_foreign` (`user_id`),
DROP INDEX `changes_action_id_foreign`,
ADD INDEX `changes_action_index` (`change_action`),
DROP INDEX `changes_change_created_index`,
ADD INDEX `changes_created_index` (`change_created`),
DROP FOREIGN KEY `changes_action_id_foreign`;
");
$conn->exec("DROP TABLE `msz_changelog_actions`");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
CREATE TABLE `msz_changelog_actions` (
`action_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`action_name` VARCHAR(50) NOT NULL,
`action_colour` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`action_class` VARCHAR(20) NOT NULL,
PRIMARY KEY (`action_id`),
UNIQUE INDEX `action_class_unique` (`action_class`)
)
");
$conn->exec("
INSERT INTO `msz_changelog_actions`
(`action_id`, `action_name`, `action_colour`, `action_class`)
VALUES
(1, 'Added', 1414709, 'add'),
(2, 'Removed', 14890819, 'remove'),
(3, 'Updated', 2718602, 'update'),
(4, 'Fixed', 2973334, 'fix'),
(5, 'Imported', 2856568, 'import'),
(6, 'Reverted', 14910021, 'revert');
");
$conn->exec("
ALTER TABLE `msz_changelog_changes`
CHANGE COLUMN `change_action` `action_id` INT(10) UNSIGNED NULL DEFAULT NULL AFTER `user_id`,
DROP INDEX `changes_user_foreign`,
ADD INDEX `changes_user_id_foreign` (`user_id`),
DROP INDEX `changes_action_index`,
ADD INDEX `changes_action_id_foreign` (`action_id`),
DROP INDEX `changes_created_index`,
ADD INDEX `changes_change_created_index` (`change_created`),
ADD CONSTRAINT `changes_action_id_foreign`
FOREIGN KEY (`action_id`)
REFERENCES `msz_changelog_actions` (`action_id`)
ON UPDATE CASCADE
ON DELETE SET NULL;
");
}

View file

@ -1,100 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\AddMoreIndices;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_posts`
ADD INDEX `posts_parse_index` (`post_parse`),
ADD INDEX `posts_edited_index` (`post_edited`),
ADD INDEX `posts_display_signature_index` (`post_display_signature`),
ADD INDEX `posts_ip_index` (`post_ip`),
ADD FULLTEXT INDEX `posts_fulltext` (`post_text`);
");
$conn->exec("
ALTER TABLE `msz_comments_categories`
ADD INDEX `comments_categories_locked_index` (`category_locked`);
");
$conn->exec("
ALTER TABLE `msz_forum_topics`
DROP INDEX `topics_indices`,
ADD FULLTEXT INDEX `topics_fulltext` (`topic_title`),
ADD INDEX `topics_type_index` (`topic_type`),
ADD INDEX `topics_created_index` (`topic_created`),
ADD INDEX `topics_bumped_index` (`topic_bumped`),
ADD INDEX `topics_deleted_index` (`topic_deleted`),
ADD INDEX `topics_locked_index` (`topic_locked`);
");
$conn->exec("
ALTER TABLE `msz_news_posts`
DROP INDEX `news_posts_indices`,
ADD INDEX `news_posts_featured_index` (`post_is_featured`),
ADD INDEX `news_posts_scheduled_index` (`post_scheduled`),
ADD INDEX `news_posts_created_index` (`post_created`),
ADD INDEX `news_posts_updated_index` (`post_updated`),
ADD INDEX `news_posts_deleted_index` (`post_deleted`),
ADD FULLTEXT INDEX `news_posts_fulltext` (`post_title`, `post_text`);
");
$conn->exec("
ALTER TABLE `msz_user_warnings`
DROP INDEX `user_warnings_indices`,
ADD INDEX `user_warnings_created_index` (`warning_created`),
ADD INDEX `user_warnings_duration_index` (`warning_duration`),
ADD INDEX `user_warnings_type_index` (`warning_type`),
ADD INDEX `user_warnings_user_ip_index` (`user_ip`);
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_user_warnings`
DROP INDEX `user_warnings_user_ip_index`,
DROP INDEX `user_warnings_type_index`,
DROP INDEX `user_warnings_duration_index`,
DROP INDEX `user_warnings_created_index`,
ADD INDEX `user_warnings_indices` (`warning_created`, `warning_type`, `warning_duration`, `user_ip`);
");
$conn->exec("
ALTER TABLE `msz_news_posts`
DROP INDEX `news_posts_fulltext`,
DROP INDEX `news_posts_deleted_index`,
DROP INDEX `news_posts_created_index`,
DROP INDEX `news_posts_updated_index`,
DROP INDEX `news_posts_scheduled_index`,
DROP INDEX `news_posts_featured_index`,
ADD INDEX `news_posts_indices` (`post_is_featured`, `post_scheduled`, `post_created`);
");
$conn->exec("
ALTER TABLE `msz_forum_topics`
DROP INDEX `topics_fulltext`,
DROP INDEX `topics_locked_index`,
DROP INDEX `topics_deleted_index`,
DROP INDEX `topics_created_index`,
DROP INDEX `topics_bumped_index`,
DROP INDEX `topics_type_index`,
ADD INDEX `topics_indices` (`topic_type`, `topic_bumped`);
");
$conn->exec("
ALTER TABLE `msz_comments_categories`
DROP INDEX `comments_categories_locked_index`;
");
$conn->exec("
ALTER TABLE `msz_forum_posts`
DROP INDEX `posts_fulltext`,
DROP INDEX `posts_ip_index`,
DROP INDEX `posts_display_signature_index`,
DROP INDEX `posts_edited_index`,
DROP INDEX `posts_parse_index`,;
");
}

View file

@ -1,83 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\CreatePollsTables;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec("
CREATE TABLE `msz_forum_polls` (
`poll_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`poll_max_votes` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
`poll_expires` TIMESTAMP NULL DEFAULT NULL,
`poll_preview_results` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
PRIMARY KEY (`poll_id`)
) COLLATE='utf8mb4_bin' ENGINE=InnoDB
");
$conn->exec("
CREATE TABLE `msz_forum_polls_options` (
`option_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`poll_id` INT(10) UNSIGNED NOT NULL,
`option_text` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`option_id`),
INDEX `polls_options_poll_foreign` (`poll_id`),
CONSTRAINT `polls_options_poll_foreign`
FOREIGN KEY (`poll_id`)
REFERENCES `msz_forum_polls` (`poll_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB
");
$conn->exec("
CREATE TABLE `msz_forum_polls_answers` (
`user_id` INT(10) UNSIGNED NOT NULL,
`poll_id` INT(10) UNSIGNED NOT NULL,
`option_id` INT(10) UNSIGNED NOT NULL,
UNIQUE INDEX `polls_answers_unique` (`user_id`, `poll_id`, `option_id`),
INDEX `polls_answers_user_foreign` (`user_id`),
INDEX `polls_answers_poll_foreign` (`poll_id`),
INDEX `polls_answers_option_foreign` (`option_id`),
CONSTRAINT `polls_answers_option_foreign`
FOREIGN KEY (`option_id`)
REFERENCES `msz_forum_polls_options` (`option_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `polls_answers_poll_foreign`
FOREIGN KEY (`poll_id`)
REFERENCES `msz_forum_polls` (`poll_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `polls_answers_user_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB
");
$conn->exec("
ALTER TABLE `msz_forum_topics`
ADD COLUMN `poll_id` INT(10) UNSIGNED NULL DEFAULT NULL AFTER `user_id`,
ADD INDEX `posts_poll_id_foreign` (`poll_id`),
ADD CONSTRAINT `posts_poll_id_foreign`
FOREIGN KEY (`poll_id`)
REFERENCES `msz_forum_polls` (`poll_id`)
ON UPDATE CASCADE
ON DELETE SET NULL;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("
ALTER TABLE `msz_forum_topics`
DROP COLUMN `poll_id`,
DROP INDEX `posts_poll_id_foreign`,
DROP FOREIGN KEY `posts_poll_id_foreign`;
");
$conn->exec("DROP TABLE `msz_forum_polls_answers`");
$conn->exec("DROP TABLE `msz_forum_polls_options`");
$conn->exec("DROP TABLE `msz_forum_polls`");
}

View file

@ -1,42 +0,0 @@
<?php
namespace Misuzu\DatabaseMigrations\RemoveWithRecursive;
use PDO;
function migrate_up(PDO $conn): void
{
$conn->exec('DROP VIEW `msz_forum_permissions_view`');
}
function migrate_down(PDO $conn): void
{
$conn->exec("
CREATE VIEW `msz_forum_permissions_view` AS
WITH RECURSIVE permissions(user_id, role_id, forum_id, forum_perms_allow, forum_perms_deny) as (
SELECT
pp.`user_id`, pp.`role_id`,
pc.`forum_id`,
IFNULL(pp.`forum_perms_allow`, 0), IFNULL(pp.`forum_perms_deny`, 0)
FROM `msz_forum_categories` as pc
LEFT JOIN `msz_forum_permissions` as pp
ON pp.`forum_id` = pc.`forum_id`
GROUP BY `user_id`, `role_id`, `forum_id`
UNION ALL
SELECT
permissions.`user_id`, permissions.`role_id`,
cc.`forum_id`,
IFNULL(cp.`forum_perms_allow`, 0) | permissions.`forum_perms_allow`,
IFNULL(cp.`forum_perms_deny`, 0) | permissions.`forum_perms_deny`
FROM `msz_forum_categories` as cc
LEFT JOIN `msz_forum_permissions` as cp
ON cp.`forum_id` = cc.`forum_id`
INNER JOIN permissions
ON cc.`forum_parent` = permissions.`forum_id`
)
SELECT
`user_id`, `role_id`, `forum_id`,
(BIT_OR(`forum_perms_allow`) &~ BIT_OR(`forum_perms_deny`)) as `forum_perms`
FROM permissions
GROUP BY `user_id`, `role_id`, `forum_id`
");
}

View file

@ -0,0 +1,706 @@
<?php
namespace Misuzu\DatabaseMigrations\InitialStructure;
use PDO;
// MariaDB migration!
// Gotta get rid of possible incompatible stuff like WITH RECURSIVE for new installations.
function migrate_up(PDO $conn): void
{
$getMigrations = $conn->prepare("SELECT COUNT(*) FROM `msz_migrations`");
$migrations = (int)($getMigrations->execute() ? $getMigrations->fetchColumn() : 0);
if($migrations > 0) {
$conn->exec("TRUNCATE `msz_migrations`");
return;
}
$conn->exec("
CREATE TABLE `msz_ip_blacklist` (
`ip_subnet` VARBINARY(16) NOT NULL,
`ip_mask` TINYINT(3) UNSIGNED NOT NULL,
UNIQUE INDEX `ip_blacklist_unique` (`ip_subnet`, `ip_mask`)
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_roles` (
`role_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`role_hierarchy` INT(11) NOT NULL DEFAULT '1',
`role_name` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`role_title` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`role_description` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`role_hidden` TINYINT(1) NOT NULL DEFAULT '0',
`role_can_leave` TINYINT(1) NOT NULL DEFAULT '0',
`role_colour` INT(11) NULL DEFAULT NULL,
`role_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`role_id`)
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_users` (
`user_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`username` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`password` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`email` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`register_ip` VARBINARY(16) NOT NULL,
`last_ip` VARBINARY(16) NOT NULL,
`user_super` TINYINT(1) UNSIGNED NOT NULL DEFAULT '0',
`user_country` CHAR(2) NOT NULL DEFAULT 'XX' COLLATE 'utf8mb4_bin',
`user_colour` INT(11) NULL DEFAULT NULL,
`user_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`user_active` TIMESTAMP NULL DEFAULT NULL,
`user_deleted` TIMESTAMP NULL DEFAULT NULL,
`display_role` INT(10) UNSIGNED NULL DEFAULT NULL,
`user_totp_key` CHAR(26) NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`user_about_content` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`user_about_parser` TINYINT(4) NOT NULL DEFAULT '0',
`user_signature_content` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`user_signature_parser` TINYINT(4) NOT NULL DEFAULT '0',
`user_birthdate` DATE NULL DEFAULT NULL,
`user_background_settings` TINYINT(4) NULL DEFAULT '0',
`user_website` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
`user_twitter` VARCHAR(20) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
`user_github` VARCHAR(40) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
`user_skype` VARCHAR(60) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
`user_discord` VARCHAR(40) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
`user_youtube` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
`user_steam` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
`user_ninswitch` VARCHAR(14) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
`user_twitchtv` VARCHAR(30) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
`user_osu` VARCHAR(20) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
`user_lastfm` VARCHAR(20) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
`user_title` VARCHAR(64) NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`user_id`),
UNIQUE INDEX `users_username_unique` (`username`),
UNIQUE INDEX `users_email_unique` (`email`),
INDEX `users_display_role_foreign` (`display_role`),
INDEX `users_indices` (
`user_country`, `user_created`, `user_active`,
`user_deleted`, `user_birthdate`
),
CONSTRAINT `users_display_role_foreign`
FOREIGN KEY (`display_role`)
REFERENCES `msz_roles` (`role_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_user_roles` (
`user_id` INT(10) UNSIGNED NOT NULL,
`role_id` INT(10) UNSIGNED NOT NULL,
UNIQUE INDEX `user_roles_unique` (`user_id`, `role_id`),
INDEX `user_roles_role_id_foreign` (`role_id`),
CONSTRAINT `user_roles_role_id_foreign`
FOREIGN KEY (`role_id`)
REFERENCES `msz_roles` (`role_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `user_roles_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_users_password_resets` (
`user_id` INT(10) UNSIGNED NOT NULL,
`reset_ip` VARBINARY(16) NOT NULL,
`reset_requested` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`verification_code` CHAR(12) NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
UNIQUE INDEX `msz_users_password_resets_unique` (`user_id`, `reset_ip`),
INDEX `msz_users_password_resets_index` (`reset_requested`),
CONSTRAINT `msz_users_password_resets_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_user_relations` (
`user_id` INT(10) UNSIGNED NOT NULL,
`subject_id` INT(10) UNSIGNED NOT NULL,
`relation_type` TINYINT(3) UNSIGNED NOT NULL,
`relation_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE INDEX `user_relations_unique` (`user_id`, `subject_id`),
INDEX `user_relations_subject_id_foreign` (`subject_id`),
CONSTRAINT `user_relations_subject_id_foreign`
FOREIGN KEY (`subject_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `user_relations_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_user_warnings` (
`warning_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NOT NULL,
`user_ip` VARBINARY(16) NOT NULL,
`issuer_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`issuer_ip` VARBINARY(16) NOT NULL,
`warning_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`warning_duration` TIMESTAMP NULL DEFAULT NULL,
`warning_type` TINYINT(3) UNSIGNED NOT NULL,
`warning_note` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`warning_note_private` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`warning_id`),
INDEX `user_warnings_user_foreign` (`user_id`),
INDEX `user_warnings_issuer_foreign` (`issuer_id`),
INDEX `user_warnings_created_index` (`warning_created`),
INDEX `user_warnings_duration_index` (`warning_duration`),
INDEX `user_warnings_type_index` (`warning_type`),
INDEX `user_warnings_user_ip_index` (`user_ip`),
CONSTRAINT `user_warnings_issuer_foreign`
FOREIGN KEY (`issuer_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL,
CONSTRAINT `user_warnings_user_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_sessions` (
`session_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NOT NULL,
`session_key` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`session_ip` VARBINARY(16) NOT NULL,
`session_ip_last` VARBINARY(16) NULL DEFAULT NULL,
`session_user_agent` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`session_country` CHAR(2) NOT NULL DEFAULT 'XX' COLLATE 'utf8mb4_bin',
`session_expires` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`session_expires_bump` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
`session_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`session_active` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`session_id`),
UNIQUE INDEX `sessions_key_unique` (`session_key`),
INDEX `sessions_user_id_foreign` (`user_id`),
INDEX `sessions_expires_index` (`session_expires`),
CONSTRAINT `sessions_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_permissions` (
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`role_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`general_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`general_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`user_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`user_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`changelog_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`changelog_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`news_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`news_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`forum_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`forum_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`comments_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`comments_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
UNIQUE INDEX `permissions_user_id_unique` (`user_id`),
UNIQUE INDEX `permissions_role_id_unique` (`role_id`),
CONSTRAINT `permissions_role_id_foreign`
FOREIGN KEY (`role_id`)
REFERENCES `msz_roles` (`role_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `permissions_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_audit_log` (
`log_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`log_action` VARCHAR(50) NOT NULL COLLATE 'utf8mb4_bin',
`log_params` TEXT NOT NULL COLLATE 'utf8mb4_bin',
`log_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`log_ip` VARBINARY(16) NULL DEFAULT NULL,
`log_country` CHAR(2) NOT NULL DEFAULT 'XX' COLLATE 'utf8mb4_bin',
PRIMARY KEY (`log_id`),
INDEX `audit_log_user_id_foreign` (`user_id`),
CONSTRAINT `audit_log_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_auth_tfa` (
`user_id` INT(10) UNSIGNED NOT NULL,
`tfa_token` CHAR(32) NOT NULL COLLATE 'utf8mb4_bin',
`tfa_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE INDEX `auth_tfa_token_unique` (`tfa_token`),
INDEX `auth_tfa_user_foreign` (`user_id`),
INDEX `auth_tfa_created_index` (`tfa_created`),
CONSTRAINT `auth_tfa_user_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_login_attempts` (
`attempt_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`attempt_success` TINYINT(1) NOT NULL,
`attempt_ip` VARBINARY(16) NOT NULL,
`attempt_country` CHAR(2) NOT NULL DEFAULT 'XX' COLLATE 'utf8mb4_bin',
`attempt_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`attempt_user_agent` VARCHAR(255) NOT NULL DEFAULT '' COLLATE 'utf8mb4_bin',
PRIMARY KEY (`attempt_id`),
INDEX `login_attempts_user_id_foreign` (`user_id`),
CONSTRAINT `login_attempts_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_comments_categories` (
`category_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`category_name` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`category_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`category_locked` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`category_id`),
UNIQUE INDEX `comments_categories_name_unique` (`category_name`),
INDEX `comments_categories_locked_index` (`category_locked`)
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_comments_posts` (
`comment_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`category_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`comment_reply_to` INT(10) UNSIGNED NULL DEFAULT NULL,
`comment_text` TEXT NOT NULL COLLATE 'utf8mb4_bin',
`comment_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`comment_pinned` TIMESTAMP NULL DEFAULT NULL,
`comment_edited` TIMESTAMP NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`comment_deleted` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`comment_id`),
INDEX `comments_posts_category_foreign` (`category_id`),
INDEX `comments_posts_user_foreign` (`user_id`),
INDEX `comments_posts_reply_id` (`comment_reply_to`),
INDEX `comments_posts_dates` (
`comment_created`, `comment_pinned`,
`comment_edited`, `comment_deleted`
),
CONSTRAINT `comments_posts_category_foreign`
FOREIGN KEY (`category_id`)
REFERENCES `msz_comments_categories` (`category_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `comments_posts_user_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_comments_votes` (
`comment_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NOT NULL,
`comment_vote` TINYINT(4) NOT NULL DEFAULT '0',
UNIQUE INDEX `comments_vote_unique` (`comment_id`, `user_id`),
INDEX `comments_vote_user_foreign` (`user_id`),
INDEX `comments_vote_index` (`comment_vote`),
CONSTRAINT `comment_vote_id`
FOREIGN KEY (`comment_id`)
REFERENCES `msz_comments_posts` (`comment_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `comment_vote_user`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_news_categories` (
`category_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`category_name` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`category_description` TEXT NOT NULL COLLATE 'utf8mb4_bin',
`category_is_hidden` TINYINT(1) NOT NULL DEFAULT '0',
`category_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`category_id`)
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_news_posts` (
`post_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`category_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`comment_section_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`post_is_featured` TINYINT(1) NOT NULL DEFAULT '0',
`post_title` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`post_text` TEXT NOT NULL COLLATE 'utf8mb4_bin',
`post_scheduled` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`post_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`post_updated` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`post_deleted` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`post_id`),
INDEX `news_posts_category_id_foreign` (`category_id`),
INDEX `news_posts_user_id_foreign` (`user_id`),
INDEX `news_posts_comment_section` (`comment_section_id`),
INDEX `news_posts_featured_index` (`post_is_featured`),
INDEX `news_posts_scheduled_index` (`post_scheduled`),
INDEX `news_posts_created_index` (`post_created`),
INDEX `news_posts_updated_index` (`post_updated`),
INDEX `news_posts_deleted_index` (`post_deleted`),
FULLTEXT INDEX `news_posts_fulltext` (`post_title`, `post_text`),
CONSTRAINT `news_posts_category_id_foreign`
FOREIGN KEY (`category_id`)
REFERENCES `msz_news_categories` (`category_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `news_posts_comment_section`
FOREIGN KEY (`comment_section_id`)
REFERENCES `msz_comments_categories` (`category_id`)
ON UPDATE CASCADE
ON DELETE SET NULL,
CONSTRAINT `news_posts_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_changelog_tags` (
`tag_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`tag_name` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`tag_description` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`tag_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`tag_archived` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`tag_id`),
UNIQUE INDEX `tag_name` (`tag_name`),
INDEX `tag_archived` (`tag_archived`)
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_changelog_changes` (
`change_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`change_action` INT(10) UNSIGNED NULL DEFAULT NULL,
`change_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`change_log` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`change_text` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`change_id`),
INDEX `changes_user_foreign` (`user_id`),
INDEX `changes_action_index` (`change_action`),
INDEX `changes_created_index` (`change_created`),
CONSTRAINT `changes_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_changelog_change_tags` (
`change_id` INT(10) UNSIGNED NOT NULL,
`tag_id` INT(10) UNSIGNED NOT NULL,
UNIQUE INDEX `change_tag_unique` (`change_id`, `tag_id`),
INDEX `tag_id_foreign_key` (`tag_id`),
CONSTRAINT `change_id_foreign_key`
FOREIGN KEY (`change_id`)
REFERENCES `msz_changelog_changes` (`change_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `tag_id_foreign_key`
FOREIGN KEY (`tag_id`)
REFERENCES `msz_changelog_tags` (`tag_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_forum_polls` (
`poll_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`poll_max_votes` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
`poll_expires` TIMESTAMP NULL DEFAULT NULL,
`poll_preview_results` TINYINT(3) UNSIGNED NOT NULL DEFAULT '1',
`poll_change_vote` TINYINT(3) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`poll_id`)
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_forum_polls_options` (
`option_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`poll_id` INT(10) UNSIGNED NOT NULL,
`option_text` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
PRIMARY KEY (`option_id`),
INDEX `polls_options_poll_foreign` (`poll_id`),
CONSTRAINT `polls_options_poll_foreign`
FOREIGN KEY (`poll_id`)
REFERENCES `msz_forum_polls` (`poll_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_forum_polls_answers` (
`user_id` INT(10) UNSIGNED NOT NULL,
`poll_id` INT(10) UNSIGNED NOT NULL,
`option_id` INT(10) UNSIGNED NOT NULL,
UNIQUE INDEX `polls_answers_unique` (`user_id`, `poll_id`, `option_id`),
INDEX `polls_answers_user_foreign` (`user_id`),
INDEX `polls_answers_poll_foreign` (`poll_id`),
INDEX `polls_answers_option_foreign` (`option_id`),
CONSTRAINT `polls_answers_option_foreign`
FOREIGN KEY (`option_id`)
REFERENCES `msz_forum_polls_options` (`option_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `polls_answers_poll_foreign`
FOREIGN KEY (`poll_id`)
REFERENCES `msz_forum_polls` (`poll_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `polls_answers_user_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_forum_categories` (
`forum_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`forum_order` INT(10) UNSIGNED NOT NULL DEFAULT '1',
`forum_parent` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`forum_name` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`forum_type` TINYINT(4) NOT NULL DEFAULT '0',
`forum_description` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`forum_colour` INT(10) UNSIGNED NULL DEFAULT NULL,
`forum_link` VARCHAR(255) NULL DEFAULT NULL COLLATE 'utf8mb4_bin',
`forum_link_clicks` INT(10) UNSIGNED NULL DEFAULT NULL,
`forum_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`forum_archived` TINYINT(1) NOT NULL DEFAULT '0',
`forum_hidden` TINYINT(1) NOT NULL DEFAULT '0',
`forum_count_topics` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`forum_count_posts` INT(10) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`forum_id`),
INDEX `forum_order_index` (`forum_order`),
INDEX `forum_parent_index` (`forum_parent`),
INDEX `forum_type_index` (`forum_type`)
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_forum_permissions` (
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`role_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`forum_id` INT(10) UNSIGNED NOT NULL,
`forum_perms_allow` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`forum_perms_deny` INT(10) UNSIGNED NOT NULL DEFAULT '0',
UNIQUE INDEX `forum_permissions_unique` (`user_id`, `role_id`, `forum_id`),
INDEX `forum_permissions_forum_id` (`forum_id`),
INDEX `forum_permissions_role_id` (`role_id`),
CONSTRAINT `forum_permissions_forum_id_foreign`
FOREIGN KEY (`forum_id`)
REFERENCES `msz_forum_categories` (`forum_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `forum_permissions_role_id_foreign`
FOREIGN KEY (`role_id`)
REFERENCES `msz_roles` (`role_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `forum_permissions_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_forum_topics` (
`topic_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`forum_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`poll_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`topic_type` TINYINT(4) NOT NULL DEFAULT '0',
`topic_title` VARCHAR(255) NOT NULL COLLATE 'utf8mb4_bin',
`topic_count_views` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`topic_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`topic_bumped` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`topic_deleted` TIMESTAMP NULL DEFAULT NULL,
`topic_locked` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`topic_id`),
INDEX `topics_forum_id_foreign` (`forum_id`),
INDEX `topics_user_id_foreign` (`user_id`),
INDEX `topics_type_index` (`topic_type`),
INDEX `topics_created_index` (`topic_created`),
INDEX `topics_bumped_index` (`topic_bumped`),
INDEX `topics_deleted_index` (`topic_deleted`),
INDEX `topics_locked_index` (`topic_locked`),
INDEX `posts_poll_id_foreign` (`poll_id`),
FULLTEXT INDEX `topics_fulltext` (`topic_title`),
CONSTRAINT `posts_poll_id_foreign`
FOREIGN KEY (`poll_id`)
REFERENCES `msz_forum_polls` (`poll_id`)
ON UPDATE CASCADE
ON DELETE SET NULL,
CONSTRAINT `topics_forum_id_foreign`
FOREIGN KEY (`forum_id`)
REFERENCES `msz_forum_categories` (`forum_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `topics_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_forum_topics_track` (
`user_id` INT(10) UNSIGNED NOT NULL,
`topic_id` INT(10) UNSIGNED NOT NULL,
`forum_id` INT(10) UNSIGNED NOT NULL,
`track_last_read` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
UNIQUE INDEX `topics_track_unique` (`user_id`, `topic_id`),
INDEX `topics_track_topic_id_foreign` (`topic_id`),
INDEX `topics_track_user_id_foreign` (`user_id`),
INDEX `topics_track_forum_id_foreign` (`forum_id`),
INDEX `forum_track_last_read` (`track_last_read`),
CONSTRAINT `topics_track_forum_id_foreign`
FOREIGN KEY (`forum_id`)
REFERENCES `msz_forum_categories` (`forum_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `topics_track_topic_id_foreign`
FOREIGN KEY (`topic_id`)
REFERENCES `msz_forum_topics` (`topic_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `topics_track_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE CASCADE
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
$conn->exec("
CREATE TABLE `msz_forum_posts` (
`post_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
`topic_id` INT(10) UNSIGNED NOT NULL,
`forum_id` INT(10) UNSIGNED NOT NULL,
`user_id` INT(10) UNSIGNED NULL DEFAULT NULL,
`post_ip` VARBINARY(16) NOT NULL,
`post_text` TEXT NOT NULL COLLATE 'utf8mb4_bin',
`post_parse` TINYINT(4) UNSIGNED NOT NULL DEFAULT '0',
`post_display_signature` TINYINT(4) UNSIGNED NOT NULL DEFAULT '1',
`post_created` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
`post_edited` TIMESTAMP NULL DEFAULT NULL,
`post_deleted` TIMESTAMP NULL DEFAULT NULL,
PRIMARY KEY (`post_id`),
INDEX `posts_topic_id_foreign` (`topic_id`),
INDEX `posts_forum_id_foreign` (`forum_id`),
INDEX `posts_user_id_foreign` (`user_id`),
INDEX `posts_created_index` (`post_created`),
INDEX `posts_deleted_index` (`post_deleted`),
INDEX `posts_parse_index` (`post_parse`),
INDEX `posts_edited_index` (`post_edited`),
INDEX `posts_display_signature_index` (`post_display_signature`),
INDEX `posts_ip_index` (`post_ip`),
FULLTEXT INDEX `posts_fulltext` (`post_text`),
CONSTRAINT `posts_forum_id_foreign`
FOREIGN KEY (`forum_id`)
REFERENCES `msz_forum_categories` (`forum_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `posts_topic_id_foreign`
FOREIGN KEY (`topic_id`)
REFERENCES `msz_forum_topics` (`topic_id`)
ON UPDATE CASCADE
ON DELETE CASCADE,
CONSTRAINT `posts_user_id_foreign`
FOREIGN KEY (`user_id`)
REFERENCES `msz_users` (`user_id`)
ON UPDATE CASCADE
ON DELETE SET NULL
) COLLATE='utf8mb4_bin' ENGINE=InnoDB;
");
}
function migrate_down(PDO $conn): void
{
$conn->exec("DROP TABLE `msz_forum_posts`");
$conn->exec("DROP TABLE `msz_forum_topics_track`");
$conn->exec("DROP TABLE `msz_forum_topics`");
$conn->exec("DROP TABLE `msz_forum_permissions`");
$conn->exec("DROP TABLE `msz_forum_categories`");
$conn->exec("DROP TABLE `msz_forum_polls_answers`");
$conn->exec("DROP TABLE `msz_forum_polls_options`");
$conn->exec("DROP TABLE `msz_forum_polls`");
$conn->exec("DROP TABLE `msz_changelog_change_tags`");
$conn->exec("DROP TABLE `msz_changelog_changes`");
$conn->exec("DROP TABLE `msz_changelog_tags`");
$conn->exec("DROP TABLE `msz_news_posts`");
$conn->exec("DROP TABLE `msz_news_categories`");
$conn->exec("DROP TABLE `msz_comments_votes`");
$conn->exec("DROP TABLE `msz_comments_posts`");
$conn->exec("DROP TABLE `msz_comments_categories`");
$conn->exec("DROP TABLE `msz_login_attempts`");
$conn->exec("DROP TABLE `msz_auth_tfa`");
$conn->exec("DROP TABLE `msz_audit_log`");
$conn->exec("DROP TABLE `msz_permissions`");
$conn->exec("DROP TABLE `msz_sessions`");
$conn->exec("DROP TABLE `msz_user_warnings`");
$conn->exec("DROP TABLE `msz_user_relations`");
$conn->exec("DROP TABLE `msz_users_password_resets`");
$conn->exec("DROP TABLE `msz_user_roles`");
$conn->exec("DROP TABLE `msz_users`");
$conn->exec("DROP TABLE `msz_roles`");
$conn->exec("DROP TABLE `msz_ip_blacklist`");
}