<?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 Version20251006183457 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE project_participant ADD project_id INT DEFAULT NULL');
$this->addSql('ALTER TABLE project_participant ADD CONSTRAINT FK_1F509CEA166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
$this->addSql('CREATE INDEX IDX_1F509CEA166D1F9C ON project_participant (project_id)');
// add project creator to project_join_user if missing
$this->addSql('
INSERT INTO project_join_user (project_id, user_id)
SELECT p.id, p.user_id
FROM project p
LEFT JOIN project_join_user pu ON pu.project_id = p.id AND pu.user_id = p.user_id
WHERE p.user_id IS NOT NULL
AND pu.user_id IS NULL
AND p.user_id IN (SELECT id FROM user)
');
// create project users from "allow all" flags
$this->addSql('
INSERT INTO project_join_user (project_id, user_id)
SELECT DISTINCT p.id, u.id
FROM project p
JOIN user u ON u.enabled = 1
LEFT JOIN project_join_user pu ON pu.project_id = p.id AND pu.user_id = u.id
WHERE (p.allow_all_users = 1 OR p.allow_all_groups = 1)
AND pu.user_id IS NULL
');
// expand project groups to project users (so participants-from-users covers them)
$this->addSql('
INSERT INTO project_join_user (project_id, user_id)
SELECT DISTINCT pg.project_id, ug.user_id
FROM project_join_group pg
JOIN user_join_group ug ON ug.group_id = pg.group_id
JOIN user u ON u.id = ug.user_id
LEFT JOIN project_join_user pu
ON pu.project_id = pg.project_id AND pu.user_id = ug.user_id
WHERE pu.user_id IS NULL
');
// ensure project_participant rows exist for all project_join_user rows (item_id = NULL)
$this->addSql('
INSERT INTO project_participant (project_id, user_id, viewed, unread)
SELECT DISTINCT pu.project_id, pu.user_id, 1, 0
FROM project_join_user pu
JOIN user u ON u.id = pu.user_id
LEFT JOIN project_participant pp
ON pp.project_id = pu.project_id AND pp.user_id = pu.user_id AND pp.item_id IS NULL
WHERE pp.user_id IS NULL
');
// ensure existing item participant rows also carry their project_id
$this->addSql('
UPDATE project_participant pp
JOIN project_item i ON i.id = pp.item_id
SET pp.project_id = i.project_id
WHERE pp.project_id IS NULL AND pp.item_id IS NOT NULL
');
// create project participants from explicit project users
$this->addSql('
INSERT INTO project_participant (project_id, user_id, viewed, unread)
SELECT DISTINCT pu.project_id, pu.user_id, 1, 0
FROM project_join_user pu
JOIN user u ON u.id = pu.user_id
LEFT JOIN project_participant pp
ON pp.project_id = pu.project_id AND pp.user_id = pu.user_id AND pp.item_id IS NULL
WHERE pp.user_id IS NULL
');
// create project participants from project groups (users in those groups)
$this->addSql('
INSERT INTO project_participant (project_id, user_id, viewed, unread)
SELECT DISTINCT pg.project_id, ug.user_id, 1, 0
FROM project_join_group pg
JOIN user_join_group ug ON ug.group_id = pg.group_id
JOIN user u ON u.id = ug.user_id
LEFT JOIN project_participant pp
ON pp.project_id = pg.project_id AND pp.user_id = ug.user_id AND pp.item_id IS NULL
WHERE pp.user_id IS NULL
');
// create project participants from "allow all" flags
$this->addSql('
INSERT INTO project_participant (project_id, user_id, viewed, unread)
SELECT DISTINCT p.id, u.id, 1, 0
FROM project p
JOIN user u ON u.enabled = 1
LEFT JOIN project_participant pp
ON pp.project_id = p.id AND pp.user_id = u.id AND pp.item_id IS NULL
WHERE (p.allow_all_users = 1 OR p.allow_all_groups = 1)
AND pp.user_id IS NULL
');
// remove duplicate project participants rows
$this->addSql('
DELETE pp1 FROM project_participant pp1
JOIN project_participant pp2
ON IFNULL(pp1.item_id,0)=IFNULL(pp2.item_id,0)
AND IFNULL(pp1.project_id,0)=IFNULL(pp2.project_id,0)
AND pp1.user_id=pp2.user_id
WHERE pp1.id > pp2.id;
');
// for project items with allow_all_users=1, include project participants as assignees and item participants
// add assignees to project_item_join_user
$this->addSql('
INSERT INTO project_item_join_user (item_id, user_id)
SELECT DISTINCT i.id, pp.user_id
FROM project_item i
JOIN project_participant pp ON pp.project_id = i.project_id AND pp.item_id IS NULL
LEFT JOIN project_item_join_user pij ON pij.item_id = i.id AND pij.user_id = pp.user_id
WHERE i.allow_all_users = 1
AND pij.user_id IS NULL
');
// add project item participants mirroring those users
$this->addSql('
INSERT INTO project_participant (project_id, item_id, user_id, viewed, unread)
SELECT DISTINCT i.project_id, i.id, pp.user_id, 1, 0
FROM project_item i
JOIN project_participant pp ON pp.project_id = i.project_id AND pp.item_id IS NULL
LEFT JOIN project_participant existing
ON existing.item_id = i.id AND existing.user_id = pp.user_id
WHERE i.allow_all_users = 1
AND existing.user_id IS NULL
');
// add feed creator to feed_join_user if missing
$this->addSql('
INSERT INTO feed_join_user (feed_id, user_id)
SELECT f.id, f.user_id
FROM feed f
LEFT JOIN feed_join_user fu ON fu.feed_id = f.id AND fu.user_id = f.user_id
WHERE f.user_id IS NOT NULL
AND fu.user_id IS NULL
AND f.user_id IN (SELECT id FROM user)
');
// create feed users from "allow all" flags
$this->addSql('
INSERT INTO feed_join_user (feed_id, user_id)
SELECT DISTINCT f.id, u.id
FROM feed f
JOIN user u ON u.enabled = 1
LEFT JOIN feed_join_user fu ON fu.feed_id = f.id AND fu.user_id = u.id
WHERE (f.allow_all_users = 1 OR f.allow_all_groups = 1)
AND fu.user_id IS NULL
');
// expand feed groups to feed users (so participants-from-users covers them)
$this->addSql('
INSERT INTO feed_join_user (feed_id, user_id)
SELECT DISTINCT fg.feed_id, ug.user_id
FROM feed_join_group fg
JOIN user_join_group ug ON ug.group_id = fg.group_id
JOIN user u ON u.id = ug.user_id
LEFT JOIN feed_join_user fu
ON fu.feed_id = fg.feed_id AND fu.user_id = ug.user_id
WHERE fu.user_id IS NULL
');
// create feed participants from "allow all" flags
$this->addSql('
INSERT INTO feed_participant (feed_id, user_id, viewed, unread)
SELECT DISTINCT f.id, u.id, 1, 0
FROM feed f
JOIN user u ON u.enabled = 1
LEFT JOIN feed_participant fp
ON fp.feed_id = f.id AND fp.user_id = u.id
WHERE (f.allow_all_users = 1 OR f.allow_all_groups = 1)
AND fp.user_id IS NULL
');
// create feed participants from explicit feed users
$this->addSql('
INSERT INTO feed_participant (feed_id, user_id, viewed, unread)
SELECT DISTINCT fu.feed_id, fu.user_id, 1, 0
FROM feed_join_user fu
JOIN user u ON u.id = fu.user_id
LEFT JOIN feed_participant fp
ON fp.feed_id = fu.feed_id AND fp.user_id = fu.user_id
WHERE fp.user_id IS NULL
');
// create feed participants from feed groups (users in those groups)
$this->addSql('
INSERT INTO feed_participant (feed_id, user_id, viewed, unread)
SELECT DISTINCT fg.feed_id, ug.user_id, 1, 0
FROM feed_join_group fg
JOIN user_join_group ug ON ug.group_id = fg.group_id
JOIN user u ON u.id = ug.user_id
LEFT JOIN feed_participant fp
ON fp.feed_id = fg.feed_id AND fp.user_id = ug.user_id
WHERE fp.user_id IS NULL
');
// remove duplicate feed participants rows
$this->addSql('
DELETE fp1 FROM feed_participant fp1
JOIN feed_participant fp2
ON fp1.feed_id = fp2.feed_id AND fp1.user_id = fp2.user_id
WHERE fp1.id > fp2.id;
');
$this->addSql('DROP TABLE feed_confirm');
$this->addSql('DROP TABLE feed_join_group');
$this->addSql('DROP TABLE project_join_group');
$this->addSql('ALTER TABLE feed DROP allow_all_users, DROP allow_all_groups');
$this->addSql('ALTER TABLE project DROP allow_all_users, DROP allow_all_groups');
$this->addSql('ALTER TABLE project_item DROP allow_all_users');
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('CREATE TABLE feed_confirm (feed_id INT NOT NULL, user_id INT NOT NULL, INDEX IDX_35C1B73151A5BC03 (feed_id), INDEX IDX_35C1B731A76ED395 (user_id), PRIMARY KEY(feed_id, user_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_general_ci` ENGINE = InnoDB COMMENT = \'\' ');
$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 COMMENT = \'\' ');
$this->addSql('CREATE TABLE project_join_group (project_id INT NOT NULL, group_id INT NOT NULL, INDEX IDX_FC244C5A166D1F9C (project_id), INDEX IDX_FC244C5AFE54D947 (group_id), PRIMARY KEY(project_id, group_id)) DEFAULT CHARACTER SET utf8mb4 COLLATE `utf8mb4_unicode_ci` ENGINE = InnoDB COMMENT = \'\' ');
$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_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 project_join_group ADD CONSTRAINT FK_FC244C5A166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE project_join_group ADD CONSTRAINT FK_FC244C5AFE54D947 FOREIGN KEY (group_id) REFERENCES user_group (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE feed ADD allow_all_users TINYINT(1) NOT NULL, ADD allow_all_groups TINYINT(1) NOT NULL');
$this->addSql('ALTER TABLE project ADD allow_all_users TINYINT(1) NOT NULL, ADD allow_all_groups TINYINT(1) NOT NULL');
$this->addSql('ALTER TABLE project_item ADD allow_all_users TINYINT(1) NOT NULL');
$this->addSql('ALTER TABLE project_participant DROP FOREIGN KEY FK_1F509CEA166D1F9C');
$this->addSql('DROP INDEX IDX_1F509CEA166D1F9C ON project_participant');
$this->addSql('ALTER TABLE project_participant DROP project_id');
}
}