<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20180813223121 extends AbstractMigration
{
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf('mysql' !== $this->connection->getDatabasePlatform()->getName(), 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('
CREATE TABLE feed_join_user (
feed_id INT NOT NULL,
user_id INT NOT NULL,
INDEX IDX_5459780C51A5BC03 (feed_id),
INDEX IDX_5459780CA76ED395 (user_id),
PRIMARY KEY(feed_id, user_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE feed_join_group (
feed_id INT NOT NULL,
group_id INT NOT NULL,
INDEX IDX_6BAF3B7451A5BC03 (feed_id),
INDEX IDX_6BAF3B74FE54D947 (group_id),
PRIMARY KEY(feed_id, group_id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$this->addSql('
CREATE TABLE feed_participant (
id INT AUTO_INCREMENT NOT NULL,
feed_id INT DEFAULT NULL,
user_id INT DEFAULT NULL,
viewed TINYINT(1) NOT NULL,
unread TINYINT(1) NOT NULL,
INDEX IDX_C3111A5251A5BC03 (feed_id),
INDEX IDX_C3111A52A76ED395 (user_id),
PRIMARY KEY(id)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci ENGINE = InnoDB
');
$stmt = $this->connection->prepare('SELECT id, administrators, administrators_groups, participants FROM feeds');
$stmt->execute();
$all = [];
while ($row = $stmt->fetch(\PDO::FETCH_OBJ)) {
$users = $row->administrators ? explode(',', $row->administrators) : [];
$groups = $row->administrators_groups ? explode(',', $row->administrators_groups) : [];
$participants = $row->participants ? unserialize($row->participants) : [];
if ((\count($users) && \in_array('*', $users))
|| (\count($groups) && \in_array('*', $groups))
) {
$all[$row->id] = [
'users' => \in_array('*', $users),
'groups' => \in_array('*', $groups),
];
}
if (!\in_array('*', $users)) {
foreach ($users as $user) {
$this->addSql('INSERT INTO feed_join_user (feed_id, user_id) VALUES (:feed_id, :user_id)', [
'feed_id' => $row->id,
'user_id' => $user,
]);
}
}
if (!\in_array('*', $groups)) {
foreach ($groups as $group) {
$this->addSql('INSERT INTO feed_join_group (feed_id, group_id) VALUES (:feed_id, :group_id)', [
'feed_id' => $row->id,
'group_id' => $group,
]);
}
}
if ($participants && \count($participants)) {
foreach ($participants as $key => $value) {
$this->addSql('INSERT INTO feed_participant (feed_id, user_id, viewed, unread) VALUES (:feed_id, :user_id, :viewed, :unread)', [
'feed_id' => $row->id,
'user_id' => $key,
'viewed' => (int) ($value['viewed'] ?? true),
'unread' => (int) ($value['unread'] ?? true),
]);
}
}
}
$this->addSql('RENAME TABLE feeds TO feed');
$this->addSql('ALTER TABLE feed ENGINE = InnoDB');
$this->addSql('ALTER TABLE feed CHARACTER SET = utf8mb4');
$this->addSql('
ALTER TABLE feed
DROP participants,
DROP administrators,
DROP administrators_groups,
ADD allow_all_users TINYINT(1) NOT NULL,
ADD allow_all_groups TINYINT(1) NOT NULL,
CHANGE administrators_id user_id INT DEFAULT NULL,
CHANGE tags_id tag_id INT DEFAULT NULL,
CHANGE title name VARCHAR(255) NOT NULL,
CHANGE date_added created_at DATETIME NOT NULL,
CHANGE last_modified modified_at DATETIME NOT NULL
');
$this->addSql('DROP INDEX idx_title ON feed');
$this->addSql('DROP INDEX idx_tags_id ON feed');
$this->addSql('DROP INDEX idx_administrators_id ON feed');
$this->addSql('CREATE INDEX idx_name ON feed (name)');
$this->addSql('CREATE INDEX IDX_234044ABA76ED395 ON feed (user_id)');
$this->addSql('CREATE INDEX IDX_234044ABBAD26311 ON feed (tag_id)');
foreach ($all as $feedId => $options) {
$this->addSql('UPDATE feed SET allow_all_users = :allowAllUsers, allow_all_groups = :allowAllGroups WHERE id = :id', [
'id' => $feedId,
'allowAllUsers' => (int) ($options['users'] ?: false),
'allowAllGroups' => (int) ($options['groups'] ?: false),
]);
}
$this->addSql('RENAME TABLE feeds_comments TO feed_comment');
$this->addSql('ALTER TABLE feed_comment ENGINE = InnoDB');
$this->addSql('ALTER TABLE feed_comment CHARACTER SET = utf8mb4');
$this->addSql('DELETE FROM feed_comment WHERE body IS NULL OR body = \'\'');
$this->addSql('
ALTER TABLE feed_comment
CHANGE feeds_id feed_id INT DEFAULT NULL,
CHANGE administrators_id user_id INT DEFAULT NULL,
CHANGE body body LONGTEXT NOT NULL,
CHANGE date_added created_at DATETIME NOT NULL,
CHANGE last_modified modified_at DATETIME NOT NULL
');
$this->addSql('DROP INDEX idx_feeds_id ON feed_comment');
$this->addSql('DROP INDEX idx_administrators_id ON feed_comment');
$this->addSql('CREATE INDEX IDX_2E66461951A5BC03 ON feed_comment (feed_id)');
$this->addSql('CREATE INDEX IDX_2E664619A76ED395 ON feed_comment (user_id)');
$this->addSql('RENAME TABLE feeds_likes TO feed_confirm');
$this->addSql('ALTER TABLE feed_confirm ENGINE = InnoDB');
$this->addSql('ALTER TABLE feed_confirm CHARACTER SET = utf8mb4');
$this->addSql('
ALTER TABLE feed_confirm
CHANGE feeds_id feed_id INT NOT NULL,
CHANGE administrators_id user_id INT NOT NULL
');
$this->addSql('DROP INDEX idx_feeds_id ON feed_confirm');
$this->addSql('DROP INDEX idx_administrators_id ON feed_confirm');
$this->addSql('CREATE INDEX IDX_35C1B73151A5BC03 ON feed_confirm (feed_id)');
$this->addSql('CREATE INDEX IDX_35C1B731A76ED395 ON feed_confirm (user_id)');
$this->addSql('RENAME TABLE feeds_tags TO feed_tag');
$this->addSql('ALTER TABLE feed_tag ENGINE = InnoDB');
$this->addSql('ALTER TABLE feed_tag CHARACTER SET = utf8mb4');
$this->addSql('
ALTER TABLE feed_tag
CHANGE name name VARCHAR(255) NOT NULL,
CHANGE color color VARCHAR(6) DEFAULT NULL
');
$this->addSql('UPDATE feed SET user_id = NULL WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('UPDATE feed SET tag_id = NULL WHERE tag_id NOT IN (SELECT id FROM feed_tag)');
$this->addSql('DELETE FROM feed_comment WHERE feed_id NOT IN (SELECT id FROM feed)');
$this->addSql('UPDATE feed_comment SET user_id = NULL WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM feed_confirm WHERE feed_id NOT IN (SELECT id FROM feed)');
$this->addSql('DELETE FROM feed_confirm WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM feed_join_user WHERE feed_id NOT IN (SELECT id FROM feed)');
$this->addSql('DELETE FROM feed_join_user WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('DELETE FROM feed_join_group WHERE feed_id NOT IN (SELECT id FROM feed)');
$this->addSql('DELETE FROM feed_join_group WHERE group_id NOT IN (SELECT id FROM user_group)');
$this->addSql('DELETE FROM feed_participant WHERE feed_id NOT IN (SELECT id FROM feed)');
$this->addSql('DELETE FROM feed_participant WHERE user_id NOT IN (SELECT id FROM user)');
$this->addSql('ALTER TABLE feed ADD CONSTRAINT FK_234044ABA76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE feed ADD CONSTRAINT FK_234044ABBAD26311 FOREIGN KEY (tag_id) REFERENCES feed_tag (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE feed_comment ADD CONSTRAINT FK_2E66461951A5BC03 FOREIGN KEY (feed_id) REFERENCES feed (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE feed_comment ADD CONSTRAINT FK_2E664619A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE feed_confirm ADD CONSTRAINT FK_2CF4ABE451A5BC03 FOREIGN KEY (feed_id) REFERENCES feed (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE feed_confirm ADD CONSTRAINT FK_2CF4ABE4A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE feed_join_user ADD CONSTRAINT FK_D043D1E51A5BC03 FOREIGN KEY (feed_id) REFERENCES feed (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE feed_join_user ADD CONSTRAINT FK_D043D1EA76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE feed_join_group ADD CONSTRAINT FK_984F177951A5BC03 FOREIGN KEY (feed_id) REFERENCES feed (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE feed_join_group ADD CONSTRAINT FK_984F1779FE54D947 FOREIGN KEY (group_id) REFERENCES user_group (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE feed_participant ADD CONSTRAINT FK_C3111A5251A5BC03 FOREIGN KEY (feed_id) REFERENCES feed (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE feed_participant ADD CONSTRAINT FK_C3111A52A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf('mysql' !== $this->connection->getDatabasePlatform()->getName(), 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE feed_participant DROP FOREIGN KEY FK_C3111A52A76ED395');
$this->addSql('ALTER TABLE feed_participant DROP FOREIGN KEY FK_C3111A5251A5BC03');
$this->addSql('ALTER TABLE feed_join_group DROP FOREIGN KEY FK_984F1779FE54D947');
$this->addSql('ALTER TABLE feed_join_group DROP FOREIGN KEY FK_984F177951A5BC03');
$this->addSql('ALTER TABLE feed_join_user DROP FOREIGN KEY FK_D043D1EA76ED395');
$this->addSql('ALTER TABLE feed_join_user DROP FOREIGN KEY FK_D043D1E51A5BC03');
$this->addSql('ALTER TABLE feed_confirm DROP FOREIGN KEY FK_2CF4ABE4A76ED395');
$this->addSql('ALTER TABLE feed_confirm DROP FOREIGN KEY FK_2CF4ABE451A5BC03');
$this->addSql('ALTER TABLE feed_comment DROP FOREIGN KEY FK_2E664619A76ED395');
$this->addSql('ALTER TABLE feed_comment DROP FOREIGN KEY FK_2E66461951A5BC03');
$this->addSql('ALTER TABLE feed DROP FOREIGN KEY FK_234044ABBAD26311');
$this->addSql('ALTER TABLE feed DROP FOREIGN KEY FK_234044ABA76ED395');
$this->addSql('RENAME TABLE feed TO feeds');
$this->addSql('ALTER TABLE feeds ENGINE = MyISAM');
$this->addSql('ALTER TABLE feeds CHARACTER SET = latin1');
$this->addSql('
ALTER TABLE feeds
ADD administrators TEXT DEFAULT NULL AFTER administrators_id,
ADD administrators_groups TEXT DEFAULT NULL AFTER administrators,
ADD participants LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:array)\' AFTER administrators_groups,
CHANGE user_id administrators_id INT NOT NULL,
CHANGE tag_id tags_id INT NOT NULL,
CHANGE name title VARCHAR(255) DEFAULT NULL,
CHANGE created_at date_added DATETIME DEFAULT NULL,
CHANGE modified_at last_modified DATETIME DEFAULT NULL
');
$this->addSql('UPDATE feeds SET administrators = \'*\' WHERE allow_all_users = 1');
$this->addSql('UPDATE feeds SET administrators_groups = \'*\' WHERE allow_all_groups = 1');
$this->addSql('
ALTER TABLE feeds
DROP allow_all_users,
DROP allow_all_groups
');
$this->addSql('DROP INDEX idx_name ON feeds');
$this->addSql('DROP INDEX IDX_234044ABA76ED395 ON feeds');
$this->addSql('DROP INDEX IDX_234044ABBAD26311 ON feeds');
$this->addSql('CREATE INDEX idx_title ON feeds (title)');
$this->addSql('CREATE INDEX idx_tags_id ON feeds (tags_id)');
$this->addSql('CREATE INDEX idx_administrators_id ON feeds (administrators_id)');
$stmt = $this->connection->prepare('SELECT * FROM feed_participant');
$stmt->execute();
$feeds = [];
while ($row = $stmt->fetch(\PDO::FETCH_OBJ)) {
$feeds[$row->feed_id][] = [
$row->user_id = [
'viewed' => $row->viewed,
'unread' => $row->unread,
],
];
}
foreach ($feeds as $key => $value) {
$participants = serialize($value);
$this->addSql('UPDATE feeds SET participants = :participants WHERE id = :id', [
'participants' => $participants,
'id' => $key,
]);
}
$this->addSql('DROP TABLE feed_participant');
$stmt = $this->connection->prepare('SELECT * FROM feed_join_user');
$stmt->execute();
$feeds = [];
while ($row = $stmt->fetch(\PDO::FETCH_OBJ)) {
$feeds[$row->feed_id][] = $row->user_id;
}
foreach ($feeds as $key => $value) {
$users = implode(',', $value);
$this->addSql('UPDATE feeds SET administrators = :administrators WHERE id = :id', [
'administrators' => $users,
'id' => $key,
]);
}
$this->addSql('DROP TABLE feed_join_user');
$stmt = $this->connection->prepare('SELECT * FROM feed_join_group');
$stmt->execute();
$feeds = [];
while ($row = $stmt->fetch(\PDO::FETCH_OBJ)) {
$feeds[$row->feed_id][] = $row->group_id;
}
foreach ($feeds as $key => $value) {
$groups = implode(',', $value);
$this->addSql('UPDATE feeds SET administrators_groups = :administrators_groups WHERE id = :id', [
'administrators_groups' => $groups,
'id' => $key,
]);
}
$this->addSql('DROP TABLE feed_join_group');
$this->addSql('RENAME TABLE feed_comment TO feeds_comments');
$this->addSql('ALTER TABLE feeds_comments ENGINE = InnoDB');
$this->addSql('ALTER TABLE feeds_comments CHARACTER SET = utf8mb4');
$this->addSql('
ALTER TABLE feeds_comments
CHANGE feed_id feeds_id INT NOT NULL,
CHANGE user_id administrators_id INT NOT NULL,
CHANGE body body LONGTEXT DEFAULT NULL,
CHANGE created_at date_added DATETIME DEFAULT NULL,
CHANGE modified_at last_modified DATETIME DEFAULT NULL
');
$this->addSql('DROP INDEX IDX_2E66461951A5BC03 ON feeds_comments');
$this->addSql('DROP INDEX IDX_2E664619A76ED395 ON feeds_comments');
$this->addSql('CREATE INDEX idx_feeds_id ON feeds_comments (feeds_id)');
$this->addSql('CREATE INDEX idx_administrators_id ON feeds_comments (administrators_id)');
$this->addSql('RENAME TABLE feed_confirm TO feeds_likes');
$this->addSql('ALTER TABLE feeds_likes ENGINE = InnoDB');
$this->addSql('ALTER TABLE feeds_likes CHARACTER SET = utf8mb4');
$this->addSql('
ALTER TABLE feeds_likes
CHANGE feed_id feeds_id INT NOT NULL,
CHANGE user_id administrators_id INT NOT NULL
');
$this->addSql('DROP INDEX IDX_35C1B73151A5BC03 ON feeds_likes');
$this->addSql('DROP INDEX IDX_35C1B731A76ED395 ON feeds_likes');
$this->addSql('CREATE INDEX idx_feeds_id ON feeds_likes (feeds_id)');
$this->addSql('CREATE INDEX idx_administrators_id ON feeds_likes (administrators_id)');
$this->addSql('RENAME TABLE feed_tag TO feeds_tags');
$this->addSql('ALTER TABLE feeds_tags ENGINE = MyISAM');
$this->addSql('ALTER TABLE feeds_tags CHARACTER SET = latin1');
$this->addSql('
ALTER TABLE feeds_tags
CHANGE name name VARCHAR(64) NOT NULL,
CHANGE color color VARCHAR(6) DEFAULT NULL
');
}
}