migrations/Version20251006183457.php line 1

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace DoctrineMigrations;
  4. use Doctrine\DBAL\Schema\Schema;
  5. use Doctrine\Migrations\AbstractMigration;
  6. /**
  7.  * Auto-generated Migration: Please modify to your needs!
  8.  */
  9. final class Version20251006183457 extends AbstractMigration
  10. {
  11.     public function getDescription(): string
  12.     {
  13.         return '';
  14.     }
  15.     public function up(Schema $schema): void
  16.     {
  17.         // this up() migration is auto-generated, please modify it to your needs
  18.         $this->addSql('ALTER TABLE project_participant ADD project_id INT DEFAULT NULL');
  19.         $this->addSql('ALTER TABLE project_participant ADD CONSTRAINT FK_1F509CEA166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
  20.         $this->addSql('CREATE INDEX IDX_1F509CEA166D1F9C ON project_participant (project_id)');
  21.         // add project creator to project_join_user if missing
  22.         $this->addSql('
  23.             INSERT INTO project_join_user (project_id, user_id)
  24.             SELECT p.id, p.user_id
  25.             FROM project p
  26.             LEFT JOIN project_join_user pu ON pu.project_id = p.id AND pu.user_id = p.user_id
  27.             WHERE p.user_id IS NOT NULL
  28.               AND pu.user_id IS NULL
  29.               AND p.user_id IN (SELECT id FROM user)
  30.         ');
  31.         // create project users from "allow all" flags
  32.         $this->addSql('
  33.             INSERT INTO project_join_user (project_id, user_id)
  34.             SELECT DISTINCT p.id, u.id
  35.             FROM project p
  36.                 JOIN user u ON u.enabled = 1
  37.                 LEFT JOIN project_join_user pu ON pu.project_id = p.id AND pu.user_id = u.id
  38.             WHERE (p.allow_all_users = 1 OR p.allow_all_groups = 1)
  39.                 AND pu.user_id IS NULL
  40.         ');
  41.         // expand project groups to project users (so participants-from-users covers them)
  42.         $this->addSql('
  43.             INSERT INTO project_join_user (project_id, user_id)
  44.             SELECT DISTINCT pg.project_id, ug.user_id
  45.             FROM project_join_group pg
  46.                 JOIN user_join_group ug ON ug.group_id = pg.group_id
  47.                 JOIN user u ON u.id = ug.user_id
  48.                 LEFT JOIN project_join_user pu
  49.                     ON pu.project_id = pg.project_id AND pu.user_id = ug.user_id
  50.             WHERE pu.user_id IS NULL
  51.         ');
  52.         // ensure project_participant rows exist for all project_join_user rows (item_id = NULL)
  53.         $this->addSql('
  54.             INSERT INTO project_participant (project_id, user_id, viewed, unread)
  55.             SELECT DISTINCT pu.project_id, pu.user_id, 1, 0
  56.             FROM project_join_user pu
  57.                 JOIN user u ON u.id = pu.user_id
  58.                 LEFT JOIN project_participant pp
  59.                     ON pp.project_id = pu.project_id AND pp.user_id = pu.user_id AND pp.item_id IS NULL
  60.             WHERE pp.user_id IS NULL
  61.         ');
  62.         // ensure existing item participant rows also carry their project_id
  63.         $this->addSql('
  64.             UPDATE project_participant pp
  65.                 JOIN project_item i ON i.id = pp.item_id
  66.             SET pp.project_id = i.project_id
  67.             WHERE pp.project_id IS NULL AND pp.item_id IS NOT NULL
  68.         ');
  69.         // create project participants from explicit project users
  70.         $this->addSql('
  71.             INSERT INTO project_participant (project_id, user_id, viewed, unread)
  72.             SELECT DISTINCT pu.project_id, pu.user_id, 1, 0
  73.             FROM project_join_user pu
  74.                 JOIN user u ON u.id = pu.user_id
  75.                 LEFT JOIN project_participant pp
  76.                     ON pp.project_id = pu.project_id AND pp.user_id = pu.user_id AND pp.item_id IS NULL
  77.             WHERE pp.user_id IS NULL
  78.         ');
  79.         // create project participants from project groups (users in those groups)
  80.         $this->addSql('
  81.             INSERT INTO project_participant (project_id, user_id, viewed, unread)
  82.             SELECT DISTINCT pg.project_id, ug.user_id, 1, 0
  83.             FROM project_join_group pg
  84.                 JOIN user_join_group ug ON ug.group_id = pg.group_id
  85.                 JOIN user u ON u.id = ug.user_id
  86.                 LEFT JOIN project_participant pp
  87.                     ON pp.project_id = pg.project_id AND pp.user_id = ug.user_id AND pp.item_id IS NULL
  88.             WHERE pp.user_id IS NULL
  89.         ');
  90.         // create project participants from "allow all" flags
  91.         $this->addSql('
  92.             INSERT INTO project_participant (project_id, user_id, viewed, unread)
  93.             SELECT DISTINCT p.id, u.id, 1, 0
  94.             FROM project p
  95.                JOIN user u ON u.enabled = 1
  96.                LEFT JOIN project_participant pp
  97.                     ON pp.project_id = p.id AND pp.user_id = u.id AND pp.item_id IS NULL
  98.             WHERE (p.allow_all_users = 1 OR p.allow_all_groups = 1)
  99.                 AND pp.user_id IS NULL
  100.         ');
  101.         // remove duplicate project participants rows
  102.         $this->addSql('
  103.             DELETE pp1 FROM project_participant pp1
  104.                 JOIN project_participant pp2
  105.                     ON IFNULL(pp1.item_id,0)=IFNULL(pp2.item_id,0)
  106.                         AND IFNULL(pp1.project_id,0)=IFNULL(pp2.project_id,0)
  107.                         AND pp1.user_id=pp2.user_id
  108.             WHERE pp1.id > pp2.id;
  109.         ');
  110.         // for project items with allow_all_users=1, include project participants as assignees and item participants
  111.         // add assignees to project_item_join_user
  112.         $this->addSql('
  113.             INSERT INTO project_item_join_user (item_id, user_id)
  114.             SELECT DISTINCT i.id, pp.user_id
  115.             FROM project_item i
  116.                 JOIN project_participant pp ON pp.project_id = i.project_id AND pp.item_id IS NULL
  117.                 LEFT JOIN project_item_join_user pij ON pij.item_id = i.id AND pij.user_id = pp.user_id
  118.             WHERE i.allow_all_users = 1
  119.                 AND pij.user_id IS NULL
  120.         ');
  121.         // add project item participants mirroring those users
  122.         $this->addSql('
  123.             INSERT INTO project_participant (project_id, item_id, user_id, viewed, unread)
  124.             SELECT DISTINCT i.project_id, i.id, pp.user_id, 1, 0
  125.             FROM project_item i
  126.                 JOIN project_participant pp ON pp.project_id = i.project_id AND pp.item_id IS NULL
  127.                 LEFT JOIN project_participant existing
  128.                     ON existing.item_id = i.id AND existing.user_id = pp.user_id
  129.             WHERE i.allow_all_users = 1
  130.                 AND existing.user_id IS NULL
  131.         ');
  132.         // add feed creator to feed_join_user if missing
  133.         $this->addSql('
  134.             INSERT INTO feed_join_user (feed_id, user_id)
  135.             SELECT f.id, f.user_id
  136.             FROM feed f
  137.             LEFT JOIN feed_join_user fu ON fu.feed_id = f.id AND fu.user_id = f.user_id
  138.             WHERE f.user_id IS NOT NULL
  139.               AND fu.user_id IS NULL
  140.               AND f.user_id IN (SELECT id FROM user)
  141.         ');
  142.         // create feed users from "allow all" flags
  143.         $this->addSql('
  144.             INSERT INTO feed_join_user (feed_id, user_id)
  145.             SELECT DISTINCT f.id, u.id
  146.             FROM feed f
  147.                 JOIN user u ON u.enabled = 1
  148.                 LEFT JOIN feed_join_user fu ON fu.feed_id = f.id AND fu.user_id = u.id
  149.             WHERE (f.allow_all_users = 1 OR f.allow_all_groups = 1)
  150.                 AND fu.user_id IS NULL
  151.         ');
  152.         // expand feed groups to feed users (so participants-from-users covers them)
  153.         $this->addSql('
  154.             INSERT INTO feed_join_user (feed_id, user_id)
  155.             SELECT DISTINCT fg.feed_id, ug.user_id
  156.             FROM feed_join_group fg
  157.                 JOIN user_join_group ug ON ug.group_id = fg.group_id
  158.                 JOIN user u ON u.id = ug.user_id
  159.                 LEFT JOIN feed_join_user fu
  160.                     ON fu.feed_id = fg.feed_id AND fu.user_id = ug.user_id
  161.             WHERE fu.user_id IS NULL
  162.         ');
  163.         // create feed participants from "allow all" flags
  164.         $this->addSql('
  165.             INSERT INTO feed_participant (feed_id, user_id, viewed, unread)
  166.             SELECT DISTINCT f.id, u.id, 1, 0
  167.             FROM feed f
  168.                 JOIN user u ON u.enabled = 1
  169.                 LEFT JOIN feed_participant fp
  170.                     ON fp.feed_id = f.id AND fp.user_id = u.id
  171.             WHERE (f.allow_all_users = 1 OR f.allow_all_groups = 1)
  172.                 AND fp.user_id IS NULL
  173.         ');
  174.         // create feed participants from explicit feed users
  175.         $this->addSql('
  176.             INSERT INTO feed_participant (feed_id, user_id, viewed, unread)
  177.             SELECT DISTINCT fu.feed_id, fu.user_id, 1, 0
  178.             FROM feed_join_user fu
  179.                 JOIN user u ON u.id = fu.user_id
  180.                 LEFT JOIN feed_participant fp
  181.                     ON fp.feed_id = fu.feed_id AND fp.user_id = fu.user_id
  182.             WHERE fp.user_id IS NULL
  183.         ');
  184.         // create feed participants from feed groups (users in those groups)
  185.         $this->addSql('
  186.             INSERT INTO feed_participant (feed_id, user_id, viewed, unread)
  187.             SELECT DISTINCT fg.feed_id, ug.user_id, 1, 0
  188.             FROM feed_join_group fg
  189.                 JOIN user_join_group ug ON ug.group_id = fg.group_id
  190.                 JOIN user u ON u.id = ug.user_id
  191.                 LEFT JOIN feed_participant fp
  192.                     ON fp.feed_id = fg.feed_id AND fp.user_id = ug.user_id
  193.             WHERE fp.user_id IS NULL
  194.         ');
  195.         // remove duplicate feed participants rows
  196.         $this->addSql('
  197.             DELETE fp1 FROM feed_participant fp1
  198.                 JOIN feed_participant fp2
  199.                     ON fp1.feed_id = fp2.feed_id AND fp1.user_id = fp2.user_id
  200.             WHERE fp1.id > fp2.id;
  201.         ');
  202.         $this->addSql('DROP TABLE feed_confirm');
  203.         $this->addSql('DROP TABLE feed_join_group');
  204.         $this->addSql('DROP TABLE project_join_group');
  205.         $this->addSql('ALTER TABLE feed DROP allow_all_users, DROP allow_all_groups');
  206.         $this->addSql('ALTER TABLE project DROP allow_all_users, DROP allow_all_groups');
  207.         $this->addSql('ALTER TABLE project_item DROP allow_all_users');
  208.     }
  209.     public function down(Schema $schema): void
  210.     {
  211.         // this down() migration is auto-generated, please modify it to your needs
  212.         $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 = \'\' ');
  213.         $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 = \'\' ');
  214.         $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 = \'\' ');
  215.         $this->addSql('ALTER TABLE feed_confirm ADD CONSTRAINT FK_2CF4ABE451A5BC03 FOREIGN KEY (feed_id) REFERENCES feed (id) ON DELETE CASCADE');
  216.         $this->addSql('ALTER TABLE feed_confirm ADD CONSTRAINT FK_2CF4ABE4A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
  217.         $this->addSql('ALTER TABLE feed_join_group ADD CONSTRAINT FK_984F177951A5BC03 FOREIGN KEY (feed_id) REFERENCES feed (id) ON DELETE CASCADE');
  218.         $this->addSql('ALTER TABLE feed_join_group ADD CONSTRAINT FK_984F1779FE54D947 FOREIGN KEY (group_id) REFERENCES user_group (id) ON DELETE CASCADE');
  219.         $this->addSql('ALTER TABLE project_join_group ADD CONSTRAINT FK_FC244C5A166D1F9C FOREIGN KEY (project_id) REFERENCES project (id) ON DELETE CASCADE');
  220.         $this->addSql('ALTER TABLE project_join_group ADD CONSTRAINT FK_FC244C5AFE54D947 FOREIGN KEY (group_id) REFERENCES user_group (id) ON DELETE CASCADE');
  221.         $this->addSql('ALTER TABLE feed ADD allow_all_users TINYINT(1) NOT NULL, ADD allow_all_groups TINYINT(1) NOT NULL');
  222.         $this->addSql('ALTER TABLE project ADD allow_all_users TINYINT(1) NOT NULL, ADD allow_all_groups TINYINT(1) NOT NULL');
  223.         $this->addSql('ALTER TABLE project_item ADD allow_all_users TINYINT(1) NOT NULL');
  224.         $this->addSql('ALTER TABLE project_participant DROP FOREIGN KEY FK_1F509CEA166D1F9C');
  225.         $this->addSql('DROP INDEX IDX_1F509CEA166D1F9C ON project_participant');
  226.         $this->addSql('ALTER TABLE project_participant DROP project_id');
  227.     }
  228. }