From 9a79345d2f6c9903ab0d5cc8be3733cd636d830d Mon Sep 17 00:00:00 2001 From: Tatevik Date: Tue, 28 Oct 2025 11:36:52 +0400 Subject: [PATCH 01/22] OnlyOrmTablesFilter --- config/services.yml | 5 +++ src/Core/Doctrine/OnlyOrmTablesFilter.php | 54 +++++++++++++++++++++++ 2 files changed, 59 insertions(+) create mode 100644 src/Core/Doctrine/OnlyOrmTablesFilter.php diff --git a/config/services.yml b/config/services.yml index b21dc5aa..59f32e7a 100644 --- a/config/services.yml +++ b/config/services.yml @@ -45,3 +45,8 @@ services: arguments: - '@annotation_reader' - '%kernel.project_dir%/src/Domain/Model/' + + PhpList\Core\Core\Doctrine\OnlyOrmTablesFilter: + lazy: true + tags: + - { name: 'doctrine.dbal.schema_filter', connection: 'default' } diff --git a/src/Core/Doctrine/OnlyOrmTablesFilter.php b/src/Core/Doctrine/OnlyOrmTablesFilter.php new file mode 100644 index 00000000..ad0c9b67 --- /dev/null +++ b/src/Core/Doctrine/OnlyOrmTablesFilter.php @@ -0,0 +1,54 @@ +allow === null) { + $names = []; + foreach ($this->em->getMetadataFactory()->getAllMetadata() as $m) { + // main table + $table = $m->getTableName(); + if (str_starts_with($table, 'phplist_')) { + $names[] = $table; + } + + // many-to-many join tables + foreach ($m->getAssociationMappings() as $assoc) { + if (isset($assoc['joinTable']['name'])) { + $join = $assoc['joinTable']['name']; + if (str_starts_with($join, 'phplist_')) { + $names[] = $join; + } + } + } + } + + // keep the migration table visible too + $names[] = 'doctrine_migration_versions'; + + $this->allow = array_values(array_unique($names)); + } + + return in_array($assetName, $this->allow, true); + } +} From cc71c7839fa42ced5b9cf8501f393ffb94d7aa99 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Tue, 28 Oct 2025 12:08:06 +0400 Subject: [PATCH 02/22] Current --- src/Migrations/Version20251028080125.php | 185 +++++++++++++++++++++++ 1 file changed, 185 insertions(+) create mode 100644 src/Migrations/Version20251028080125.php diff --git a/src/Migrations/Version20251028080125.php b/src/Migrations/Version20251028080125.php new file mode 100644 index 00000000..709398e0 --- /dev/null +++ b/src/Migrations/Version20251028080125.php @@ -0,0 +1,185 @@ +addSql('DROP INDEX loginnameidx ON phplist_admin'); + $this->addSql('ALTER TABLE phplist_admin CHANGE modified modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CHANGE privileges privileges LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690D3B10C48 FOREIGN KEY (adminattributeid) REFERENCES phplist_adminattribute (id)'); + $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute (adminattributeid)'); + $this->addSql('CREATE INDEX IDX_58E07690B8ED4D93 ON phplist_admin_attribute (adminid)'); + $this->addSql('ALTER TABLE phplist_admin_login CHANGE active active TINYINT(1) NOT NULL'); + $this->addSql('ALTER TABLE phplist_admin_login ADD CONSTRAINT FK_5FCE0842B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_5FCE0842B8ED4D93 ON phplist_admin_login (adminid)'); + $this->addSql('ALTER TABLE phplist_admin_password_request CHANGE id_key id_key INT UNSIGNED AUTO_INCREMENT NOT NULL'); + $this->addSql('ALTER TABLE phplist_admin_password_request ADD CONSTRAINT FK_DC146F3B880E0D76 FOREIGN KEY (`admin`) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_DC146F3B880E0D76 ON phplist_admin_password_request (`admin`)'); + $this->addSql('ALTER TABLE phplist_admintoken CHANGE adminid adminid INT DEFAULT NULL, CHANGE value value VARCHAR(255) NOT NULL'); + $this->addSql('ALTER TABLE phplist_admintoken ADD CONSTRAINT FK_CB15D477B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id) ON DELETE CASCADE'); + $this->addSql('CREATE INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken (adminid)'); + $this->addSql('ALTER TABLE phplist_attachment CHANGE description description LONGTEXT DEFAULT NULL'); + $this->addSql('DROP INDEX statusidx ON phplist_bounce'); + $this->addSql('ALTER TABLE phplist_bounce CHANGE header header LONGTEXT DEFAULT NULL, CHANGE data data LONGBLOB DEFAULT NULL, CHANGE comment comment LONGTEXT DEFAULT NULL'); + $this->addSql('CREATE INDEX statusidx ON phplist_bounce (status)'); + $this->addSql('ALTER TABLE phplist_bounceregex CHANGE regexhash regexhash VARCHAR(32) DEFAULT NULL, CHANGE comment comment LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_config CHANGE editable editable TINYINT(1) DEFAULT 1 NOT NULL'); + $this->addSql('ALTER TABLE phplist_eventlog CHANGE entry entry LONGTEXT DEFAULT NULL'); + $this->addSql('DROP INDEX lanorigidx ON phplist_i18n'); + $this->addSql('DROP INDEX lanorigunq ON phplist_i18n'); + $this->addSql('ALTER TABLE phplist_i18n CHANGE original original VARCHAR(255) NOT NULL, CHANGE translation translation LONGTEXT NOT NULL, ADD PRIMARY KEY (lan, original)'); + $this->addSql('CREATE UNIQUE INDEX lanorigunq ON phplist_i18n (lan, original)'); + $this->addSql('ALTER TABLE phplist_linktrack CHANGE latestclick latestclick DATETIME DEFAULT CURRENT_TIMESTAMP'); + $this->addSql('DROP INDEX urlindex ON phplist_linktrack_forward'); + $this->addSql('ALTER TABLE phplist_linktrack_forward CHANGE url url VARCHAR(255) DEFAULT NULL, CHANGE urlhash urlhash VARCHAR(32) DEFAULT NULL'); + $this->addSql('CREATE INDEX urlindex ON phplist_linktrack_forward (url)'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick CHANGE data data LONGTEXT DEFAULT NULL, ADD PRIMARY KEY (linkid, userid, messageid)'); + $this->addSql('ALTER TABLE phplist_list DROP rssfeed, CHANGE description description VARCHAR(255) NOT NULL, CHANGE prefix prefix VARCHAR(255) NOT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE active active TINYINT(1) NOT NULL, CHANGE category category VARCHAR(255) NOT NULL'); + $this->addSql('ALTER TABLE phplist_list ADD CONSTRAINT FK_A4CE8621CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_A4CE8621CF60E67C ON phplist_list (owner)'); + $this->addSql('ALTER TABLE phplist_listmessage CHANGE modified modified DATETIME NOT NULL'); + $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A31478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id)'); + $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A8E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id)'); + $this->addSql('CREATE INDEX IDX_83B22D7A31478478 ON phplist_listmessage (messageid)'); + $this->addSql('CREATE INDEX IDX_83B22D7A8E44C1EF ON phplist_listmessage (listid)'); + $this->addSql('DROP INDEX userlistenteredidx ON phplist_listuser'); + $this->addSql('ALTER TABLE phplist_listuser CHANGE modified modified DATETIME NOT NULL'); + $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E411F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id)'); + $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E4118E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id) ON DELETE CASCADE'); + $this->addSql('CREATE INDEX userlistenteredidx ON phplist_listuser (userid, entered, listid)'); + $this->addSql('ALTER TABLE phplist_message CHANGE subject subject VARCHAR(255) DEFAULT \'(no subject)\' NOT NULL, CHANGE message message LONGTEXT DEFAULT NULL, CHANGE textmessage textmessage LONGTEXT DEFAULT NULL, CHANGE footer footer LONGTEXT DEFAULT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE userselection userselection LONGTEXT DEFAULT NULL, CHANGE htmlformatted htmlformatted TINYINT(1) DEFAULT 0 NOT NULL, CHANGE processed processed TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astext astext TINYINT(1) DEFAULT 0 NOT NULL, CHANGE ashtml ashtml TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astextandhtml astextandhtml TINYINT(1) DEFAULT 0 NOT NULL, CHANGE aspdf aspdf TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astextandpdf astextandpdf TINYINT(1) DEFAULT 0 NOT NULL, CHANGE viewed viewed INT DEFAULT 0 NOT NULL, CHANGE bouncecount bouncecount INT DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCDCF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); + $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCD97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id) ON DELETE SET NULL'); + $this->addSql('CREATE INDEX IDX_C5D81FCDCF60E67C ON phplist_message (owner)'); + $this->addSql('CREATE INDEX IDX_C5D81FCD97601F83 ON phplist_message (template)'); + $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_sendprocess CHANGE modified modified DATETIME NOT NULL'); + $this->addSql('ALTER TABLE phplist_subscribepage CHANGE active active TINYINT(1) DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE phplist_subscribepage ADD CONSTRAINT FK_5BAC7737CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_5BAC7737CF60E67C ON phplist_subscribepage (owner)'); + $this->addSql('ALTER TABLE phplist_subscribepage_data CHANGE data data LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_templateimage CHANGE template template INT NOT NULL'); + $this->addSql('ALTER TABLE phplist_templateimage ADD CONSTRAINT FK_30A85BA97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id)'); + $this->addSql('DROP INDEX urlindex ON phplist_urlcache'); + $this->addSql('ALTER TABLE phplist_urlcache CHANGE url url VARCHAR(255) NOT NULL'); + $this->addSql('CREATE INDEX urlindex ON phplist_urlcache (url)'); + $this->addSql('DROP INDEX email ON phplist_user_blacklist'); + $this->addSql('ALTER TABLE phplist_user_blacklist ADD PRIMARY KEY (email)'); + $this->addSql('DROP INDEX email ON phplist_user_blacklist_data'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data CHANGE data data LONGTEXT DEFAULT NULL, ADD PRIMARY KEY (email)'); + $this->addSql('DROP INDEX foreignkey ON phplist_user_user'); + $this->addSql('DROP INDEX optidx ON phplist_user_user'); + $this->addSql('DROP INDEX uuididx ON phplist_user_user'); + $this->addSql('ALTER TABLE phplist_user_user DROP optedin, DROP uuid, DROP subscribepage, DROP rssfrequency, DROP password, DROP passwordchanged, DROP foreignkey, CHANGE confirmed confirmed TINYINT(1) NOT NULL, CHANGE blacklisted blacklisted TINYINT(1) NOT NULL, CHANGE bouncecount bouncecount INT NOT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE uniqid uniqid VARCHAR(255) NOT NULL, CHANGE htmlemail htmlemail TINYINT(1) NOT NULL, CHANGE disabled disabled TINYINT(1) NOT NULL, CHANGE extradata extradata LONGTEXT NOT NULL'); + $this->addSql('CREATE UNIQUE INDEX UNIQ_8A30188621D23BBC ON phplist_user_user (uniqid)'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX email TO UNIQ_8A301886E7927C74'); + $this->addSql('ALTER TABLE phplist_user_user_attribute CHANGE value value LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E310878C45AB5 FOREIGN KEY (attributeid) REFERENCES phplist_user_attribute (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E3108F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_user_user_history CHANGE detail detail LONGTEXT DEFAULT NULL, CHANGE systeminfo systeminfo LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_user_user_history ADD CONSTRAINT FK_6DBB605CF132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F469F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F46931478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_userstats CHANGE listid listid INT DEFAULT 0 NOT NULL, CHANGE value value INT DEFAULT 0 NOT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE phplist_admin CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE privileges privileges TEXT DEFAULT NULL'); + $this->addSql('CREATE UNIQUE INDEX loginnameidx ON phplist_admin (loginname)'); + $this->addSql('ALTER TABLE phplist_admin_attribute DROP FOREIGN KEY FK_58E07690D3B10C48'); + $this->addSql('ALTER TABLE phplist_admin_attribute DROP FOREIGN KEY FK_58E07690B8ED4D93'); + $this->addSql('DROP INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute'); + $this->addSql('DROP INDEX IDX_58E07690B8ED4D93 ON phplist_admin_attribute'); + $this->addSql('ALTER TABLE phplist_admin_login DROP FOREIGN KEY FK_5FCE0842B8ED4D93'); + $this->addSql('DROP INDEX IDX_5FCE0842B8ED4D93 ON phplist_admin_login'); + $this->addSql('ALTER TABLE phplist_admin_login CHANGE active active TINYINT(1) DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE phplist_admin_password_request DROP FOREIGN KEY FK_DC146F3B880E0D76'); + $this->addSql('DROP INDEX IDX_DC146F3B880E0D76 ON phplist_admin_password_request'); + $this->addSql('ALTER TABLE phplist_admin_password_request CHANGE id_key id_key INT AUTO_INCREMENT NOT NULL'); + $this->addSql('ALTER TABLE phplist_admintoken DROP FOREIGN KEY FK_CB15D477B8ED4D93'); + $this->addSql('DROP INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken'); + $this->addSql('ALTER TABLE phplist_admintoken CHANGE adminid adminid INT NOT NULL, CHANGE value value VARCHAR(255) DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_attachment CHANGE description description TEXT DEFAULT NULL'); + $this->addSql('DROP INDEX statusidx ON phplist_bounce'); + $this->addSql('ALTER TABLE phplist_bounce CHANGE header header TEXT DEFAULT NULL, CHANGE data data MEDIUMBLOB DEFAULT NULL, CHANGE comment comment TEXT DEFAULT NULL'); + $this->addSql('CREATE INDEX statusidx ON phplist_bounce (status(20))'); + $this->addSql('ALTER TABLE phplist_bounceregex CHANGE regexhash regexhash CHAR(32) DEFAULT NULL, CHANGE comment comment TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_config CHANGE editable editable TINYINT(1) DEFAULT 1'); + $this->addSql('ALTER TABLE phplist_eventlog CHANGE entry entry TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_i18n DROP INDEX primary, ADD INDEX lanorigidx (lan, original(200))'); + $this->addSql('DROP INDEX lanorigunq ON phplist_i18n'); + $this->addSql('ALTER TABLE phplist_i18n CHANGE original original TEXT NOT NULL, CHANGE translation translation TEXT NOT NULL'); + $this->addSql('CREATE UNIQUE INDEX lanorigunq ON phplist_i18n (lan, original(200))'); + $this->addSql('ALTER TABLE phplist_linktrack CHANGE latestclick latestclick DATETIME DEFAULT NULL'); + $this->addSql('DROP INDEX urlindex ON phplist_linktrack_forward'); + $this->addSql('ALTER TABLE phplist_linktrack_forward CHANGE url url VARCHAR(2083) DEFAULT NULL, CHANGE urlhash urlhash CHAR(32) DEFAULT NULL'); + $this->addSql('CREATE INDEX urlindex ON phplist_linktrack_forward (url(255))'); + $this->addSql('DROP INDEX `primary` ON phplist_linktrack_userclick'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick CHANGE data data TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_list DROP FOREIGN KEY FK_A4CE8621CF60E67C'); + $this->addSql('DROP INDEX IDX_A4CE8621CF60E67C ON phplist_list'); + $this->addSql('ALTER TABLE phplist_list ADD rssfeed VARCHAR(255) DEFAULT NULL, CHANGE description description TEXT DEFAULT NULL, CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE prefix prefix VARCHAR(10) DEFAULT NULL, CHANGE active active TINYINT(1) DEFAULT NULL, CHANGE category category VARCHAR(255) DEFAULT \'\''); + $this->addSql('ALTER TABLE phplist_listmessage DROP FOREIGN KEY FK_83B22D7A31478478'); + $this->addSql('ALTER TABLE phplist_listmessage DROP FOREIGN KEY FK_83B22D7A8E44C1EF'); + $this->addSql('DROP INDEX IDX_83B22D7A31478478 ON phplist_listmessage'); + $this->addSql('DROP INDEX IDX_83B22D7A8E44C1EF ON phplist_listmessage'); + $this->addSql('ALTER TABLE phplist_listmessage CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); + $this->addSql('ALTER TABLE phplist_listuser DROP FOREIGN KEY FK_F467E411F132696E'); + $this->addSql('ALTER TABLE phplist_listuser DROP FOREIGN KEY FK_F467E4118E44C1EF'); + $this->addSql('DROP INDEX userlistenteredidx ON phplist_listuser'); + $this->addSql('ALTER TABLE phplist_listuser CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); + $this->addSql('CREATE INDEX userlistenteredidx ON phplist_listuser (userid, listid, entered)'); + $this->addSql('ALTER TABLE phplist_message DROP FOREIGN KEY FK_C5D81FCDCF60E67C'); + $this->addSql('ALTER TABLE phplist_message DROP FOREIGN KEY FK_C5D81FCD97601F83'); + $this->addSql('DROP INDEX IDX_C5D81FCDCF60E67C ON phplist_message'); + $this->addSql('DROP INDEX IDX_C5D81FCD97601F83 ON phplist_message'); + $this->addSql('ALTER TABLE phplist_message CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE htmlformatted htmlformatted TINYINT(1) DEFAULT 0, CHANGE astext astext INT DEFAULT 0, CHANGE ashtml ashtml INT DEFAULT 0, CHANGE aspdf aspdf INT DEFAULT 0, CHANGE astextandhtml astextandhtml INT DEFAULT 0, CHANGE astextandpdf astextandpdf INT DEFAULT 0, CHANGE processed processed INT UNSIGNED DEFAULT 0, CHANGE viewed viewed INT DEFAULT 0, CHANGE bouncecount bouncecount INT DEFAULT 0, CHANGE subject subject VARCHAR(255) CHARACTER SET utf8mb4 DEFAULT \'(no subject)\' NOT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE message message LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE textmessage textmessage LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE footer footer TEXT DEFAULT NULL, CHANGE userselection userselection TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`'); + $this->addSql('ALTER TABLE phplist_sendprocess CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); + $this->addSql('ALTER TABLE phplist_subscribepage DROP FOREIGN KEY FK_5BAC7737CF60E67C'); + $this->addSql('DROP INDEX IDX_5BAC7737CF60E67C ON phplist_subscribepage'); + $this->addSql('ALTER TABLE phplist_subscribepage CHANGE active active TINYINT(1) DEFAULT 0'); + $this->addSql('ALTER TABLE phplist_subscribepage_data CHANGE data data TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_templateimage DROP FOREIGN KEY FK_30A85BA97601F83'); + $this->addSql('ALTER TABLE phplist_templateimage CHANGE template template INT DEFAULT 0 NOT NULL'); + $this->addSql('DROP INDEX urlindex ON phplist_urlcache'); + $this->addSql('ALTER TABLE phplist_urlcache CHANGE url url VARCHAR(2083) NOT NULL'); + $this->addSql('CREATE INDEX urlindex ON phplist_urlcache (url(255))'); + $this->addSql('ALTER TABLE phplist_user_blacklist DROP INDEX primary, ADD UNIQUE INDEX email (email)'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data DROP INDEX primary, ADD UNIQUE INDEX email (email)'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data CHANGE data data TEXT DEFAULT NULL'); + $this->addSql('DROP INDEX UNIQ_8A30188621D23BBC ON phplist_user_user'); + $this->addSql('ALTER TABLE phplist_user_user ADD optedin TINYINT(1) DEFAULT 0, ADD uuid VARCHAR(36) DEFAULT \'\', ADD subscribepage INT DEFAULT NULL, ADD rssfrequency VARCHAR(100) DEFAULT NULL, ADD password VARCHAR(255) DEFAULT NULL, ADD passwordchanged DATE DEFAULT NULL, ADD foreignkey VARCHAR(100) DEFAULT NULL, CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE confirmed confirmed TINYINT(1) DEFAULT 0, CHANGE blacklisted blacklisted TINYINT(1) DEFAULT 0, CHANGE bouncecount bouncecount INT DEFAULT 0, CHANGE uniqid uniqid VARCHAR(255) DEFAULT NULL, CHANGE htmlemail htmlemail TINYINT(1) DEFAULT 0, CHANGE disabled disabled TINYINT(1) DEFAULT 0, CHANGE extradata extradata TEXT DEFAULT NULL'); + $this->addSql('CREATE INDEX foreignkey ON phplist_user_user (foreignkey)'); + $this->addSql('CREATE INDEX optidx ON phplist_user_user (optedin)'); + $this->addSql('CREATE INDEX uuididx ON phplist_user_user (uuid)'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX uniq_8a301886e7927c74 TO email'); + $this->addSql('ALTER TABLE phplist_user_user_attribute DROP FOREIGN KEY FK_E24E310878C45AB5'); + $this->addSql('ALTER TABLE phplist_user_user_attribute DROP FOREIGN KEY FK_E24E3108F132696E'); + $this->addSql('ALTER TABLE phplist_user_user_attribute CHANGE value value TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_user_user_history DROP FOREIGN KEY FK_6DBB605CF132696E'); + $this->addSql('ALTER TABLE phplist_user_user_history CHANGE detail detail TEXT DEFAULT NULL, CHANGE systeminfo systeminfo TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_usermessage DROP FOREIGN KEY FK_7F30F469F132696E'); + $this->addSql('ALTER TABLE phplist_usermessage DROP FOREIGN KEY FK_7F30F46931478478'); + $this->addSql('ALTER TABLE phplist_userstats CHANGE listid listid INT DEFAULT 0, CHANGE value value INT DEFAULT 0'); + } +} From 55d749d3ae0ce070749279448b1303d81f88160a Mon Sep 17 00:00:00 2001 From: Tatevik Date: Tue, 28 Oct 2025 12:33:16 +0400 Subject: [PATCH 03/22] Admin --- src/Core/Doctrine/OnlyOrmTablesFilter.php | 4 +- .../Model/Interfaces/ModificationDate.php | 10 - src/Domain/Identity/Model/Administrator.php | 142 +++++++------- src/Migrations/Version20251028080125.php | 185 ------------------ .../Identity/Model/AdministratorTest.php | 10 +- 5 files changed, 74 insertions(+), 277 deletions(-) delete mode 100644 src/Migrations/Version20251028080125.php diff --git a/src/Core/Doctrine/OnlyOrmTablesFilter.php b/src/Core/Doctrine/OnlyOrmTablesFilter.php index ad0c9b67..a2f5b5a4 100644 --- a/src/Core/Doctrine/OnlyOrmTablesFilter.php +++ b/src/Core/Doctrine/OnlyOrmTablesFilter.php @@ -28,7 +28,7 @@ public function __invoke(string $assetName): bool foreach ($this->em->getMetadataFactory()->getAllMetadata() as $m) { // main table $table = $m->getTableName(); - if (str_starts_with($table, 'phplist_')) { + if ($table) { $names[] = $table; } @@ -36,7 +36,7 @@ public function __invoke(string $assetName): bool foreach ($m->getAssociationMappings() as $assoc) { if (isset($assoc['joinTable']['name'])) { $join = $assoc['joinTable']['name']; - if (str_starts_with($join, 'phplist_')) { + if ($join) { $names[] = $join; } } diff --git a/src/Domain/Common/Model/Interfaces/ModificationDate.php b/src/Domain/Common/Model/Interfaces/ModificationDate.php index 22432b2f..11c383e2 100644 --- a/src/Domain/Common/Model/Interfaces/ModificationDate.php +++ b/src/Domain/Common/Model/Interfaces/ModificationDate.php @@ -20,14 +20,4 @@ interface ModificationDate * @return DateTime|null */ public function getUpdatedAt(): ?DateTime; - - /** - * Updates the modification date to be now. - * - * @Mapping\PrePersist - * @Mapping\PreUpdate - * - * @return DomainModel - */ - public function updateUpdatedAt(): DomainModel; } diff --git a/src/Domain/Identity/Model/Administrator.php b/src/Domain/Identity/Model/Administrator.php index c22b4b9f..5db61471 100644 --- a/src/Domain/Identity/Model/Administrator.php +++ b/src/Domain/Identity/Model/Administrator.php @@ -22,7 +22,10 @@ * @author Tatevik Grigoryan */ #[ORM\Entity(repositoryClass: AdministratorRepository::class)] -#[ORM\Table(name: 'phplist_admin')] +#[ORM\Table( + name: 'phplist_admin', + uniqueConstraints: [new ORM\UniqueConstraint(name: 'loginnameidx', columns: ['loginname'])] +)] #[ORM\HasLifecycleCallbacks] class Administrator implements DomainModel, Identity, CreationDate, ModificationDate { @@ -31,50 +34,60 @@ class Administrator implements DomainModel, Identity, CreationDate, Modification #[ORM\GeneratedValue] private ?int $id = null; - #[ORM\Column(name: 'created', type: 'datetime')] - protected DateTime $createdAt; + #[ORM\Column(name: 'created', type: 'datetime', nullable: true)] + protected ?DateTime $createdAt = null; - #[ORM\Column(name: 'modified', type: 'datetime')] - private ?DateTime $updatedAt; + #[ORM\Column(name: 'modified', type: 'datetime', nullable: false)] + private DateTime $updatedAt; - #[ORM\Column(name: 'loginname')] + #[ORM\Column(name: 'loginname', type: 'string', length: 66, nullable: false)] private string $loginName; - #[ORM\Column(name: 'namelc', nullable: true)] - private string $namelc; + #[ORM\Column(name: 'namelc', type: 'string', length: 255, nullable: true)] + private ?string $namelc = null; - #[ORM\Column(name: 'email')] + #[ORM\Column(name: 'email', type: 'string', length: 255, nullable: false)] private string $email; #[ORM\Column(name: 'modifiedby', type: 'string', length: 66, nullable: true)] - private ?string $modifiedBy; + private ?string $modifiedBy = null; - #[ORM\Column(name: 'password')] - private string $passwordHash; + #[ORM\Column(name: 'password', type: 'string', length: 255, nullable: true)] + private ?string $passwordHash = null; #[ORM\Column(name: 'passwordchanged', type: 'date', nullable: true)] - private ?DateTime $passwordChangeDate; + private ?DateTime $passwordChangeDate = null; - #[ORM\Column(type: 'boolean')] - private bool $disabled; + #[ORM\Column(name: 'disabled', type: 'boolean', nullable: false)] + private bool $disabled = false; - #[ORM\Column(name: 'superuser', type: 'boolean')] - private bool $superUser; + #[ORM\Column(name: 'superuser', type: 'boolean', nullable: false)] + private bool $superUser = false; #[ORM\Column(name: 'privileges', type: 'text', nullable: true)] - private ?string $privileges; + private ?string $privileges = null; public function __construct() { - $this->disabled = false; - $this->superUser = false; - $this->passwordChangeDate = null; - $this->loginName = ''; - $this->passwordHash = ''; $this->createdAt = new DateTime(); - $this->updatedAt = null; + $this->updatedAt = new DateTime(); + $this->loginName = ''; $this->email = ''; - $this->privileges = null; + } + + public function getId(): ?int + { + return $this->id; + } + + public function getCreatedAt(): ?DateTime + { + return $this->createdAt; + } + + public function getUpdatedAt(): DateTime + { + return $this->updatedAt; } public function getLoginName(): string @@ -85,7 +98,6 @@ public function getLoginName(): string public function setLoginName(string $loginName): self { $this->loginName = $loginName; - return $this; } @@ -97,20 +109,29 @@ public function getEmail(): string public function setEmail(string $email): self { $this->email = $email; + return $this; + } + + public function getNameLc(): ?string + { + return $this->namelc; + } + public function setNameLc(?string $nameLc): self + { + $this->namelc = $nameLc; return $this; } - public function getPasswordHash(): string + public function getPasswordHash(): ?string { return $this->passwordHash; } - public function setPasswordHash(string $passwordHash): self + public function setPasswordHash(?string $passwordHash): self { $this->passwordHash = $passwordHash; - $this->passwordChangeDate = new DateTime(); - + $this->passwordChangeDate = $passwordHash !== null ? new DateTime() : null; return $this; } @@ -127,7 +148,6 @@ public function isDisabled(): bool public function setDisabled(bool $disabled): self { $this->disabled = $disabled; - return $this; } @@ -139,31 +159,16 @@ public function isSuperUser(): bool public function setSuperUser(bool $superUser): self { $this->superUser = $superUser; - return $this; } - public function setNameLc(string $nameLc): self - { - $this->namelc = $nameLc; - - return $this; - } - - public function getNameLc(): string - { - return $this->namelc; - } - public function setPrivileges(Privileges $privileges): self { $this->privileges = $privileges->toSerialized(); - return $this; } /** - * @SuppressWarnings(PHPMD.StaticAccess) * @throws InvalidArgumentException */ public function setPrivilegesFromArray(array $privilegesData): void @@ -172,46 +177,18 @@ public function setPrivilegesFromArray(array $privilegesData): void foreach ($privilegesData as $key => $value) { $flag = PrivilegeFlag::tryFrom($key); if (!$flag) { - throw new InvalidArgumentException('Unknown privilege key: '. $key); + throw new InvalidArgumentException('Unknown privilege key: ' . $key); } - $privileges = $value ? $privileges->grant($flag) : $privileges->revoke($flag); } $this->setPrivileges($privileges); } - /** - * @SuppressWarnings(PHPMD.StaticAccess) - */ public function getPrivileges(): Privileges { return Privileges::fromSerialized($this->privileges); } - public function getCreatedAt(): ?DateTime - { - return $this->createdAt; - } - - public function getId(): ?int - { - return $this->id; - } - - public function getUpdatedAt(): ?DateTime - { - return $this->updatedAt; - } - - #[ORM\PrePersist] - #[ORM\PreUpdate] - public function updateUpdatedAt(): DomainModel - { - $this->updatedAt = new DateTime(); - - return $this; - } - public function setModifiedBy(?string $modifiedBy): self { $this->modifiedBy = $modifiedBy; @@ -231,4 +208,19 @@ public function owns(OwnableInterface $resource): bool return $resource->getOwner()->getId() === $this->getId(); } + + #[ORM\PrePersist] + public function onPrePersist(): void + { + if ($this->createdAt === null) { + $this->createdAt = new DateTime(); + } + $this->updatedAt = new DateTime(); + } + + #[ORM\PreUpdate] + public function onPreUpdate(): void + { + $this->updatedAt = new DateTime(); + } } diff --git a/src/Migrations/Version20251028080125.php b/src/Migrations/Version20251028080125.php deleted file mode 100644 index 709398e0..00000000 --- a/src/Migrations/Version20251028080125.php +++ /dev/null @@ -1,185 +0,0 @@ -addSql('DROP INDEX loginnameidx ON phplist_admin'); - $this->addSql('ALTER TABLE phplist_admin CHANGE modified modified TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, CHANGE privileges privileges LONGTEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690D3B10C48 FOREIGN KEY (adminattributeid) REFERENCES phplist_adminattribute (id)'); - $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id)'); - $this->addSql('CREATE INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute (adminattributeid)'); - $this->addSql('CREATE INDEX IDX_58E07690B8ED4D93 ON phplist_admin_attribute (adminid)'); - $this->addSql('ALTER TABLE phplist_admin_login CHANGE active active TINYINT(1) NOT NULL'); - $this->addSql('ALTER TABLE phplist_admin_login ADD CONSTRAINT FK_5FCE0842B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id)'); - $this->addSql('CREATE INDEX IDX_5FCE0842B8ED4D93 ON phplist_admin_login (adminid)'); - $this->addSql('ALTER TABLE phplist_admin_password_request CHANGE id_key id_key INT UNSIGNED AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE phplist_admin_password_request ADD CONSTRAINT FK_DC146F3B880E0D76 FOREIGN KEY (`admin`) REFERENCES phplist_admin (id)'); - $this->addSql('CREATE INDEX IDX_DC146F3B880E0D76 ON phplist_admin_password_request (`admin`)'); - $this->addSql('ALTER TABLE phplist_admintoken CHANGE adminid adminid INT DEFAULT NULL, CHANGE value value VARCHAR(255) NOT NULL'); - $this->addSql('ALTER TABLE phplist_admintoken ADD CONSTRAINT FK_CB15D477B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id) ON DELETE CASCADE'); - $this->addSql('CREATE INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken (adminid)'); - $this->addSql('ALTER TABLE phplist_attachment CHANGE description description LONGTEXT DEFAULT NULL'); - $this->addSql('DROP INDEX statusidx ON phplist_bounce'); - $this->addSql('ALTER TABLE phplist_bounce CHANGE header header LONGTEXT DEFAULT NULL, CHANGE data data LONGBLOB DEFAULT NULL, CHANGE comment comment LONGTEXT DEFAULT NULL'); - $this->addSql('CREATE INDEX statusidx ON phplist_bounce (status)'); - $this->addSql('ALTER TABLE phplist_bounceregex CHANGE regexhash regexhash VARCHAR(32) DEFAULT NULL, CHANGE comment comment LONGTEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_config CHANGE editable editable TINYINT(1) DEFAULT 1 NOT NULL'); - $this->addSql('ALTER TABLE phplist_eventlog CHANGE entry entry LONGTEXT DEFAULT NULL'); - $this->addSql('DROP INDEX lanorigidx ON phplist_i18n'); - $this->addSql('DROP INDEX lanorigunq ON phplist_i18n'); - $this->addSql('ALTER TABLE phplist_i18n CHANGE original original VARCHAR(255) NOT NULL, CHANGE translation translation LONGTEXT NOT NULL, ADD PRIMARY KEY (lan, original)'); - $this->addSql('CREATE UNIQUE INDEX lanorigunq ON phplist_i18n (lan, original)'); - $this->addSql('ALTER TABLE phplist_linktrack CHANGE latestclick latestclick DATETIME DEFAULT CURRENT_TIMESTAMP'); - $this->addSql('DROP INDEX urlindex ON phplist_linktrack_forward'); - $this->addSql('ALTER TABLE phplist_linktrack_forward CHANGE url url VARCHAR(255) DEFAULT NULL, CHANGE urlhash urlhash VARCHAR(32) DEFAULT NULL'); - $this->addSql('CREATE INDEX urlindex ON phplist_linktrack_forward (url)'); - $this->addSql('ALTER TABLE phplist_linktrack_userclick CHANGE data data LONGTEXT DEFAULT NULL, ADD PRIMARY KEY (linkid, userid, messageid)'); - $this->addSql('ALTER TABLE phplist_list DROP rssfeed, CHANGE description description VARCHAR(255) NOT NULL, CHANGE prefix prefix VARCHAR(255) NOT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE active active TINYINT(1) NOT NULL, CHANGE category category VARCHAR(255) NOT NULL'); - $this->addSql('ALTER TABLE phplist_list ADD CONSTRAINT FK_A4CE8621CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); - $this->addSql('CREATE INDEX IDX_A4CE8621CF60E67C ON phplist_list (owner)'); - $this->addSql('ALTER TABLE phplist_listmessage CHANGE modified modified DATETIME NOT NULL'); - $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A31478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id)'); - $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A8E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id)'); - $this->addSql('CREATE INDEX IDX_83B22D7A31478478 ON phplist_listmessage (messageid)'); - $this->addSql('CREATE INDEX IDX_83B22D7A8E44C1EF ON phplist_listmessage (listid)'); - $this->addSql('DROP INDEX userlistenteredidx ON phplist_listuser'); - $this->addSql('ALTER TABLE phplist_listuser CHANGE modified modified DATETIME NOT NULL'); - $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E411F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id)'); - $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E4118E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id) ON DELETE CASCADE'); - $this->addSql('CREATE INDEX userlistenteredidx ON phplist_listuser (userid, entered, listid)'); - $this->addSql('ALTER TABLE phplist_message CHANGE subject subject VARCHAR(255) DEFAULT \'(no subject)\' NOT NULL, CHANGE message message LONGTEXT DEFAULT NULL, CHANGE textmessage textmessage LONGTEXT DEFAULT NULL, CHANGE footer footer LONGTEXT DEFAULT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE userselection userselection LONGTEXT DEFAULT NULL, CHANGE htmlformatted htmlformatted TINYINT(1) DEFAULT 0 NOT NULL, CHANGE processed processed TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astext astext TINYINT(1) DEFAULT 0 NOT NULL, CHANGE ashtml ashtml TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astextandhtml astextandhtml TINYINT(1) DEFAULT 0 NOT NULL, CHANGE aspdf aspdf TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astextandpdf astextandpdf TINYINT(1) DEFAULT 0 NOT NULL, CHANGE viewed viewed INT DEFAULT 0 NOT NULL, CHANGE bouncecount bouncecount INT DEFAULT 0 NOT NULL'); - $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCDCF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); - $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCD97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id) ON DELETE SET NULL'); - $this->addSql('CREATE INDEX IDX_C5D81FCDCF60E67C ON phplist_message (owner)'); - $this->addSql('CREATE INDEX IDX_C5D81FCD97601F83 ON phplist_message (template)'); - $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_sendprocess CHANGE modified modified DATETIME NOT NULL'); - $this->addSql('ALTER TABLE phplist_subscribepage CHANGE active active TINYINT(1) DEFAULT 0 NOT NULL'); - $this->addSql('ALTER TABLE phplist_subscribepage ADD CONSTRAINT FK_5BAC7737CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); - $this->addSql('CREATE INDEX IDX_5BAC7737CF60E67C ON phplist_subscribepage (owner)'); - $this->addSql('ALTER TABLE phplist_subscribepage_data CHANGE data data LONGTEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_templateimage CHANGE template template INT NOT NULL'); - $this->addSql('ALTER TABLE phplist_templateimage ADD CONSTRAINT FK_30A85BA97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id)'); - $this->addSql('DROP INDEX urlindex ON phplist_urlcache'); - $this->addSql('ALTER TABLE phplist_urlcache CHANGE url url VARCHAR(255) NOT NULL'); - $this->addSql('CREATE INDEX urlindex ON phplist_urlcache (url)'); - $this->addSql('DROP INDEX email ON phplist_user_blacklist'); - $this->addSql('ALTER TABLE phplist_user_blacklist ADD PRIMARY KEY (email)'); - $this->addSql('DROP INDEX email ON phplist_user_blacklist_data'); - $this->addSql('ALTER TABLE phplist_user_blacklist_data CHANGE data data LONGTEXT DEFAULT NULL, ADD PRIMARY KEY (email)'); - $this->addSql('DROP INDEX foreignkey ON phplist_user_user'); - $this->addSql('DROP INDEX optidx ON phplist_user_user'); - $this->addSql('DROP INDEX uuididx ON phplist_user_user'); - $this->addSql('ALTER TABLE phplist_user_user DROP optedin, DROP uuid, DROP subscribepage, DROP rssfrequency, DROP password, DROP passwordchanged, DROP foreignkey, CHANGE confirmed confirmed TINYINT(1) NOT NULL, CHANGE blacklisted blacklisted TINYINT(1) NOT NULL, CHANGE bouncecount bouncecount INT NOT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE uniqid uniqid VARCHAR(255) NOT NULL, CHANGE htmlemail htmlemail TINYINT(1) NOT NULL, CHANGE disabled disabled TINYINT(1) NOT NULL, CHANGE extradata extradata LONGTEXT NOT NULL'); - $this->addSql('CREATE UNIQUE INDEX UNIQ_8A30188621D23BBC ON phplist_user_user (uniqid)'); - $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX email TO UNIQ_8A301886E7927C74'); - $this->addSql('ALTER TABLE phplist_user_user_attribute CHANGE value value LONGTEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E310878C45AB5 FOREIGN KEY (attributeid) REFERENCES phplist_user_attribute (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E3108F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE phplist_user_user_history CHANGE detail detail LONGTEXT DEFAULT NULL, CHANGE systeminfo systeminfo LONGTEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_user_user_history ADD CONSTRAINT FK_6DBB605CF132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F469F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F46931478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE phplist_userstats CHANGE listid listid INT DEFAULT 0 NOT NULL, CHANGE value value INT DEFAULT 0 NOT NULL'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE phplist_admin CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE privileges privileges TEXT DEFAULT NULL'); - $this->addSql('CREATE UNIQUE INDEX loginnameidx ON phplist_admin (loginname)'); - $this->addSql('ALTER TABLE phplist_admin_attribute DROP FOREIGN KEY FK_58E07690D3B10C48'); - $this->addSql('ALTER TABLE phplist_admin_attribute DROP FOREIGN KEY FK_58E07690B8ED4D93'); - $this->addSql('DROP INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute'); - $this->addSql('DROP INDEX IDX_58E07690B8ED4D93 ON phplist_admin_attribute'); - $this->addSql('ALTER TABLE phplist_admin_login DROP FOREIGN KEY FK_5FCE0842B8ED4D93'); - $this->addSql('DROP INDEX IDX_5FCE0842B8ED4D93 ON phplist_admin_login'); - $this->addSql('ALTER TABLE phplist_admin_login CHANGE active active TINYINT(1) DEFAULT 0 NOT NULL'); - $this->addSql('ALTER TABLE phplist_admin_password_request DROP FOREIGN KEY FK_DC146F3B880E0D76'); - $this->addSql('DROP INDEX IDX_DC146F3B880E0D76 ON phplist_admin_password_request'); - $this->addSql('ALTER TABLE phplist_admin_password_request CHANGE id_key id_key INT AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE phplist_admintoken DROP FOREIGN KEY FK_CB15D477B8ED4D93'); - $this->addSql('DROP INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken'); - $this->addSql('ALTER TABLE phplist_admintoken CHANGE adminid adminid INT NOT NULL, CHANGE value value VARCHAR(255) DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_attachment CHANGE description description TEXT DEFAULT NULL'); - $this->addSql('DROP INDEX statusidx ON phplist_bounce'); - $this->addSql('ALTER TABLE phplist_bounce CHANGE header header TEXT DEFAULT NULL, CHANGE data data MEDIUMBLOB DEFAULT NULL, CHANGE comment comment TEXT DEFAULT NULL'); - $this->addSql('CREATE INDEX statusidx ON phplist_bounce (status(20))'); - $this->addSql('ALTER TABLE phplist_bounceregex CHANGE regexhash regexhash CHAR(32) DEFAULT NULL, CHANGE comment comment TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_config CHANGE editable editable TINYINT(1) DEFAULT 1'); - $this->addSql('ALTER TABLE phplist_eventlog CHANGE entry entry TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_i18n DROP INDEX primary, ADD INDEX lanorigidx (lan, original(200))'); - $this->addSql('DROP INDEX lanorigunq ON phplist_i18n'); - $this->addSql('ALTER TABLE phplist_i18n CHANGE original original TEXT NOT NULL, CHANGE translation translation TEXT NOT NULL'); - $this->addSql('CREATE UNIQUE INDEX lanorigunq ON phplist_i18n (lan, original(200))'); - $this->addSql('ALTER TABLE phplist_linktrack CHANGE latestclick latestclick DATETIME DEFAULT NULL'); - $this->addSql('DROP INDEX urlindex ON phplist_linktrack_forward'); - $this->addSql('ALTER TABLE phplist_linktrack_forward CHANGE url url VARCHAR(2083) DEFAULT NULL, CHANGE urlhash urlhash CHAR(32) DEFAULT NULL'); - $this->addSql('CREATE INDEX urlindex ON phplist_linktrack_forward (url(255))'); - $this->addSql('DROP INDEX `primary` ON phplist_linktrack_userclick'); - $this->addSql('ALTER TABLE phplist_linktrack_userclick CHANGE data data TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_list DROP FOREIGN KEY FK_A4CE8621CF60E67C'); - $this->addSql('DROP INDEX IDX_A4CE8621CF60E67C ON phplist_list'); - $this->addSql('ALTER TABLE phplist_list ADD rssfeed VARCHAR(255) DEFAULT NULL, CHANGE description description TEXT DEFAULT NULL, CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE prefix prefix VARCHAR(10) DEFAULT NULL, CHANGE active active TINYINT(1) DEFAULT NULL, CHANGE category category VARCHAR(255) DEFAULT \'\''); - $this->addSql('ALTER TABLE phplist_listmessage DROP FOREIGN KEY FK_83B22D7A31478478'); - $this->addSql('ALTER TABLE phplist_listmessage DROP FOREIGN KEY FK_83B22D7A8E44C1EF'); - $this->addSql('DROP INDEX IDX_83B22D7A31478478 ON phplist_listmessage'); - $this->addSql('DROP INDEX IDX_83B22D7A8E44C1EF ON phplist_listmessage'); - $this->addSql('ALTER TABLE phplist_listmessage CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); - $this->addSql('ALTER TABLE phplist_listuser DROP FOREIGN KEY FK_F467E411F132696E'); - $this->addSql('ALTER TABLE phplist_listuser DROP FOREIGN KEY FK_F467E4118E44C1EF'); - $this->addSql('DROP INDEX userlistenteredidx ON phplist_listuser'); - $this->addSql('ALTER TABLE phplist_listuser CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); - $this->addSql('CREATE INDEX userlistenteredidx ON phplist_listuser (userid, listid, entered)'); - $this->addSql('ALTER TABLE phplist_message DROP FOREIGN KEY FK_C5D81FCDCF60E67C'); - $this->addSql('ALTER TABLE phplist_message DROP FOREIGN KEY FK_C5D81FCD97601F83'); - $this->addSql('DROP INDEX IDX_C5D81FCDCF60E67C ON phplist_message'); - $this->addSql('DROP INDEX IDX_C5D81FCD97601F83 ON phplist_message'); - $this->addSql('ALTER TABLE phplist_message CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE htmlformatted htmlformatted TINYINT(1) DEFAULT 0, CHANGE astext astext INT DEFAULT 0, CHANGE ashtml ashtml INT DEFAULT 0, CHANGE aspdf aspdf INT DEFAULT 0, CHANGE astextandhtml astextandhtml INT DEFAULT 0, CHANGE astextandpdf astextandpdf INT DEFAULT 0, CHANGE processed processed INT UNSIGNED DEFAULT 0, CHANGE viewed viewed INT DEFAULT 0, CHANGE bouncecount bouncecount INT DEFAULT 0, CHANGE subject subject VARCHAR(255) CHARACTER SET utf8mb4 DEFAULT \'(no subject)\' NOT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE message message LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE textmessage textmessage LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE footer footer TEXT DEFAULT NULL, CHANGE userselection userselection TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`'); - $this->addSql('ALTER TABLE phplist_sendprocess CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); - $this->addSql('ALTER TABLE phplist_subscribepage DROP FOREIGN KEY FK_5BAC7737CF60E67C'); - $this->addSql('DROP INDEX IDX_5BAC7737CF60E67C ON phplist_subscribepage'); - $this->addSql('ALTER TABLE phplist_subscribepage CHANGE active active TINYINT(1) DEFAULT 0'); - $this->addSql('ALTER TABLE phplist_subscribepage_data CHANGE data data TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_templateimage DROP FOREIGN KEY FK_30A85BA97601F83'); - $this->addSql('ALTER TABLE phplist_templateimage CHANGE template template INT DEFAULT 0 NOT NULL'); - $this->addSql('DROP INDEX urlindex ON phplist_urlcache'); - $this->addSql('ALTER TABLE phplist_urlcache CHANGE url url VARCHAR(2083) NOT NULL'); - $this->addSql('CREATE INDEX urlindex ON phplist_urlcache (url(255))'); - $this->addSql('ALTER TABLE phplist_user_blacklist DROP INDEX primary, ADD UNIQUE INDEX email (email)'); - $this->addSql('ALTER TABLE phplist_user_blacklist_data DROP INDEX primary, ADD UNIQUE INDEX email (email)'); - $this->addSql('ALTER TABLE phplist_user_blacklist_data CHANGE data data TEXT DEFAULT NULL'); - $this->addSql('DROP INDEX UNIQ_8A30188621D23BBC ON phplist_user_user'); - $this->addSql('ALTER TABLE phplist_user_user ADD optedin TINYINT(1) DEFAULT 0, ADD uuid VARCHAR(36) DEFAULT \'\', ADD subscribepage INT DEFAULT NULL, ADD rssfrequency VARCHAR(100) DEFAULT NULL, ADD password VARCHAR(255) DEFAULT NULL, ADD passwordchanged DATE DEFAULT NULL, ADD foreignkey VARCHAR(100) DEFAULT NULL, CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE confirmed confirmed TINYINT(1) DEFAULT 0, CHANGE blacklisted blacklisted TINYINT(1) DEFAULT 0, CHANGE bouncecount bouncecount INT DEFAULT 0, CHANGE uniqid uniqid VARCHAR(255) DEFAULT NULL, CHANGE htmlemail htmlemail TINYINT(1) DEFAULT 0, CHANGE disabled disabled TINYINT(1) DEFAULT 0, CHANGE extradata extradata TEXT DEFAULT NULL'); - $this->addSql('CREATE INDEX foreignkey ON phplist_user_user (foreignkey)'); - $this->addSql('CREATE INDEX optidx ON phplist_user_user (optedin)'); - $this->addSql('CREATE INDEX uuididx ON phplist_user_user (uuid)'); - $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX uniq_8a301886e7927c74 TO email'); - $this->addSql('ALTER TABLE phplist_user_user_attribute DROP FOREIGN KEY FK_E24E310878C45AB5'); - $this->addSql('ALTER TABLE phplist_user_user_attribute DROP FOREIGN KEY FK_E24E3108F132696E'); - $this->addSql('ALTER TABLE phplist_user_user_attribute CHANGE value value TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_user_user_history DROP FOREIGN KEY FK_6DBB605CF132696E'); - $this->addSql('ALTER TABLE phplist_user_user_history CHANGE detail detail TEXT DEFAULT NULL, CHANGE systeminfo systeminfo TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_usermessage DROP FOREIGN KEY FK_7F30F469F132696E'); - $this->addSql('ALTER TABLE phplist_usermessage DROP FOREIGN KEY FK_7F30F46931478478'); - $this->addSql('ALTER TABLE phplist_userstats CHANGE listid listid INT DEFAULT 0, CHANGE value value INT DEFAULT 0'); - } -} diff --git a/tests/Unit/Domain/Identity/Model/AdministratorTest.php b/tests/Unit/Domain/Identity/Model/AdministratorTest.php index f721f58b..0d3b90f7 100644 --- a/tests/Unit/Domain/Identity/Model/AdministratorTest.php +++ b/tests/Unit/Domain/Identity/Model/AdministratorTest.php @@ -69,21 +69,21 @@ public function testSetEmailAddressSetsEmailAddress(): void self::assertSame($value, $this->subject->getEmail()); } - public function testGetUpdatedAtInitiallyReturnsNull(): void + public function testGetUpdatedAtInitiallyReturnsNotNull(): void { - self::assertNull($this->subject->getUpdatedAt()); + self::assertNotNull($this->subject->getUpdatedAt()); } public function testUpdateModificationDateSetsModificationDateToNow(): void { - $this->subject->updateUpdatedAt(); + $this->subject->setEmail('update@email.com'); self::assertSimilarDates(new DateTime(), $this->subject->getUpdatedAt()); } - public function testGetPasswordHashInitiallyReturnsEmptyString(): void + public function testGetPasswordHashInitiallyReturnsNull(): void { - self::assertSame('', $this->subject->getPasswordHash()); + self::assertNull($this->subject->getPasswordHash()); } public function testSetPasswordHashSetsPasswordHash(): void From 903e0ccf781bf632e0c3d484ccc2655ce58c87b4 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Tue, 28 Oct 2025 14:47:12 +0400 Subject: [PATCH 04/22] Init migration --- .../Subscription/Model/UserBlacklist.php | 11 +- .../Subscription/Model/UserBlacklistData.php | 18 +- src/Migrations/Version20251028092901.php | 30 + src/Migrations/initial_schema.sql | 924 ++++++++++++++++++ 4 files changed, 979 insertions(+), 4 deletions(-) create mode 100644 src/Migrations/Version20251028092901.php create mode 100644 src/Migrations/initial_schema.sql diff --git a/src/Domain/Subscription/Model/UserBlacklist.php b/src/Domain/Subscription/Model/UserBlacklist.php index eb24ded3..0c1510e5 100644 --- a/src/Domain/Subscription/Model/UserBlacklist.php +++ b/src/Domain/Subscription/Model/UserBlacklist.php @@ -21,7 +21,7 @@ class UserBlacklist implements DomainModel #[ORM\Column(name: 'added', type: 'datetime', nullable: true)] private ?DateTime $added = null; - #[ORM\OneToOne(targetEntity: UserBlacklistData::class, mappedBy: 'email')] + #[ORM\OneToOne(targetEntity: UserBlacklistData::class, mappedBy: 'blacklist', cascade: ['persist', 'remove'])] private ?UserBlacklistData $blacklistData = null; public function getEmail(): string @@ -50,4 +50,13 @@ public function getBlacklistData(): ?UserBlacklistData { return $this->blacklistData; } + + public function setBlacklistData(?UserBlacklistData $data): self + { + $this->blacklistData = $data; + if ($data && $data->getBlacklist() !== $this) { + $data->setBlacklist($this); + } + return $this; + } } diff --git a/src/Domain/Subscription/Model/UserBlacklistData.php b/src/Domain/Subscription/Model/UserBlacklistData.php index f8d78c59..e6dbba06 100644 --- a/src/Domain/Subscription/Model/UserBlacklistData.php +++ b/src/Domain/Subscription/Model/UserBlacklistData.php @@ -15,8 +15,9 @@ class UserBlacklistData implements DomainModel { #[ORM\Id] - #[ORM\Column(name: 'email', type: 'string', length: 150)] - private string $email; + #[ORM\OneToOne(targetEntity: UserBlacklist::class, inversedBy: 'blacklistData')] + #[ORM\JoinColumn(name: 'email', referencedColumnName: 'email', nullable: false, onDelete: 'CASCADE')] + private UserBlacklist $blacklist; #[ORM\Column(name: 'name', type: 'string', length: 25)] private string $name; @@ -24,9 +25,20 @@ class UserBlacklistData implements DomainModel #[ORM\Column(name: 'data', type: 'text', nullable: true)] private ?string $data = null; + public function getBlacklist(): UserBlacklist + { + return $this->blacklist; + } + + public function setBlacklist(UserBlacklist $blacklist): self + { + $this->blacklist = $blacklist; + return $this; + } + public function getEmail(): string { - return $this->email; + return $this->blacklist->getEmail(); } public function getName(): string diff --git a/src/Migrations/Version20251028092901.php b/src/Migrations/Version20251028092901.php new file mode 100644 index 00000000..2384ea55 --- /dev/null +++ b/src/Migrations/Version20251028092901.php @@ -0,0 +1,30 @@ +addSql(file_get_contents(__DIR__.'/initial_schema.sql')); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + } +} diff --git a/src/Migrations/initial_schema.sql b/src/Migrations/initial_schema.sql new file mode 100644 index 00000000..bdae040e --- /dev/null +++ b/src/Migrations/initial_schema.sql @@ -0,0 +1,924 @@ +-- MySQL dump 10.13 Distrib 8.0.43, for Linux (x86_64) +-- +-- Host: localhost Database: phplistdb +-- ------------------------------------------------------ +-- Server version 8.0.43-0ubuntu0.20.04.1+esm1 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `phplist_admin` +-- + +DROP TABLE IF EXISTS `phplist_admin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_admin` ( + `id` int NOT NULL AUTO_INCREMENT, + `loginname` varchar(66) NOT NULL, + `namelc` varchar(255) DEFAULT NULL, + `email` varchar(255) NOT NULL, + `created` datetime DEFAULT NULL, + `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `modifiedby` varchar(66) DEFAULT NULL, + `password` varchar(255) DEFAULT NULL, + `passwordchanged` date DEFAULT NULL, + `superuser` tinyint DEFAULT '0', + `disabled` tinyint DEFAULT '0', + `privileges` text, + PRIMARY KEY (`id`), + UNIQUE KEY `loginnameidx` (`loginname`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_admin_attribute` +-- + +DROP TABLE IF EXISTS `phplist_admin_attribute`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_admin_attribute` ( + `adminattributeid` int NOT NULL, + `adminid` int NOT NULL, + `value` varchar(255) DEFAULT NULL, + PRIMARY KEY (`adminattributeid`,`adminid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_admin_login` +-- + +DROP TABLE IF EXISTS `phplist_admin_login`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_admin_login` ( + `id` int NOT NULL AUTO_INCREMENT, + `moment` bigint NOT NULL, + `adminid` int NOT NULL, + `remote_ip4` varchar(32) NOT NULL, + `remote_ip6` varchar(50) NOT NULL, + `sessionid` varchar(50) NOT NULL, + `active` tinyint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=414 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_admin_password_request` +-- + +DROP TABLE IF EXISTS `phplist_admin_password_request`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_admin_password_request` ( + `id_key` int NOT NULL AUTO_INCREMENT, + `date` datetime DEFAULT NULL, + `admin` int DEFAULT NULL, + `key_value` varchar(32) NOT NULL, + PRIMARY KEY (`id_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_adminattribute` +-- + +DROP TABLE IF EXISTS `phplist_adminattribute`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_adminattribute` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `type` varchar(30) DEFAULT NULL, + `listorder` int DEFAULT NULL, + `default_value` varchar(255) DEFAULT NULL, + `required` tinyint DEFAULT NULL, + `tablename` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_admintoken` +-- + +DROP TABLE IF EXISTS `phplist_admintoken`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_admintoken` ( + `id` int NOT NULL AUTO_INCREMENT, + `adminid` int NOT NULL, + `value` varchar(255) DEFAULT NULL, + `entered` int NOT NULL, + `expires` datetime NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3670 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_attachment` +-- + +DROP TABLE IF EXISTS `phplist_attachment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_attachment` ( + `id` int NOT NULL AUTO_INCREMENT, + `filename` varchar(255) DEFAULT NULL, + `remotefile` varchar(255) DEFAULT NULL, + `mimetype` varchar(255) DEFAULT NULL, + `description` text, + `size` int DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_bounce` +-- + +DROP TABLE IF EXISTS `phplist_bounce`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_bounce` ( + `id` int NOT NULL AUTO_INCREMENT, + `date` datetime DEFAULT NULL, + `header` text, + `data` mediumblob, + `status` varchar(255) DEFAULT NULL, + `comment` text, + PRIMARY KEY (`id`), + KEY `dateindex` (`date`), + KEY `statusidx` (`status`(20)) +) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_bounceregex` +-- + +DROP TABLE IF EXISTS `phplist_bounceregex`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_bounceregex` ( + `id` int NOT NULL AUTO_INCREMENT, + `regex` varchar(2083) DEFAULT NULL, + `regexhash` char(32) DEFAULT NULL, + `action` varchar(255) DEFAULT NULL, + `listorder` int DEFAULT '0', + `admin` int DEFAULT NULL, + `comment` text, + `status` varchar(255) DEFAULT NULL, + `count` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `regex` (`regexhash`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_bounceregex_bounce` +-- + +DROP TABLE IF EXISTS `phplist_bounceregex_bounce`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_bounceregex_bounce` ( + `regex` int NOT NULL, + `bounce` int NOT NULL, + PRIMARY KEY (`regex`,`bounce`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_config` +-- + +DROP TABLE IF EXISTS `phplist_config`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_config` ( + `item` varchar(35) NOT NULL, + `value` longtext, + `editable` tinyint DEFAULT '1', + `type` varchar(25) DEFAULT NULL, + PRIMARY KEY (`item`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_eventlog` +-- + +DROP TABLE IF EXISTS `phplist_eventlog`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_eventlog` ( + `id` int NOT NULL AUTO_INCREMENT, + `entered` datetime DEFAULT NULL, + `page` varchar(100) DEFAULT NULL, + `entry` text, + PRIMARY KEY (`id`), + KEY `enteredidx` (`entered`), + KEY `pageidx` (`page`) +) ENGINE=InnoDB AUTO_INCREMENT=343 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_i18n` +-- + +DROP TABLE IF EXISTS `phplist_i18n`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_i18n` ( + `lan` varchar(10) NOT NULL, + `original` text NOT NULL, + `translation` text NOT NULL, + UNIQUE KEY `lanorigunq` (`lan`,`original`(200)), + KEY `lanorigidx` (`lan`,`original`(200)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_linktrack` +-- + +DROP TABLE IF EXISTS `phplist_linktrack`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_linktrack` ( + `linkid` int NOT NULL AUTO_INCREMENT, + `messageid` int NOT NULL, + `userid` int NOT NULL, + `url` varchar(255) DEFAULT NULL, + `forward` varchar(255) DEFAULT NULL, + `firstclick` datetime DEFAULT NULL, + `latestclick` timestamp NULL DEFAULT NULL, + `clicked` int DEFAULT '0', + PRIMARY KEY (`linkid`), + UNIQUE KEY `miduidurlindex` (`messageid`,`userid`,`url`), + KEY `midindex` (`messageid`), + KEY `uidindex` (`userid`), + KEY `urlindex` (`url`), + KEY `miduidindex` (`messageid`,`userid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_linktrack_forward` +-- + +DROP TABLE IF EXISTS `phplist_linktrack_forward`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_linktrack_forward` ( + `id` int NOT NULL AUTO_INCREMENT, + `url` varchar(2083) DEFAULT NULL, + `urlhash` char(32) DEFAULT NULL, + `uuid` varchar(36) DEFAULT '', + `personalise` tinyint DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `urlunique` (`urlhash`), + KEY `urlindex` (`url`(255)), + KEY `uuididx` (`uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_linktrack_ml` +-- + +DROP TABLE IF EXISTS `phplist_linktrack_ml`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_linktrack_ml` ( + `messageid` int NOT NULL, + `forwardid` int NOT NULL, + `firstclick` datetime DEFAULT NULL, + `latestclick` datetime DEFAULT NULL, + `total` int DEFAULT '0', + `clicked` int DEFAULT '0', + `htmlclicked` int DEFAULT '0', + `textclicked` int DEFAULT '0', + PRIMARY KEY (`messageid`,`forwardid`), + KEY `midindex` (`messageid`), + KEY `fwdindex` (`forwardid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_linktrack_uml_click` +-- + +DROP TABLE IF EXISTS `phplist_linktrack_uml_click`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_linktrack_uml_click` ( + `id` int NOT NULL AUTO_INCREMENT, + `messageid` int NOT NULL, + `userid` int NOT NULL, + `forwardid` int DEFAULT NULL, + `firstclick` datetime DEFAULT NULL, + `latestclick` datetime DEFAULT NULL, + `clicked` int DEFAULT '0', + `htmlclicked` int DEFAULT '0', + `textclicked` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `miduidfwdid` (`messageid`,`userid`,`forwardid`), + KEY `midindex` (`messageid`), + KEY `uidindex` (`userid`), + KEY `miduidindex` (`messageid`,`userid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_linktrack_userclick` +-- + +DROP TABLE IF EXISTS `phplist_linktrack_userclick`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_linktrack_userclick` ( + `linkid` int NOT NULL, + `userid` int NOT NULL, + `messageid` int NOT NULL, + `name` varchar(255) DEFAULT NULL, + `data` text, + `date` datetime DEFAULT NULL, + KEY `linkindex` (`linkid`), + KEY `uidindex` (`userid`), + KEY `midindex` (`messageid`), + KEY `linkuserindex` (`linkid`,`userid`), + KEY `linkusermessageindex` (`linkid`,`userid`,`messageid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_list` +-- + +DROP TABLE IF EXISTS `phplist_list`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_list` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `description` text, + `entered` datetime DEFAULT NULL, + `listorder` int DEFAULT NULL, + `prefix` varchar(10) DEFAULT NULL, + `rssfeed` varchar(255) DEFAULT NULL, + `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `active` tinyint DEFAULT NULL, + `owner` int DEFAULT NULL, + `category` varchar(255) DEFAULT '', + PRIMARY KEY (`id`), + KEY `nameidx` (`name`), + KEY `listorderidx` (`listorder`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_listattr_becities` +-- + +DROP TABLE IF EXISTS `phplist_listattr_becities`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_listattr_becities` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `listorder` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`(150)) +) ENGINE=InnoDB AUTO_INCREMENT=2680 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_listattr_termsofservice` +-- + +DROP TABLE IF EXISTS `phplist_listattr_termsofservice`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_listattr_termsofservice` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `listorder` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`(150)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_listattr_ukcounties` +-- + +DROP TABLE IF EXISTS `phplist_listattr_ukcounties`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_listattr_ukcounties` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `listorder` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`(150)) +) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_listattr_ukcounties1` +-- + +DROP TABLE IF EXISTS `phplist_listattr_ukcounties1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_listattr_ukcounties1` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `listorder` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`(150)) +) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_listmessage` +-- + +DROP TABLE IF EXISTS `phplist_listmessage`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_listmessage` ( + `id` int NOT NULL AUTO_INCREMENT, + `messageid` int NOT NULL, + `listid` int NOT NULL, + `entered` datetime DEFAULT NULL, + `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + UNIQUE KEY `messageid` (`messageid`,`listid`), + KEY `listmessageidx` (`listid`,`messageid`) +) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_listuser` +-- + +DROP TABLE IF EXISTS `phplist_listuser`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_listuser` ( + `userid` int NOT NULL, + `listid` int NOT NULL, + `entered` datetime DEFAULT NULL, + `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`userid`,`listid`), + KEY `userenteredidx` (`userid`,`entered`), + KEY `userlistenteredidx` (`userid`,`listid`,`entered`), + KEY `useridx` (`userid`), + KEY `listidx` (`listid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_message` +-- + +DROP TABLE IF EXISTS `phplist_message`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_message` ( + `id` int NOT NULL AUTO_INCREMENT, + `uuid` varchar(36) DEFAULT '', + `subject` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '(no subject)', + `fromfield` varchar(255) NOT NULL DEFAULT '', + `tofield` varchar(255) NOT NULL DEFAULT '', + `replyto` varchar(255) NOT NULL DEFAULT '', + `message` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `textmessage` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `footer` text, + `entered` datetime DEFAULT NULL, + `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `embargo` datetime DEFAULT NULL, + `repeatinterval` int DEFAULT '0', + `repeatuntil` datetime DEFAULT NULL, + `requeueinterval` int DEFAULT '0', + `requeueuntil` datetime DEFAULT NULL, + `status` varchar(255) DEFAULT NULL, + `userselection` text, + `sent` datetime DEFAULT NULL, + `htmlformatted` tinyint DEFAULT '0', + `sendformat` varchar(20) DEFAULT NULL, + `template` int DEFAULT NULL, + `processed` int unsigned DEFAULT '0', + `astext` int DEFAULT '0', + `ashtml` int DEFAULT '0', + `astextandhtml` int DEFAULT '0', + `aspdf` int DEFAULT '0', + `astextandpdf` int DEFAULT '0', + `viewed` int DEFAULT '0', + `bouncecount` int DEFAULT '0', + `sendstart` datetime DEFAULT NULL, + `rsstemplate` varchar(100) DEFAULT NULL, + `owner` int DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `uuididx` (`uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_message_attachment` +-- + +DROP TABLE IF EXISTS `phplist_message_attachment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_message_attachment` ( + `id` int NOT NULL AUTO_INCREMENT, + `messageid` int NOT NULL, + `attachmentid` int NOT NULL, + PRIMARY KEY (`id`), + KEY `messageidx` (`messageid`), + KEY `messageattidx` (`messageid`,`attachmentid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_messagedata` +-- + +DROP TABLE IF EXISTS `phplist_messagedata`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_messagedata` ( + `name` varchar(100) NOT NULL, + `id` int NOT NULL, + `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + PRIMARY KEY (`name`,`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_sendprocess` +-- + +DROP TABLE IF EXISTS `phplist_sendprocess`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_sendprocess` ( + `id` int NOT NULL AUTO_INCREMENT, + `started` datetime DEFAULT NULL, + `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `alive` int DEFAULT '1', + `ipaddress` varchar(50) DEFAULT NULL, + `page` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_subscribepage` +-- + +DROP TABLE IF EXISTS `phplist_subscribepage`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_subscribepage` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `active` tinyint DEFAULT '0', + `owner` int DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_subscribepage_data` +-- + +DROP TABLE IF EXISTS `phplist_subscribepage_data`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_subscribepage_data` ( + `id` int NOT NULL, + `name` varchar(100) NOT NULL, + `data` text, + PRIMARY KEY (`id`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_template` +-- + +DROP TABLE IF EXISTS `phplist_template`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_template` ( + `id` int NOT NULL AUTO_INCREMENT, + `title` varchar(255) NOT NULL, + `template` longblob, + `template_text` longblob, + `listorder` int DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `title` (`title`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_templateimage` +-- + +DROP TABLE IF EXISTS `phplist_templateimage`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_templateimage` ( + `id` int NOT NULL AUTO_INCREMENT, + `template` int NOT NULL DEFAULT '0', + `mimetype` varchar(100) DEFAULT NULL, + `filename` varchar(100) DEFAULT NULL, + `data` longblob, + `width` int DEFAULT NULL, + `height` int DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `templateidx` (`template`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_urlcache` +-- + +DROP TABLE IF EXISTS `phplist_urlcache`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_urlcache` ( + `id` int NOT NULL AUTO_INCREMENT, + `url` varchar(2083) NOT NULL, + `lastmodified` int DEFAULT NULL, + `added` datetime DEFAULT NULL, + `content` longblob, + PRIMARY KEY (`id`), + KEY `urlindex` (`url`(255)) +) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_attribute` +-- + +DROP TABLE IF EXISTS `phplist_user_attribute`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_user_attribute` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `type` varchar(30) DEFAULT NULL, + `listorder` int DEFAULT NULL, + `default_value` varchar(255) DEFAULT NULL, + `required` tinyint DEFAULT NULL, + `tablename` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `nameindex` (`name`), + KEY `idnameindex` (`id`,`name`) +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_blacklist` +-- + +DROP TABLE IF EXISTS `phplist_user_blacklist`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_user_blacklist` ( + `email` varchar(255) NOT NULL, + `added` datetime DEFAULT NULL, + UNIQUE KEY `email` (`email`), + KEY `emailidx` (`email`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_blacklist_data` +-- + +DROP TABLE IF EXISTS `phplist_user_blacklist_data`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_user_blacklist_data` ( + `email` varchar(150) NOT NULL, + `name` varchar(25) NOT NULL, + `data` text, + UNIQUE KEY `email` (`email`), + KEY `emailidx` (`email`), + KEY `emailnameidx` (`email`,`name`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_message_bounce` +-- + +DROP TABLE IF EXISTS `phplist_user_message_bounce`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_user_message_bounce` ( + `id` int NOT NULL AUTO_INCREMENT, + `user` int NOT NULL, + `message` int NOT NULL, + `bounce` int NOT NULL, + `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `umbindex` (`user`,`message`,`bounce`), + KEY `useridx` (`user`), + KEY `msgidx` (`message`), + KEY `bounceidx` (`bounce`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_message_forward` +-- + +DROP TABLE IF EXISTS `phplist_user_message_forward`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_user_message_forward` ( + `id` int NOT NULL AUTO_INCREMENT, + `user` int NOT NULL, + `message` int NOT NULL, + `forward` varchar(255) DEFAULT NULL, + `status` varchar(255) DEFAULT NULL, + `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`id`), + KEY `usermessageidx` (`user`,`message`), + KEY `useridx` (`user`), + KEY `messageidx` (`message`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_message_view` +-- + +DROP TABLE IF EXISTS `phplist_user_message_view`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_user_message_view` ( + `id` int NOT NULL AUTO_INCREMENT, + `messageid` int NOT NULL, + `userid` int NOT NULL, + `viewed` datetime DEFAULT NULL, + `ip` varchar(255) DEFAULT NULL, + `data` longtext, + PRIMARY KEY (`id`), + KEY `usermsgidx` (`userid`,`messageid`), + KEY `msgidx` (`messageid`), + KEY `useridx` (`userid`) +) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_user` +-- + +DROP TABLE IF EXISTS `phplist_user_user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_user_user` ( + `id` int NOT NULL AUTO_INCREMENT, + `email` varchar(255) NOT NULL, + `confirmed` tinyint DEFAULT '0', + `blacklisted` tinyint DEFAULT '0', + `optedin` tinyint DEFAULT '0', + `bouncecount` int DEFAULT '0', + `entered` datetime DEFAULT NULL, + `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `uniqid` varchar(255) DEFAULT NULL, + `uuid` varchar(36) DEFAULT '', + `htmlemail` tinyint DEFAULT '0', + `subscribepage` int DEFAULT NULL, + `rssfrequency` varchar(100) DEFAULT NULL, + `password` varchar(255) DEFAULT NULL, + `passwordchanged` date DEFAULT NULL, + `disabled` tinyint DEFAULT '0', + `extradata` text, + `foreignkey` varchar(100) DEFAULT NULL, + PRIMARY KEY (`id`), + UNIQUE KEY `email` (`email`), + KEY `foreignkey` (`foreignkey`), + KEY `idxuniqid` (`uniqid`), + KEY `enteredindex` (`entered`), + KEY `confidx` (`confirmed`), + KEY `blidx` (`blacklisted`), + KEY `optidx` (`optedin`), + KEY `uuididx` (`uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_user_attribute` +-- + +DROP TABLE IF EXISTS `phplist_user_user_attribute`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_user_user_attribute` ( + `attributeid` int NOT NULL, + `userid` int NOT NULL, + `value` text, + PRIMARY KEY (`attributeid`,`userid`), + KEY `userindex` (`userid`), + KEY `attindex` (`attributeid`), + KEY `attuserid` (`userid`,`attributeid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_user_history` +-- + +DROP TABLE IF EXISTS `phplist_user_user_history`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_user_user_history` ( + `id` int NOT NULL AUTO_INCREMENT, + `userid` int NOT NULL, + `ip` varchar(255) DEFAULT NULL, + `date` datetime DEFAULT NULL, + `summary` varchar(255) DEFAULT NULL, + `detail` text, + `systeminfo` text, + PRIMARY KEY (`id`), + KEY `userididx` (`userid`), + KEY `dateidx` (`date`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_usermessage` +-- + +DROP TABLE IF EXISTS `phplist_usermessage`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_usermessage` ( + `messageid` int NOT NULL, + `userid` int NOT NULL, + `entered` datetime NOT NULL, + `viewed` datetime DEFAULT NULL, + `status` varchar(255) DEFAULT NULL, + PRIMARY KEY (`userid`,`messageid`), + KEY `messageidindex` (`messageid`), + KEY `useridindex` (`userid`), + KEY `enteredindex` (`entered`), + KEY `statusidx` (`status`), + KEY `viewedidx` (`viewed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_userstats` +-- + +DROP TABLE IF EXISTS `phplist_userstats`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_userstats` ( + `id` int NOT NULL AUTO_INCREMENT, + `unixdate` int DEFAULT NULL, + `item` varchar(255) DEFAULT NULL, + `listid` int DEFAULT '0', + `value` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `entry` (`unixdate`,`item`,`listid`), + KEY `dateindex` (`unixdate`), + KEY `itemindex` (`item`), + KEY `listindex` (`listid`), + KEY `listdateindex` (`listid`,`unixdate`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-10-28 14:22:41 From adde5c35c12323475e5ef5561c24bbddd61c9d14 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Tue, 28 Oct 2025 15:05:04 +0400 Subject: [PATCH 05/22] In progress --- src/Domain/Analytics/Model/UserStats.php | 4 ++-- src/Migrations/initial_schema.sql | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Domain/Analytics/Model/UserStats.php b/src/Domain/Analytics/Model/UserStats.php index a2f835bf..85fe7eb8 100644 --- a/src/Domain/Analytics/Model/UserStats.php +++ b/src/Domain/Analytics/Model/UserStats.php @@ -32,8 +32,8 @@ class UserStats implements DomainModel, Identity #[ORM\Column(name: 'listid', type: 'integer', options: ['default' => 0])] private int $listId = 0; - #[ORM\Column(name: 'value', type: 'integer', options: ['default' => 0])] - private int $value = 0; + #[ORM\Column(name: 'value', type: 'integer', nullable: false)] + private int $value; public function getId(): ?int { diff --git a/src/Migrations/initial_schema.sql b/src/Migrations/initial_schema.sql index bdae040e..c22ff92b 100644 --- a/src/Migrations/initial_schema.sql +++ b/src/Migrations/initial_schema.sql @@ -402,7 +402,7 @@ CREATE TABLE `phplist_listattr_becities` ( `listorder` int DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`(150)) -) ENGINE=InnoDB AUTO_INCREMENT=2680 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE=InnoDB AUTO_INCREMENT=2680 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -418,7 +418,7 @@ CREATE TABLE `phplist_listattr_termsofservice` ( `listorder` int DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`(150)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -434,7 +434,7 @@ CREATE TABLE `phplist_listattr_ukcounties` ( `listorder` int DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`(150)) -) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -450,7 +450,7 @@ CREATE TABLE `phplist_listattr_ukcounties1` ( `listorder` int DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `name` (`name`(150)) -) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci; +) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=utf8mb4; /*!40101 SET character_set_client = @saved_cs_client */; -- From 60a5d08a6420f24ef839251efdb80463fbc812aa Mon Sep 17 00:00:00 2001 From: Tatevik Date: Wed, 29 Oct 2025 10:27:23 +0400 Subject: [PATCH 06/22] Fix mapping --- .../Service/SubscriberBlacklistService.php | 4 +-- src/Core/Doctrine/OnlyOrmTablesFilter.php | 7 +++--- src/Domain/Analytics/Model/LinkTrack.php | 8 +++++- src/Domain/Analytics/Model/UserStats.php | 6 ++--- src/Domain/Configuration/Model/EventLog.php | 9 +++++++ src/Domain/Configuration/Model/UrlCache.php | 8 +++--- src/Domain/Identity/Model/AdminLogin.php | 2 +- .../Identity/Model/AdminPasswordRequest.php | 1 - src/Domain/Identity/Model/Administrator.php | 25 ++++++------------- .../Identity/Model/AdministratorToken.php | 10 +++++--- .../Identity/Service/SessionManager.php | 5 +--- src/Domain/Messaging/Model/Bounce.php | 2 +- src/Domain/Messaging/Model/ListMessage.php | 17 ++++++------- src/Domain/Messaging/Model/Message.php | 19 +++++++------- .../Messaging/Model/Message/MessageFormat.php | 2 +- .../Model/Message/MessageMetadata.php | 2 +- src/Domain/Messaging/Model/SendProcess.php | 4 +-- .../Messaging/Model/UserMessageBounce.php | 1 - .../Service/Manager/ListMessageManager.php | 1 - src/Domain/Subscription/Model/Subscriber.php | 4 +-- .../Model/SubscriberAttributeValue.php | 2 +- .../Subscription/Model/SubscriberList.php | 25 ++++++++++++++----- .../Subscription/Model/Subscription.php | 4 +-- .../Subscription/Model/UserBlacklist.php | 12 ++++----- .../Subscription/Model/UserBlacklistData.php | 6 ----- .../Manager/SubscriberBlacklistManager.php | 11 +++----- src/Migrations/Version20251028092901.php | 9 +++---- ...nistratorTokenWithAdministratorFixture.php | 2 +- .../AdministratorRepositoryTest.php | 6 ++--- .../Repository/MessageRepositoryTest.php | 6 ++--- .../Fixtures/SubscriberListFixture.php | 3 ++- .../Service/SubscriberDeletionServiceTest.php | 2 +- .../Identity/Model/AdministratorTest.php | 2 +- .../Identity/Model/AdministratorTokenTest.php | 11 ++------ 34 files changed, 116 insertions(+), 122 deletions(-) diff --git a/src/Bounce/Service/SubscriberBlacklistService.php b/src/Bounce/Service/SubscriberBlacklistService.php index eee70215..38d37e7d 100644 --- a/src/Bounce/Service/SubscriberBlacklistService.php +++ b/src/Bounce/Service/SubscriberBlacklistService.php @@ -40,7 +40,7 @@ public function blacklist(Subscriber $subscriber, string $reason): void { $subscriber->setBlacklisted(true); $this->entityManager->flush(); - $this->blacklistManager->addEmailToBlacklist($subscriber->getEmail(), $reason); + $userBlacklist = $this->blacklistManager->addEmailToBlacklist($subscriber->getEmail(), $reason); $this->entityManager->flush(); foreach (['REMOTE_ADDR','HTTP_X_FORWARDED_FOR'] as $item) { @@ -50,7 +50,7 @@ public function blacklist(Subscriber $subscriber, string $reason): void } if ($request->server->get($item)) { $this->blacklistManager->addBlacklistData( - email: $subscriber->getEmail(), + userBlacklist: $userBlacklist, name: $item, data: $request->server->get($item) ); diff --git a/src/Core/Doctrine/OnlyOrmTablesFilter.php b/src/Core/Doctrine/OnlyOrmTablesFilter.php index a2f5b5a4..7601c81a 100644 --- a/src/Core/Doctrine/OnlyOrmTablesFilter.php +++ b/src/Core/Doctrine/OnlyOrmTablesFilter.php @@ -11,21 +11,22 @@ class OnlyOrmTablesFilter /** @var string[]|null */ private ?array $allow = null; - public function __construct(private readonly EntityManagerInterface $em) + public function __construct(private readonly EntityManagerInterface $entityManager) { } public function __invoke(string $assetName): bool { // asset names can be "schema.table" ➜ normalize - if (false !== ($pos = strrpos($assetName, '.'))) { + $pos = strrpos($assetName, '.'); + if ($pos !== false) { $assetName = substr($assetName, $pos + 1); } // Build the whitelist lazily to avoid touching the EM during container compilation or early boot. if ($this->allow === null) { $names = []; - foreach ($this->em->getMetadataFactory()->getAllMetadata() as $m) { + foreach ($this->entityManager->getMetadataFactory()->getAllMetadata() as $m) { // main table $table = $m->getTableName(); if ($table) { diff --git a/src/Domain/Analytics/Model/LinkTrack.php b/src/Domain/Analytics/Model/LinkTrack.php index 2dc32de6..65f56318 100644 --- a/src/Domain/Analytics/Model/LinkTrack.php +++ b/src/Domain/Analytics/Model/LinkTrack.php @@ -4,6 +4,7 @@ namespace PhpList\Core\Domain\Analytics\Model; +use DateTime; use DateTimeInterface; use Doctrine\ORM\Mapping as ORM; use PhpList\Core\Domain\Analytics\Repository\LinkTrackRepository; @@ -39,12 +40,17 @@ class LinkTrack implements DomainModel, Identity #[ORM\Column(name: 'firstclick', type: 'datetime', nullable: true)] private ?DateTimeInterface $firstClick = null; - #[ORM\Column(name: 'latestclick', type: 'datetime', nullable: true, options: ['default' => 'CURRENT_TIMESTAMP'])] + #[ORM\Column(name: 'latestclick', type: 'datetime')] private ?DateTimeInterface $latestClick = null; #[ORM\Column(type: 'integer', nullable: true, options: ['default' => 0])] private int $clicked = 0; + public function __construct() + { + $this->latestClick = new DateTime(); + } + public function getId(): int { return $this->id; diff --git a/src/Domain/Analytics/Model/UserStats.php b/src/Domain/Analytics/Model/UserStats.php index 85fe7eb8..ef1eb469 100644 --- a/src/Domain/Analytics/Model/UserStats.php +++ b/src/Domain/Analytics/Model/UserStats.php @@ -29,11 +29,11 @@ class UserStats implements DomainModel, Identity #[ORM\Column(name: 'item', type: 'string', length: 255, nullable: true)] private ?string $item = null; - #[ORM\Column(name: 'listid', type: 'integer', options: ['default' => 0])] + #[ORM\Column(name: 'listid', type: 'integer', nullable: true, options: ['default' => 0])] private int $listId = 0; - #[ORM\Column(name: 'value', type: 'integer', nullable: false)] - private int $value; + #[ORM\Column(name: 'value', type: 'integer', nullable: true, options: ['default' => 0])] + private ?int $value = null; public function getId(): ?int { diff --git a/src/Domain/Configuration/Model/EventLog.php b/src/Domain/Configuration/Model/EventLog.php index 170171ee..a5dbfdae 100644 --- a/src/Domain/Configuration/Model/EventLog.php +++ b/src/Domain/Configuration/Model/EventLog.php @@ -4,6 +4,7 @@ namespace PhpList\Core\Domain\Configuration\Model; +use DateTimeImmutable; use DateTimeInterface; use Doctrine\ORM\Mapping as ORM; use PhpList\Core\Domain\Common\Model\Interfaces\DomainModel; @@ -14,6 +15,7 @@ #[ORM\Table(name: 'phplist_eventlog')] #[ORM\Index(name: 'enteredidx', columns: ['entered'])] #[ORM\Index(name: 'pageidx', columns: ['page'])] +#[ORM\HasLifecycleCallbacks] class EventLog implements DomainModel, Identity { #[ORM\Id] @@ -35,6 +37,13 @@ public function getId(): ?int return $this->id; } + #[ORM\PrePersist] + public function setCreatedTimestamps(): void + { + $now = new DateTimeImmutable(); + $this->entered = $now; + } + public function getEntered(): ?DateTimeInterface { return $this->entered; diff --git a/src/Domain/Configuration/Model/UrlCache.php b/src/Domain/Configuration/Model/UrlCache.php index 5d460104..1f62268f 100644 --- a/src/Domain/Configuration/Model/UrlCache.php +++ b/src/Domain/Configuration/Model/UrlCache.php @@ -13,6 +13,7 @@ #[ORM\Entity(repositoryClass: UrlCacheRepository::class)] #[ORM\Table(name: 'phplist_urlcache')] #[ORM\Index(name: 'urlindex', columns: ['url'])] +#[ORM\HasLifecycleCallbacks] class UrlCache implements DomainModel, Identity { #[ORM\Id] @@ -71,10 +72,11 @@ public function setLastModified(?int $lastModified): self return $this; } - public function setAdded(?DateTime $added): self + #[ORM\PrePersist] + public function setCreatedTimestamps(): void { - $this->added = $added; - return $this; + $now = new DateTime(); + $this->added = $now; } public function setContent(?string $content): self diff --git a/src/Domain/Identity/Model/AdminLogin.php b/src/Domain/Identity/Model/AdminLogin.php index b7c30e58..91be3331 100644 --- a/src/Domain/Identity/Model/AdminLogin.php +++ b/src/Domain/Identity/Model/AdminLogin.php @@ -37,7 +37,7 @@ class AdminLogin implements DomainModel, Identity #[ORM\Column(name: 'sessionid', type: 'string', length: 50)] private string $sessionId; - #[ORM\Column(name: 'active', type: 'boolean')] + #[ORM\Column(name: 'active', type: 'boolean', nullable: false)] private bool $active = false; public function __construct( diff --git a/src/Domain/Identity/Model/AdminPasswordRequest.php b/src/Domain/Identity/Model/AdminPasswordRequest.php index c06a45eb..0d761adf 100644 --- a/src/Domain/Identity/Model/AdminPasswordRequest.php +++ b/src/Domain/Identity/Model/AdminPasswordRequest.php @@ -12,7 +12,6 @@ #[ORM\Entity(repositoryClass: AdminPasswordRequestRepository::class)] #[ORM\Table(name: 'phplist_admin_password_request')] -#[ORM\HasLifecycleCallbacks] class AdminPasswordRequest implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Identity/Model/Administrator.php b/src/Domain/Identity/Model/Administrator.php index 5db61471..34c8a49b 100644 --- a/src/Domain/Identity/Model/Administrator.php +++ b/src/Domain/Identity/Model/Administrator.php @@ -22,10 +22,8 @@ * @author Tatevik Grigoryan */ #[ORM\Entity(repositoryClass: AdministratorRepository::class)] -#[ORM\Table( - name: 'phplist_admin', - uniqueConstraints: [new ORM\UniqueConstraint(name: 'loginnameidx', columns: ['loginname'])] -)] +#[ORM\Table(name: 'phplist_admin')] +#[ORM\UniqueConstraint(name: 'loginnameidx', columns: ['loginname'])] #[ORM\HasLifecycleCallbacks] class Administrator implements DomainModel, Identity, CreationDate, ModificationDate { @@ -35,7 +33,7 @@ class Administrator implements DomainModel, Identity, CreationDate, Modification private ?int $id = null; #[ORM\Column(name: 'created', type: 'datetime', nullable: true)] - protected ?DateTime $createdAt = null; + protected DateTime $createdAt; #[ORM\Column(name: 'modified', type: 'datetime', nullable: false)] private DateTime $updatedAt; @@ -71,7 +69,6 @@ public function __construct() { $this->createdAt = new DateTime(); $this->updatedAt = new DateTime(); - $this->loginName = ''; $this->email = ''; } @@ -80,7 +77,7 @@ public function getId(): ?int return $this->id; } - public function getCreatedAt(): ?DateTime + public function getCreatedAt(): DateTime { return $this->createdAt; } @@ -170,6 +167,8 @@ public function setPrivileges(Privileges $privileges): self /** * @throws InvalidArgumentException + * + * @SuppressWarnings(PHPMD.StaticAccess) */ public function setPrivilegesFromArray(array $privilegesData): void { @@ -184,6 +183,7 @@ public function setPrivilegesFromArray(array $privilegesData): void $this->setPrivileges($privileges); } + /** @SuppressWarnings(PHPMD.StaticAccess) */ public function getPrivileges(): Privileges { return Privileges::fromSerialized($this->privileges); @@ -209,17 +209,8 @@ public function owns(OwnableInterface $resource): bool return $resource->getOwner()->getId() === $this->getId(); } - #[ORM\PrePersist] - public function onPrePersist(): void - { - if ($this->createdAt === null) { - $this->createdAt = new DateTime(); - } - $this->updatedAt = new DateTime(); - } - #[ORM\PreUpdate] - public function onPreUpdate(): void + public function setUpdatedAt(): void { $this->updatedAt = new DateTime(); } diff --git a/src/Domain/Identity/Model/AdministratorToken.php b/src/Domain/Identity/Model/AdministratorToken.php index 1a6c511f..f857b2da 100644 --- a/src/Domain/Identity/Model/AdministratorToken.php +++ b/src/Domain/Identity/Model/AdministratorToken.php @@ -44,11 +44,13 @@ class AdministratorToken implements DomainModel, Identity, CreationDate #[ORM\ManyToOne(targetEntity: Administrator::class)] #[ORM\JoinColumn(name: 'adminid', referencedColumnName: 'id', onDelete: 'CASCADE')] - private ?Administrator $administrator = null; + private Administrator $administrator; - public function __construct() + public function __construct(Administrator $administrator) { - $this->setExpiry(new DateTime()); + $this->generateExpiry(); + $this->generateKey(); + $this->administrator = $administrator; } public function getId(): ?int @@ -112,7 +114,7 @@ public function generateKey(): self return $this; } - public function getAdministrator(): Administrator|Proxy|null + public function getAdministrator(): Administrator|Proxy { return $this->administrator; } diff --git a/src/Domain/Identity/Service/SessionManager.php b/src/Domain/Identity/Service/SessionManager.php index 658799f7..cfeaa706 100644 --- a/src/Domain/Identity/Service/SessionManager.php +++ b/src/Domain/Identity/Service/SessionManager.php @@ -47,10 +47,7 @@ public function createSession(string $loginName, string $password): Administrato throw new UnauthorizedHttpException('', $message, null, 1500567099); } - $token = new AdministratorToken(); - $token->setAdministrator($administrator); - $token->generateExpiry(); - $token->generateKey(); + $token = new AdministratorToken($administrator); $this->tokenRepository->persist($token); return $token; diff --git a/src/Domain/Messaging/Model/Bounce.php b/src/Domain/Messaging/Model/Bounce.php index 8d665d72..b90f7ef0 100644 --- a/src/Domain/Messaging/Model/Bounce.php +++ b/src/Domain/Messaging/Model/Bounce.php @@ -30,7 +30,7 @@ class Bounce implements DomainModel, Identity #[ORM\Column(type: 'blob', nullable: true)] private ?string $data; - #[ORM\Column(type: 'string', length: 255, nullable: true)] + #[ORM\Column(type: 'string', length: 20, nullable: true)] private ?string $status; #[ORM\Column(type: 'text', nullable: true)] diff --git a/src/Domain/Messaging/Model/ListMessage.php b/src/Domain/Messaging/Model/ListMessage.php index a9751e7f..bf586e7c 100644 --- a/src/Domain/Messaging/Model/ListMessage.php +++ b/src/Domain/Messaging/Model/ListMessage.php @@ -39,6 +39,12 @@ class ListMessage implements DomainModel, Identity, ModificationDate #[ORM\Column(name: 'modified', type: 'datetime')] private ?DateTime $updatedAt = null; + public function __construct() + { + $this->updatedAt = new DateTime(); + $this->entered = new DateTime(); + } + public function getId(): ?int { return $this->id; @@ -71,23 +77,14 @@ public function getEntered(): ?DateTimeInterface return $this->entered; } - public function setEntered(?DateTimeInterface $entered): self - { - $this->entered = $entered; - return $this; - } - public function getUpdatedAt(): ?DateTime { return $this->updatedAt; } - #[ORM\PrePersist] #[ORM\PreUpdate] - public function updateUpdatedAt(): DomainModel + public function updateUpdatedAt(): void { $this->updatedAt = new DateTime(); - - return $this; } } diff --git a/src/Domain/Messaging/Model/Message.php b/src/Domain/Messaging/Model/Message.php index 5064c4f1..cc81bafa 100644 --- a/src/Domain/Messaging/Model/Message.php +++ b/src/Domain/Messaging/Model/Message.php @@ -5,6 +5,7 @@ namespace PhpList\Core\Domain\Messaging\Model; use DateTime; +use DateTimeImmutable; use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\Mapping as ORM; @@ -31,8 +32,8 @@ class Message implements DomainModel, Identity, ModificationDate, OwnableInterfa #[ORM\GeneratedValue] private ?int $id = null; - #[ORM\Column(name: 'modified', type: 'datetime')] - private ?DateTime $updatedAt = null; + #[ORM\Column(name: 'modified', type: 'datetime', nullable: false)] + private DateTimeImmutable $updatedAt; #[ORM\Embedded(class: MessageFormat::class, columnPrefix: false)] private MessageFormat $format; @@ -81,6 +82,8 @@ public function __construct( $this->owner = $owner; $this->template = $template; $this->listMessages = new ArrayCollection(); + $this->updatedAt = new DateTimeImmutable(); + $this->metadata->setEntered(new DateTime()); } public function getId(): ?int @@ -88,18 +91,16 @@ public function getId(): ?int return $this->id; } - public function getUpdatedAt(): ?DateTime + /** @SuppressWarnings(PHPMD.StaticAccess) */ + public function getUpdatedAt(): DateTime { - return $this->updatedAt; + return DateTime::createFromImmutable($this->updatedAt); } - #[ORM\PrePersist] #[ORM\PreUpdate] - public function updateUpdatedAt(): DomainModel + public function touchUpdatedTimestamp(): void { - $this->updatedAt = new DateTime(); - - return $this; + $this->updatedAt = new DateTimeImmutable(); } public function getFormat(): MessageFormat diff --git a/src/Domain/Messaging/Model/Message/MessageFormat.php b/src/Domain/Messaging/Model/Message/MessageFormat.php index 00af6df0..b76558ff 100644 --- a/src/Domain/Messaging/Model/Message/MessageFormat.php +++ b/src/Domain/Messaging/Model/Message/MessageFormat.php @@ -11,7 +11,7 @@ #[ORM\Embeddable] class MessageFormat implements EmbeddableInterface { - #[ORM\Column(name: 'htmlformatted', type: 'boolean', options: ['default' => false])] + #[ORM\Column(name: 'htmlformatted', type: 'boolean')] private bool $htmlFormatted = false; #[ORM\Column(name: 'sendformat', type: 'string', length: 20, nullable: true)] diff --git a/src/Domain/Messaging/Model/Message/MessageMetadata.php b/src/Domain/Messaging/Model/Message/MessageMetadata.php index 156539b2..e2c43c72 100644 --- a/src/Domain/Messaging/Model/Message/MessageMetadata.php +++ b/src/Domain/Messaging/Model/Message/MessageMetadata.php @@ -16,7 +16,7 @@ class MessageMetadata implements EmbeddableInterface private ?string $status = null; #[ORM\Column(type: 'boolean', options: ['unsigned' => true, 'default' => false])] - private bool $processed; + private bool $processed = false; #[ORM\Column(type: 'integer', options: ['default' => 0])] private int $viewed = 0; diff --git a/src/Domain/Messaging/Model/SendProcess.php b/src/Domain/Messaging/Model/SendProcess.php index 7b2287d4..5faeaf35 100644 --- a/src/Domain/Messaging/Model/SendProcess.php +++ b/src/Domain/Messaging/Model/SendProcess.php @@ -48,11 +48,9 @@ public function getUpdatedAt(): ?DateTime #[ORM\PrePersist] #[ORM\PreUpdate] - public function updateUpdatedAt(): DomainModel + public function updateUpdatedAt(): void { $this->updatedAt = new DateTime(); - - return $this; } public function getStartedDate(): ?DateTime diff --git a/src/Domain/Messaging/Model/UserMessageBounce.php b/src/Domain/Messaging/Model/UserMessageBounce.php index 5da0d139..b4adbaa9 100644 --- a/src/Domain/Messaging/Model/UserMessageBounce.php +++ b/src/Domain/Messaging/Model/UserMessageBounce.php @@ -16,7 +16,6 @@ #[ORM\Index(name: 'msgidx', columns: ['message'])] #[ORM\Index(name: 'umbindex', columns: ['user', 'message', 'bounce'])] #[ORM\Index(name: 'useridx', columns: ['user'])] -#[ORM\HasLifecycleCallbacks] class UserMessageBounce implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Messaging/Service/Manager/ListMessageManager.php b/src/Domain/Messaging/Service/Manager/ListMessageManager.php index c481e5f8..bc6a6bfe 100644 --- a/src/Domain/Messaging/Service/Manager/ListMessageManager.php +++ b/src/Domain/Messaging/Service/Manager/ListMessageManager.php @@ -40,7 +40,6 @@ public function associateMessageWithList(Message $message, SubscriberList $subsc $listMessage = new ListMessage(); $listMessage->setMessage($message); $listMessage->setList($subscriberList); - $listMessage->setEntered(new DateTime()); $this->entityManager->persist($listMessage); diff --git a/src/Domain/Subscription/Model/Subscriber.php b/src/Domain/Subscription/Model/Subscriber.php index d48e5730..d14f93f0 100644 --- a/src/Domain/Subscription/Model/Subscriber.php +++ b/src/Domain/Subscription/Model/Subscriber.php @@ -108,11 +108,9 @@ public function getUpdatedAt(): ?DateTime #[ORM\PrePersist] #[ORM\PreUpdate] - public function updateUpdatedAt(): DomainModel + public function updateUpdatedAt(): void { $this->updatedAt = new DateTime(); - - return $this; } public function isConfirmed(): bool diff --git a/src/Domain/Subscription/Model/SubscriberAttributeValue.php b/src/Domain/Subscription/Model/SubscriberAttributeValue.php index 05209709..8943266a 100644 --- a/src/Domain/Subscription/Model/SubscriberAttributeValue.php +++ b/src/Domain/Subscription/Model/SubscriberAttributeValue.php @@ -25,7 +25,7 @@ class SubscriberAttributeValue implements DomainModel #[ORM\JoinColumn(name: 'userid', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')] private Subscriber $subscriber; - #[ORM\Column(name: 'value', type: 'text', nullable: true)] + #[ORM\Column(name: 'value', type: 'text', nullable: true, columnDefinition: 'TEXT')] private ?string $value = null; public function __construct(SubscriberAttributeDefinition $attributeDefinition, Subscriber $subscriber) diff --git a/src/Domain/Subscription/Model/SubscriberList.php b/src/Domain/Subscription/Model/SubscriberList.php index 32f85f5d..111e7773 100644 --- a/src/Domain/Subscription/Model/SubscriberList.php +++ b/src/Domain/Subscription/Model/SubscriberList.php @@ -39,8 +39,11 @@ class SubscriberList implements DomainModel, Identity, CreationDate, Modificatio #[ORM\Column] private string $name = ''; + #[ORM\Column(name: 'rssfeed', type: 'string', length: 255, nullable: true)] + private ?string $rssFeed = null; + #[ORM\Column] - private string $description = ''; + private ?string $description; #[ORM\Column(name: 'entered', type: 'datetime', nullable: true)] protected ?DateTime $createdAt = null; @@ -51,7 +54,7 @@ class SubscriberList implements DomainModel, Identity, CreationDate, Modificatio #[ORM\Column(name: 'listorder', type: 'integer', nullable: true)] private ?int $listPosition; - #[ORM\Column(name: 'prefix')] + #[ORM\Column(name: 'prefix', length: 10, nullable: true)] private ?string $subjectPrefix; #[ORM\Column(name: 'active', type: 'boolean')] @@ -92,6 +95,17 @@ public function getId(): ?int return $this->id; } + public function getRssFeed(): ?string + { + return $this->rssFeed; + } + + public function setRssFeed(?string $rssFeed): self + { + $this->rssFeed = $rssFeed; + return $this; + } + public function getName(): string { return $this->name; @@ -103,12 +117,12 @@ public function setName(string $name): self return $this; } - public function getDescription(): string + public function getDescription(): ?string { return $this->description; } - public function setDescription(string $description): self + public function setDescription(?string $description): self { $this->description = $description; @@ -217,10 +231,9 @@ public function getUpdatedAt(): ?DateTime #[ORM\PrePersist] #[ORM\PreUpdate] - public function updateUpdatedAt(): DomainModel + public function updateUpdatedAt(): void { $this->updatedAt = new DateTime(); - return $this; } public function getListMessages(): Collection diff --git a/src/Domain/Subscription/Model/Subscription.php b/src/Domain/Subscription/Model/Subscription.php index 94e79965..89a6287c 100644 --- a/src/Domain/Subscription/Model/Subscription.php +++ b/src/Domain/Subscription/Model/Subscription.php @@ -95,10 +95,8 @@ public function getUpdatedAt(): ?DateTime #[ORM\PrePersist] #[ORM\PreUpdate] - public function updateUpdatedAt(): DomainModel + public function updateUpdatedAt(): void { $this->updatedAt = new DateTime(); - - return $this; } } diff --git a/src/Domain/Subscription/Model/UserBlacklist.php b/src/Domain/Subscription/Model/UserBlacklist.php index 0c1510e5..73d5b42c 100644 --- a/src/Domain/Subscription/Model/UserBlacklist.php +++ b/src/Domain/Subscription/Model/UserBlacklist.php @@ -24,6 +24,12 @@ class UserBlacklist implements DomainModel #[ORM\OneToOne(targetEntity: UserBlacklistData::class, mappedBy: 'blacklist', cascade: ['persist', 'remove'])] private ?UserBlacklistData $blacklistData = null; + public function __construct(string $email) + { + $this->email = $email; + $this->added = new DateTime(); + } + public function getEmail(): string { return $this->email; @@ -34,12 +40,6 @@ public function getAdded(): ?DateTime return $this->added; } - public function setEmail(string $email): self - { - $this->email = $email; - return $this; - } - public function setAdded(?DateTime $added): self { $this->added = $added; diff --git a/src/Domain/Subscription/Model/UserBlacklistData.php b/src/Domain/Subscription/Model/UserBlacklistData.php index e6dbba06..4aaa19ad 100644 --- a/src/Domain/Subscription/Model/UserBlacklistData.php +++ b/src/Domain/Subscription/Model/UserBlacklistData.php @@ -51,12 +51,6 @@ public function getData(): ?string return $this->data; } - public function setEmail(string $email): self - { - $this->email = $email; - return $this; - } - public function setName(string $name): self { $this->name = $name; diff --git a/src/Domain/Subscription/Service/Manager/SubscriberBlacklistManager.php b/src/Domain/Subscription/Service/Manager/SubscriberBlacklistManager.php index 3d124a31..c51d867f 100644 --- a/src/Domain/Subscription/Service/Manager/SubscriberBlacklistManager.php +++ b/src/Domain/Subscription/Service/Manager/SubscriberBlacklistManager.php @@ -39,15 +39,12 @@ public function addEmailToBlacklist(string $email, ?string $reasonData = null): return $this->getBlacklistInfo($email); } - $blacklistEntry = new UserBlacklist(); - $blacklistEntry->setEmail($email); - $blacklistEntry->setAdded(new DateTime()); - + $blacklistEntry = new UserBlacklist($email); $this->entityManager->persist($blacklistEntry); if ($reasonData !== null) { $blacklistData = new UserBlacklistData(); - $blacklistData->setEmail($email); + $blacklistData->setBlacklist($blacklistEntry); $blacklistData->setName('reason'); $blacklistData->setData($reasonData); $this->entityManager->persist($blacklistData); @@ -56,10 +53,10 @@ public function addEmailToBlacklist(string $email, ?string $reasonData = null): return $blacklistEntry; } - public function addBlacklistData(string $email, string $name, string $data): void + public function addBlacklistData(UserBlacklist $userBlacklist, string $name, string $data): void { $blacklistData = new UserBlacklistData(); - $blacklistData->setEmail($email); + $blacklistData->setBlacklist($userBlacklist); $blacklistData->setName($name); $blacklistData->setData($data); $this->entityManager->persist($blacklistData); diff --git a/src/Migrations/Version20251028092901.php b/src/Migrations/Version20251028092901.php index 2384ea55..2882e0cd 100644 --- a/src/Migrations/Version20251028092901.php +++ b/src/Migrations/Version20251028092901.php @@ -17,14 +17,13 @@ public function getDescription(): string return ''; } + /** + * @SuppressWarnings(PHPMD.ShortMethodName) + * @SuppressWarnings(PHPMD.UnusedFormalParameter) + */ public function up(Schema $schema): void { // this up() migration is auto-generated, please modify it to your needs $this->addSql(file_get_contents(__DIR__.'/initial_schema.sql')); } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - } } diff --git a/tests/Integration/Domain/Identity/Fixtures/AdministratorTokenWithAdministratorFixture.php b/tests/Integration/Domain/Identity/Fixtures/AdministratorTokenWithAdministratorFixture.php index e382a4c7..a0602bb2 100644 --- a/tests/Integration/Domain/Identity/Fixtures/AdministratorTokenWithAdministratorFixture.php +++ b/tests/Integration/Domain/Identity/Fixtures/AdministratorTokenWithAdministratorFixture.php @@ -40,7 +40,7 @@ public function load(ObjectManager $manager): void $admin = $adminRepository->find($row['adminid']); if ($admin === null) { - $admin = new Administrator(); + $admin = (new Administrator())->setLoginName($row['id']); $this->setSubjectId($admin, (int)$row['adminid']); $manager->persist($admin); } diff --git a/tests/Integration/Domain/Identity/Repository/AdministratorRepositoryTest.php b/tests/Integration/Domain/Identity/Repository/AdministratorRepositoryTest.php index a5215789..a69a751b 100644 --- a/tests/Integration/Domain/Identity/Repository/AdministratorRepositoryTest.php +++ b/tests/Integration/Domain/Identity/Repository/AdministratorRepositoryTest.php @@ -93,7 +93,7 @@ public function testModificationDateOfExistingModelGetsUpdatedOnUpdate(): void public function testCreationDateOfNewModelIsSetToNowOnPersist() { - $model = new Administrator(); + $model = (new Administrator())->setLoginName('ta'); $this->entityManager->persist($model); $this->entityManager->flush(); @@ -104,7 +104,7 @@ public function testCreationDateOfNewModelIsSetToNowOnPersist() public function testModificationDateOfNewModelIsSetToNowOnPersist() { - $model = new Administrator(); + $model = (new Administrator())->setLoginName('tat'); $this->entityManager->persist($model); $this->entityManager->flush(); @@ -165,7 +165,7 @@ public function testFindOneByLoginCredentialsIgnoresNonSuperUser() public function testSavePersistsAndFlushesModel(): void { - $model = new Administrator(); + $model = (new Administrator())->setLoginName('t'); $this->repository->save($model); $this->assertSame($model, $this->repository->find($model->getId())); diff --git a/tests/Integration/Domain/Messaging/Repository/MessageRepositoryTest.php b/tests/Integration/Domain/Messaging/Repository/MessageRepositoryTest.php index 1bd98735..388fa391 100644 --- a/tests/Integration/Domain/Messaging/Repository/MessageRepositoryTest.php +++ b/tests/Integration/Domain/Messaging/Repository/MessageRepositoryTest.php @@ -42,7 +42,7 @@ protected function tearDown(): void public function testMessageIsPersistedAndFetchedCorrectly(): void { - $admin = new Administrator(); + $admin = (new Administrator())->setLoginName('t'); $this->entityManager->persist($admin); $message = new Message( @@ -68,8 +68,8 @@ public function testMessageIsPersistedAndFetchedCorrectly(): void public function testGetByOwnerIdReturnsOnlyOwnedMessages(): void { - $admin1 = new Administrator(); - $admin2 = new Administrator(); + $admin1 = (new Administrator())->setLoginName('1'); + $admin2 = (new Administrator())->setLoginName('2'); $this->entityManager->persist($admin1); $this->entityManager->persist($admin2); diff --git a/tests/Integration/Domain/Subscription/Fixtures/SubscriberListFixture.php b/tests/Integration/Domain/Subscription/Fixtures/SubscriberListFixture.php index 133d2248..57345573 100644 --- a/tests/Integration/Domain/Subscription/Fixtures/SubscriberListFixture.php +++ b/tests/Integration/Domain/Subscription/Fixtures/SubscriberListFixture.php @@ -41,7 +41,8 @@ public function load(ObjectManager $manager): void $admin = $adminRepository->find($row['owner']); if ($admin === null) { - $admin = new Administrator(); + $admin = (new Administrator()) + ->setLoginName($row['name']); $this->setSubjectId($admin, (int)$row['owner']); $manager->persist($admin); } diff --git a/tests/Integration/Domain/Subscription/Service/SubscriberDeletionServiceTest.php b/tests/Integration/Domain/Subscription/Service/SubscriberDeletionServiceTest.php index 9019fd30..8fb8e31c 100644 --- a/tests/Integration/Domain/Subscription/Service/SubscriberDeletionServiceTest.php +++ b/tests/Integration/Domain/Subscription/Service/SubscriberDeletionServiceTest.php @@ -52,7 +52,7 @@ protected function tearDown(): void public function testDeleteSubscriberWithRelatedDataDoesNotThrowDoctrineError(): void { - $admin = new Administrator(); + $admin = (new Administrator())->setLoginName('ta'); $this->entityManager->persist($admin); $msg = new Message( diff --git a/tests/Unit/Domain/Identity/Model/AdministratorTest.php b/tests/Unit/Domain/Identity/Model/AdministratorTest.php index 0d3b90f7..cf90e0c9 100644 --- a/tests/Unit/Domain/Identity/Model/AdministratorTest.php +++ b/tests/Unit/Domain/Identity/Model/AdministratorTest.php @@ -27,7 +27,7 @@ class AdministratorTest extends TestCase protected function setUp(): void { - $this->subject = new Administrator(); + $this->subject = (new Administrator())->setLoginName(''); } public function testIsDomainModel(): void diff --git a/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php b/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php index da824845..ee12cfae 100644 --- a/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php +++ b/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php @@ -26,7 +26,7 @@ class AdministratorTokenTest extends TestCase protected function setUp(): void { - $this->subject = new AdministratorToken(); + $this->subject = new AdministratorToken((new Administrator())->setLoginName('admin')); } public function testIsDomainModel(): void @@ -54,11 +54,6 @@ public function testUpdateCreationDateSetsCreationDateToNow(): void self::assertSimilarDates(new DateTime(), $this->subject->getCreatedAt()); } - public function testGetKeyInitiallyReturnsEmptyString(): void - { - self::assertSame('', $this->subject->getKey()); - } - public function testSetKeySetsKey(): void { $value = 'Club-Mate'; @@ -74,8 +69,6 @@ public function testGetExpiryInitiallyReturnsDateTime(): void public function testGenerateExpirySetsExpiryOneHourInTheFuture(): void { - $this->subject->generateExpiry(); - self::assertSimilarDates(new DateTime('+1 hour'), $this->subject->getExpiry()); } @@ -99,7 +92,7 @@ public function testGenerateKeyCreatesDifferentKeysForEachCall(): void public function testGetAdministratorInitiallyReturnsNull(): void { - self::assertNull($this->subject->getAdministrator()); + self::assertNotNull($this->subject->getAdministrator()); } public function testSetAdministratorSetsAdministrator(): void From a46b1b3a17bc6db387875caa0918729910ab798a Mon Sep 17 00:00:00 2001 From: Tatevik Date: Wed, 29 Oct 2025 14:40:44 +0400 Subject: [PATCH 07/22] Fix tests --- .../Identity/Model/AdministratorToken.php | 8 +- src/Domain/Messaging/Model/Message.php | 9 +- src/Domain/Subscription/Model/Subscriber.php | 110 ++++++++++++++++-- .../Model/SubscriberAttributeValue.php | 2 +- .../Subscription/Model/SubscriberList.php | 2 +- ...nistratorTokenWithAdministratorFixture.php | 3 +- .../DetachedAdministratorTokenFixture.php | 6 +- .../AdministratorTokenRepositoryTest.php | 3 +- .../Identity/Model/AdministratorTokenTest.php | 8 -- .../Subscription/Model/SubscriberTest.php | 4 +- tests/Unit/Security/AuthenticationTest.php | 5 +- 11 files changed, 121 insertions(+), 39 deletions(-) diff --git a/src/Domain/Identity/Model/AdministratorToken.php b/src/Domain/Identity/Model/AdministratorToken.php index f857b2da..af444bd2 100644 --- a/src/Domain/Identity/Model/AdministratorToken.php +++ b/src/Domain/Identity/Model/AdministratorToken.php @@ -114,14 +114,8 @@ public function generateKey(): self return $this; } - public function getAdministrator(): Administrator|Proxy + public function getAdministrator(): Administrator { return $this->administrator; } - - public function setAdministrator(Administrator $administrator): self - { - $this->administrator = $administrator; - return $this; - } } diff --git a/src/Domain/Messaging/Model/Message.php b/src/Domain/Messaging/Model/Message.php index cc81bafa..ca7b842f 100644 --- a/src/Domain/Messaging/Model/Message.php +++ b/src/Domain/Messaging/Model/Message.php @@ -33,7 +33,7 @@ class Message implements DomainModel, Identity, ModificationDate, OwnableInterfa private ?int $id = null; #[ORM\Column(name: 'modified', type: 'datetime', nullable: false)] - private DateTimeImmutable $updatedAt; + private DateTime $updatedAt; #[ORM\Embedded(class: MessageFormat::class, columnPrefix: false)] private MessageFormat $format; @@ -82,7 +82,7 @@ public function __construct( $this->owner = $owner; $this->template = $template; $this->listMessages = new ArrayCollection(); - $this->updatedAt = new DateTimeImmutable(); + $this->updatedAt = new DateTime(); $this->metadata->setEntered(new DateTime()); } @@ -91,16 +91,15 @@ public function getId(): ?int return $this->id; } - /** @SuppressWarnings(PHPMD.StaticAccess) */ public function getUpdatedAt(): DateTime { - return DateTime::createFromImmutable($this->updatedAt); + return $this->updatedAt; } #[ORM\PreUpdate] public function touchUpdatedTimestamp(): void { - $this->updatedAt = new DateTimeImmutable(); + $this->updatedAt = new DateTime; } public function getFormat(): MessageFormat diff --git a/src/Domain/Subscription/Model/Subscriber.php b/src/Domain/Subscription/Model/Subscriber.php index d14f93f0..c332544f 100644 --- a/src/Domain/Subscription/Model/Subscriber.php +++ b/src/Domain/Subscription/Model/Subscriber.php @@ -19,6 +19,7 @@ * campaigns for those subscriber lists. * @author Oliver Klee * @author Tatevik Grigoryan + * @SuppressWarnings(TooManyFields) */ #[ORM\Entity(repositoryClass: SubscriberRepository::class)] #[ORM\Table(name: 'phplist_user_user')] @@ -26,6 +27,10 @@ #[ORM\Index(name: 'enteredindex', columns: ['entered'])] #[ORM\Index(name: 'confidx', columns: ['confirmed'])] #[ORM\Index(name: 'blidx', columns: ['blacklisted'])] +#[ORM\Index(name: 'optidx', columns: ['optedin'])] +#[ORM\Index(name: 'uuididx', columns: ['uuid'])] +#[ORM\Index(name: 'foreignkey', columns: ['foreignkey'])] +#[ORM\UniqueConstraint(name: 'email', columns: ['email'])] #[ORM\HasLifecycleCallbacks] class Subscriber implements DomainModel, Identity, CreationDate, ModificationDate { @@ -37,8 +42,8 @@ class Subscriber implements DomainModel, Identity, CreationDate, ModificationDat #[ORM\Column(name: 'entered', type: 'datetime', nullable: true)] protected ?DateTime $createdAt = null; - #[ORM\Column(name: 'modified', type: 'datetime')] - private ?DateTime $updatedAt = null; + #[ORM\Column(name: 'modified', type: 'datetime', nullable: false)] + private DateTime $updatedAt; #[ORM\Column(unique: true)] private string $email = ''; @@ -52,7 +57,7 @@ class Subscriber implements DomainModel, Identity, CreationDate, ModificationDat #[ORM\Column(name: 'bouncecount', type: 'integer')] private int $bounceCount = 0; - #[ORM\Column(name: 'uniqid', unique: true)] + #[ORM\Column(name: 'uniqid', type: 'string', length: 255, nullable: true)] private string $uniqueId = ''; #[ORM\Column(name: 'htmlemail', type: 'boolean')] @@ -61,8 +66,8 @@ class Subscriber implements DomainModel, Identity, CreationDate, ModificationDat #[ORM\Column(type: 'boolean')] private bool $disabled = false; - #[ORM\Column(name: 'extradata', type: 'text')] - private ?string $extraData; + #[ORM\Column(name: 'extradata', type: 'text', nullable: true)] + private ?string $extraData = null; #[ORM\OneToMany( targetEntity: Subscription::class, @@ -83,12 +88,34 @@ class Subscriber implements DomainModel, Identity, CreationDate, ModificationDat )] private Collection $attributes; + #[ORM\Column(name: 'optedin', type: 'boolean')] + private bool $optedIn = false; + + #[ORM\Column(name: 'uuid', type: 'string', length: 36)] + private string $uuid = ''; + + #[ORM\Column(name: 'subscribepage', type: 'integer', nullable: true)] + private ?int $subscribePage = null; + + #[ORM\Column(name: 'rssfrequency', type: 'string', length: 100, nullable: true)] + private ?string $rssFrequency = null; + + #[ORM\Column(name: 'password', type: 'string', length: 255, nullable: true)] + private ?string $password = null; + + #[ORM\Column(name: 'passwordchanged', type: 'datetime', nullable: true)] + private ?DateTime $passwordChanged = null; + + #[ORM\Column(name: 'foreignkey', type: 'string', length: 100, nullable: true)] + private ?string $foreignKey = null; + public function __construct() { $this->subscriptions = new ArrayCollection(); $this->attributes = new ArrayCollection(); $this->extraData = ''; $this->createdAt = new DateTime(); + $this->updatedAt = new DateTime(); } public function getId(): ?int @@ -101,12 +128,11 @@ public function getCreatedAt(): ?DateTime return $this->createdAt; } - public function getUpdatedAt(): ?DateTime + public function getUpdatedAt(): DateTime { return $this->updatedAt; } - #[ORM\PrePersist] #[ORM\PreUpdate] public function updateUpdatedAt(): void { @@ -279,4 +305,74 @@ public function removeAttribute(SubscriberAttributeValue $attribute): self $this->attributes->removeElement($attribute); return $this; } + + public function isOptedIn(): bool + { + return $this->optedIn; + } + + public function setOptedIn(bool $optedIn): void + { + $this->optedIn = $optedIn; + } + + public function getUuid(): string + { + return $this->uuid; + } + + public function setUuid(string $uuid): void + { + $this->uuid = $uuid; + } + + public function getSubscribePage(): ?int + { + return $this->subscribePage; + } + + public function setSubscribePage(?int $subscribePage): void + { + $this->subscribePage = $subscribePage; + } + + public function getRssFrequency(): ?string + { + return $this->rssFrequency; + } + + public function setRssFrequency(?string $rssFrequency): void + { + $this->rssFrequency = $rssFrequency; + } + + public function getPassword(): ?string + { + return $this->password; + } + + public function setPassword(?string $password): void + { + $this->password = $password; + } + + public function getPasswordChanged(): ?DateTime + { + return $this->passwordChanged; + } + + public function setPasswordChanged(?DateTime $passwordChanged): void + { + $this->passwordChanged = $passwordChanged; + } + + public function getForeignKey(): ?string + { + return $this->foreignKey; + } + + public function setForeignKey(?string $foreignKey): void + { + $this->foreignKey = $foreignKey; + } } diff --git a/src/Domain/Subscription/Model/SubscriberAttributeValue.php b/src/Domain/Subscription/Model/SubscriberAttributeValue.php index 8943266a..05209709 100644 --- a/src/Domain/Subscription/Model/SubscriberAttributeValue.php +++ b/src/Domain/Subscription/Model/SubscriberAttributeValue.php @@ -25,7 +25,7 @@ class SubscriberAttributeValue implements DomainModel #[ORM\JoinColumn(name: 'userid', referencedColumnName: 'id', nullable: false, onDelete: 'CASCADE')] private Subscriber $subscriber; - #[ORM\Column(name: 'value', type: 'text', nullable: true, columnDefinition: 'TEXT')] + #[ORM\Column(name: 'value', type: 'text', nullable: true)] private ?string $value = null; public function __construct(SubscriberAttributeDefinition $attributeDefinition, Subscriber $subscriber) diff --git a/src/Domain/Subscription/Model/SubscriberList.php b/src/Domain/Subscription/Model/SubscriberList.php index 111e7773..966cc308 100644 --- a/src/Domain/Subscription/Model/SubscriberList.php +++ b/src/Domain/Subscription/Model/SubscriberList.php @@ -43,7 +43,7 @@ class SubscriberList implements DomainModel, Identity, CreationDate, Modificatio private ?string $rssFeed = null; #[ORM\Column] - private ?string $description; + private string $description = ''; #[ORM\Column(name: 'entered', type: 'datetime', nullable: true)] protected ?DateTime $createdAt = null; diff --git a/tests/Integration/Domain/Identity/Fixtures/AdministratorTokenWithAdministratorFixture.php b/tests/Integration/Domain/Identity/Fixtures/AdministratorTokenWithAdministratorFixture.php index a0602bb2..18bbc08b 100644 --- a/tests/Integration/Domain/Identity/Fixtures/AdministratorTokenWithAdministratorFixture.php +++ b/tests/Integration/Domain/Identity/Fixtures/AdministratorTokenWithAdministratorFixture.php @@ -45,12 +45,11 @@ public function load(ObjectManager $manager): void $manager->persist($admin); } - $adminToken = new AdministratorToken(); + $adminToken = new AdministratorToken($admin); $this->setSubjectId($adminToken, (int)$row['id']); $adminToken->setKey($row['value']); $this->setSubjectProperty($adminToken, 'expiry', new DateTime($row['expires'])); $this->setSubjectProperty($adminToken, 'createdAt', (bool) $row['entered']); - $adminToken->setAdministrator($admin); $manager->persist($adminToken); } while (true); diff --git a/tests/Integration/Domain/Identity/Fixtures/DetachedAdministratorTokenFixture.php b/tests/Integration/Domain/Identity/Fixtures/DetachedAdministratorTokenFixture.php index a3d16ea7..4468f131 100644 --- a/tests/Integration/Domain/Identity/Fixtures/DetachedAdministratorTokenFixture.php +++ b/tests/Integration/Domain/Identity/Fixtures/DetachedAdministratorTokenFixture.php @@ -7,6 +7,7 @@ use DateTime; use Doctrine\Bundle\FixturesBundle\Fixture; use Doctrine\Persistence\ObjectManager; +use PhpList\Core\Domain\Identity\Model\Administrator; use PhpList\Core\Domain\Identity\Model\AdministratorToken; use PhpList\Core\TestingSupport\Traits\ModelTestTrait; use RuntimeException; @@ -28,6 +29,9 @@ public function load(ObjectManager $manager): void } $headers = fgetcsv($handle); + $admin = (new Administrator())->setLoginName('admin'); + $this->setSubjectId($admin, 1); + $manager->persist($admin); do { $data = fgetcsv($handle); @@ -36,7 +40,7 @@ public function load(ObjectManager $manager): void } $row = array_combine($headers, $data); - $adminToken = new AdministratorToken(); + $adminToken = new AdministratorToken($admin); $this->setSubjectId($adminToken, (int)$row['id']); $adminToken->setKey($row['value']); diff --git a/tests/Integration/Domain/Identity/Repository/AdministratorTokenRepositoryTest.php b/tests/Integration/Domain/Identity/Repository/AdministratorTokenRepositoryTest.php index ff750a63..015061d0 100644 --- a/tests/Integration/Domain/Identity/Repository/AdministratorTokenRepositoryTest.php +++ b/tests/Integration/Domain/Identity/Repository/AdministratorTokenRepositoryTest.php @@ -130,8 +130,7 @@ public function testSavePersistsAndFlushesModel() /** @var Administrator $administrator */ $administrator = $administratorRepository->find(1); - $model = new AdministratorToken(); - $model->setAdministrator($administrator); + $model = new AdministratorToken($administrator); $this->repository->save($model); self::assertSame($model, $this->repository->find($model->getId())); diff --git a/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php b/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php index ee12cfae..a519a85d 100644 --- a/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php +++ b/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php @@ -94,12 +94,4 @@ public function testGetAdministratorInitiallyReturnsNull(): void { self::assertNotNull($this->subject->getAdministrator()); } - - public function testSetAdministratorSetsAdministrator(): void - { - $model = new Administrator(); - $this->subject->setAdministrator($model); - - self::assertSame($model, $this->subject->getAdministrator()); - } } diff --git a/tests/Unit/Domain/Subscription/Model/SubscriberTest.php b/tests/Unit/Domain/Subscription/Model/SubscriberTest.php index 5a60c5de..0827f7fd 100644 --- a/tests/Unit/Domain/Subscription/Model/SubscriberTest.php +++ b/tests/Unit/Domain/Subscription/Model/SubscriberTest.php @@ -56,9 +56,9 @@ public function testUpdateCreationDateSetsCreationDateToNow(): void self::assertSimilarDates(new \DateTime(), $this->subscriber->getCreatedAt()); } - public function testgetUpdatedAtInitiallyReturnsNull(): void + public function testGetUpdatedAtInitiallyReturnsNotNull(): void { - self::assertNull($this->subscriber->getUpdatedAt()); + self::assertNotNull($this->subscriber->getUpdatedAt()); } public function testUpdateModificationDateSetsModificationDateToNow(): void diff --git a/tests/Unit/Security/AuthenticationTest.php b/tests/Unit/Security/AuthenticationTest.php index 0dad0bec..58f75f61 100644 --- a/tests/Unit/Security/AuthenticationTest.php +++ b/tests/Unit/Security/AuthenticationTest.php @@ -34,10 +34,9 @@ public function testAuthenticateByApiKeyWithValidApiKeyInBasicAuthReturnsMatchin $request = new Request(); $request->headers->add(['php-auth-pw' => $apiKey]); - $token = new AdministratorToken(); $administrator = new Administrator(); $administrator->setSuperUser(true); - $token->setAdministrator($administrator); + $token = new AdministratorToken($administrator); $this->tokenRepository ->expects($this->any()) @@ -54,7 +53,7 @@ public function testAuthenticateByApiKeyWithValidApiKeyInBasicAuthWithoutAdminis $request = new Request(); $request->headers->add(['php-auth-pw' => $apiKey]); - $token = new AdministratorToken(); + $token = $this->createMock(AdministratorToken::class); $this->tokenRepository ->expects($this->any()) From 06202d6bd3b4cfbde8f7b909d8a06563b2a81e8c Mon Sep 17 00:00:00 2001 From: Tatevik Date: Wed, 29 Oct 2025 14:54:08 +0400 Subject: [PATCH 08/22] Migrate --- src/Migrations/Version20251029105320.php | 173 +++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 src/Migrations/Version20251029105320.php diff --git a/src/Migrations/Version20251029105320.php b/src/Migrations/Version20251029105320.php new file mode 100644 index 00000000..6e9e49a2 --- /dev/null +++ b/src/Migrations/Version20251029105320.php @@ -0,0 +1,173 @@ +addSql('ALTER TABLE phplist_admin CHANGE modified modified DATETIME NOT NULL, CHANGE superuser superuser TINYINT(1) NOT NULL, CHANGE disabled disabled TINYINT(1) NOT NULL, CHANGE privileges privileges LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690D3B10C48 FOREIGN KEY (adminattributeid) REFERENCES phplist_adminattribute (id)'); + $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute (adminattributeid)'); + $this->addSql('CREATE INDEX IDX_58E07690B8ED4D93 ON phplist_admin_attribute (adminid)'); + $this->addSql('ALTER TABLE phplist_admin_login CHANGE active active TINYINT(1) NOT NULL'); + $this->addSql('ALTER TABLE phplist_admin_login ADD CONSTRAINT FK_5FCE0842B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_5FCE0842B8ED4D93 ON phplist_admin_login (adminid)'); + $this->addSql('ALTER TABLE phplist_admin_password_request CHANGE id_key id_key INT UNSIGNED AUTO_INCREMENT NOT NULL'); + $this->addSql('ALTER TABLE phplist_admin_password_request ADD CONSTRAINT FK_DC146F3B880E0D76 FOREIGN KEY (`admin`) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_DC146F3B880E0D76 ON phplist_admin_password_request (`admin`)'); + $this->addSql('ALTER TABLE phplist_admintoken CHANGE adminid adminid INT DEFAULT NULL, CHANGE value value VARCHAR(255) NOT NULL'); + $this->addSql('ALTER TABLE phplist_admintoken ADD CONSTRAINT FK_CB15D477B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id) ON DELETE CASCADE'); + $this->addSql('CREATE INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken (adminid)'); + $this->addSql('ALTER TABLE phplist_attachment CHANGE description description LONGTEXT DEFAULT NULL'); + $this->addSql('DROP INDEX statusidx ON phplist_bounce'); + $this->addSql('ALTER TABLE phplist_bounce CHANGE header header LONGTEXT DEFAULT NULL, CHANGE data data LONGBLOB DEFAULT NULL, CHANGE status status VARCHAR(20) DEFAULT NULL, CHANGE comment comment LONGTEXT DEFAULT NULL'); + $this->addSql('CREATE INDEX statusidx ON phplist_bounce (status)'); + $this->addSql('ALTER TABLE phplist_bounceregex CHANGE regexhash regexhash VARCHAR(32) DEFAULT NULL, CHANGE comment comment LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_config CHANGE editable editable TINYINT(1) DEFAULT 1 NOT NULL'); + $this->addSql('ALTER TABLE phplist_eventlog CHANGE entry entry LONGTEXT DEFAULT NULL'); + $this->addSql('DROP INDEX lanorigidx ON phplist_i18n'); + $this->addSql('DROP INDEX lanorigunq ON phplist_i18n'); + $this->addSql('ALTER TABLE phplist_i18n CHANGE original original VARCHAR(255) NOT NULL, CHANGE translation translation LONGTEXT NOT NULL, ADD PRIMARY KEY (lan, original)'); + $this->addSql('CREATE UNIQUE INDEX lanorigunq ON phplist_i18n (lan, original)'); + $this->addSql('ALTER TABLE phplist_linktrack CHANGE latestclick latestclick DATETIME NOT NULL'); + $this->addSql('DROP INDEX urlindex ON phplist_linktrack_forward'); + $this->addSql('ALTER TABLE phplist_linktrack_forward CHANGE url url VARCHAR(255) DEFAULT NULL, CHANGE urlhash urlhash VARCHAR(32) DEFAULT NULL'); + $this->addSql('CREATE INDEX urlindex ON phplist_linktrack_forward (url)'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick CHANGE data data LONGTEXT DEFAULT NULL, ADD PRIMARY KEY (linkid, userid, messageid)'); + $this->addSql('ALTER TABLE phplist_list CHANGE description description VARCHAR(255) NOT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE active active TINYINT(1) NOT NULL, CHANGE category category VARCHAR(255) NOT NULL'); + $this->addSql('ALTER TABLE phplist_list ADD CONSTRAINT FK_A4CE8621CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_A4CE8621CF60E67C ON phplist_list (owner)'); + $this->addSql('ALTER TABLE phplist_listmessage CHANGE modified modified DATETIME NOT NULL'); + $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A31478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id)'); + $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A8E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id)'); + $this->addSql('CREATE INDEX IDX_83B22D7A31478478 ON phplist_listmessage (messageid)'); + $this->addSql('CREATE INDEX IDX_83B22D7A8E44C1EF ON phplist_listmessage (listid)'); + $this->addSql('DROP INDEX userlistenteredidx ON phplist_listuser'); + $this->addSql('ALTER TABLE phplist_listuser CHANGE modified modified DATETIME NOT NULL'); + $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E411F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id)'); + $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E4118E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id) ON DELETE CASCADE'); + $this->addSql('CREATE INDEX userlistenteredidx ON phplist_listuser (userid, entered, listid)'); + $this->addSql('ALTER TABLE phplist_message CHANGE subject subject VARCHAR(255) DEFAULT \'(no subject)\' NOT NULL, CHANGE message message LONGTEXT DEFAULT NULL, CHANGE textmessage textmessage LONGTEXT DEFAULT NULL, CHANGE footer footer LONGTEXT DEFAULT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE userselection userselection LONGTEXT DEFAULT NULL, CHANGE htmlformatted htmlformatted TINYINT(1) NOT NULL, CHANGE processed processed TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astext astext TINYINT(1) DEFAULT 0 NOT NULL, CHANGE ashtml ashtml TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astextandhtml astextandhtml TINYINT(1) DEFAULT 0 NOT NULL, CHANGE aspdf aspdf TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astextandpdf astextandpdf TINYINT(1) DEFAULT 0 NOT NULL, CHANGE viewed viewed INT DEFAULT 0 NOT NULL, CHANGE bouncecount bouncecount INT DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCDCF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); + $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCD97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id) ON DELETE SET NULL'); + $this->addSql('CREATE INDEX IDX_C5D81FCDCF60E67C ON phplist_message (owner)'); + $this->addSql('CREATE INDEX IDX_C5D81FCD97601F83 ON phplist_message (template)'); + $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_sendprocess CHANGE modified modified DATETIME NOT NULL'); + $this->addSql('ALTER TABLE phplist_subscribepage CHANGE active active TINYINT(1) DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE phplist_subscribepage ADD CONSTRAINT FK_5BAC7737CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_5BAC7737CF60E67C ON phplist_subscribepage (owner)'); + $this->addSql('ALTER TABLE phplist_subscribepage_data CHANGE data data LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_templateimage CHANGE template template INT NOT NULL'); + $this->addSql('ALTER TABLE phplist_templateimage ADD CONSTRAINT FK_30A85BA97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id)'); + $this->addSql('DROP INDEX urlindex ON phplist_urlcache'); + $this->addSql('ALTER TABLE phplist_urlcache CHANGE url url VARCHAR(255) NOT NULL'); + $this->addSql('CREATE INDEX urlindex ON phplist_urlcache (url)'); + $this->addSql('DROP INDEX email ON phplist_user_blacklist'); + $this->addSql('ALTER TABLE phplist_user_blacklist ADD PRIMARY KEY (email)'); + $this->addSql('DROP INDEX email ON phplist_user_blacklist_data'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data CHANGE email email VARCHAR(255) NOT NULL, CHANGE data data LONGTEXT DEFAULT NULL, ADD PRIMARY KEY (email)'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data ADD CONSTRAINT FK_6D67150CE7927C74 FOREIGN KEY (email) REFERENCES phplist_user_blacklist (email) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_user_user CHANGE confirmed confirmed TINYINT(1) NOT NULL, CHANGE blacklisted blacklisted TINYINT(1) NOT NULL, CHANGE optedin optedin TINYINT(1) NOT NULL, CHANGE bouncecount bouncecount INT NOT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE uuid uuid VARCHAR(36) NOT NULL, CHANGE htmlemail htmlemail TINYINT(1) NOT NULL, CHANGE passwordchanged passwordchanged DATETIME DEFAULT NULL, CHANGE disabled disabled TINYINT(1) NOT NULL, CHANGE extradata extradata LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_user_user_attribute CHANGE value value LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E310878C45AB5 FOREIGN KEY (attributeid) REFERENCES phplist_user_attribute (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E3108F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_user_user_history CHANGE detail detail LONGTEXT DEFAULT NULL, CHANGE systeminfo systeminfo LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_user_user_history ADD CONSTRAINT FK_6DBB605CF132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F469F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F46931478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id) ON DELETE CASCADE'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE phplist_admin CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE disabled disabled TINYINT(1) DEFAULT 0, CHANGE superuser superuser TINYINT(1) DEFAULT 0, CHANGE privileges privileges TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_admin_attribute DROP FOREIGN KEY FK_58E07690D3B10C48'); + $this->addSql('ALTER TABLE phplist_admin_attribute DROP FOREIGN KEY FK_58E07690B8ED4D93'); + $this->addSql('DROP INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute'); + $this->addSql('DROP INDEX IDX_58E07690B8ED4D93 ON phplist_admin_attribute'); + $this->addSql('ALTER TABLE phplist_admin_login DROP FOREIGN KEY FK_5FCE0842B8ED4D93'); + $this->addSql('DROP INDEX IDX_5FCE0842B8ED4D93 ON phplist_admin_login'); + $this->addSql('ALTER TABLE phplist_admin_login CHANGE active active TINYINT(1) DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE phplist_admin_password_request DROP FOREIGN KEY FK_DC146F3B880E0D76'); + $this->addSql('DROP INDEX IDX_DC146F3B880E0D76 ON phplist_admin_password_request'); + $this->addSql('ALTER TABLE phplist_admin_password_request CHANGE id_key id_key INT AUTO_INCREMENT NOT NULL'); + $this->addSql('ALTER TABLE phplist_admintoken DROP FOREIGN KEY FK_CB15D477B8ED4D93'); + $this->addSql('DROP INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken'); + $this->addSql('ALTER TABLE phplist_admintoken CHANGE adminid adminid INT NOT NULL, CHANGE value value VARCHAR(255) DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_attachment CHANGE description description TEXT DEFAULT NULL'); + $this->addSql('DROP INDEX statusidx ON phplist_bounce'); + $this->addSql('ALTER TABLE phplist_bounce CHANGE header header TEXT DEFAULT NULL, CHANGE data data MEDIUMBLOB DEFAULT NULL, CHANGE status status VARCHAR(255) DEFAULT NULL, CHANGE comment comment TEXT DEFAULT NULL'); + $this->addSql('CREATE INDEX statusidx ON phplist_bounce (status(20))'); + $this->addSql('ALTER TABLE phplist_bounceregex CHANGE regexhash regexhash CHAR(32) DEFAULT NULL, CHANGE comment comment TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_config CHANGE editable editable TINYINT(1) DEFAULT 1'); + $this->addSql('ALTER TABLE phplist_eventlog CHANGE entry entry TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_i18n DROP INDEX primary, ADD INDEX lanorigidx (lan, original(200))'); + $this->addSql('DROP INDEX lanorigunq ON phplist_i18n'); + $this->addSql('ALTER TABLE phplist_i18n CHANGE original original TEXT NOT NULL, CHANGE translation translation TEXT NOT NULL'); + $this->addSql('CREATE UNIQUE INDEX lanorigunq ON phplist_i18n (lan, original(200))'); + $this->addSql('ALTER TABLE phplist_linktrack CHANGE latestclick latestclick DATETIME DEFAULT NULL'); + $this->addSql('DROP INDEX urlindex ON phplist_linktrack_forward'); + $this->addSql('ALTER TABLE phplist_linktrack_forward CHANGE url url VARCHAR(2083) DEFAULT NULL, CHANGE urlhash urlhash CHAR(32) DEFAULT NULL'); + $this->addSql('CREATE INDEX urlindex ON phplist_linktrack_forward (url(255))'); + $this->addSql('DROP INDEX `primary` ON phplist_linktrack_userclick'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick CHANGE data data TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_list DROP FOREIGN KEY FK_A4CE8621CF60E67C'); + $this->addSql('DROP INDEX IDX_A4CE8621CF60E67C ON phplist_list'); + $this->addSql('ALTER TABLE phplist_list CHANGE description description TEXT DEFAULT NULL, CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE active active TINYINT(1) DEFAULT NULL, CHANGE category category VARCHAR(255) DEFAULT \'\''); + $this->addSql('ALTER TABLE phplist_listmessage DROP FOREIGN KEY FK_83B22D7A31478478'); + $this->addSql('ALTER TABLE phplist_listmessage DROP FOREIGN KEY FK_83B22D7A8E44C1EF'); + $this->addSql('DROP INDEX IDX_83B22D7A31478478 ON phplist_listmessage'); + $this->addSql('DROP INDEX IDX_83B22D7A8E44C1EF ON phplist_listmessage'); + $this->addSql('ALTER TABLE phplist_listmessage CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); + $this->addSql('ALTER TABLE phplist_listuser DROP FOREIGN KEY FK_F467E411F132696E'); + $this->addSql('ALTER TABLE phplist_listuser DROP FOREIGN KEY FK_F467E4118E44C1EF'); + $this->addSql('DROP INDEX userlistenteredidx ON phplist_listuser'); + $this->addSql('ALTER TABLE phplist_listuser CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); + $this->addSql('CREATE INDEX userlistenteredidx ON phplist_listuser (userid, listid, entered)'); + $this->addSql('ALTER TABLE phplist_message DROP FOREIGN KEY FK_C5D81FCDCF60E67C'); + $this->addSql('ALTER TABLE phplist_message DROP FOREIGN KEY FK_C5D81FCD97601F83'); + $this->addSql('DROP INDEX IDX_C5D81FCDCF60E67C ON phplist_message'); + $this->addSql('DROP INDEX IDX_C5D81FCD97601F83 ON phplist_message'); + $this->addSql('ALTER TABLE phplist_message CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE htmlformatted htmlformatted TINYINT(1) DEFAULT 0, CHANGE astext astext INT DEFAULT 0, CHANGE ashtml ashtml INT DEFAULT 0, CHANGE aspdf aspdf INT DEFAULT 0, CHANGE astextandhtml astextandhtml INT DEFAULT 0, CHANGE astextandpdf astextandpdf INT DEFAULT 0, CHANGE processed processed INT UNSIGNED DEFAULT 0, CHANGE viewed viewed INT DEFAULT 0, CHANGE bouncecount bouncecount INT DEFAULT 0, CHANGE subject subject VARCHAR(255) CHARACTER SET utf8mb4 DEFAULT \'(no subject)\' NOT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE message message LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE textmessage textmessage LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE footer footer TEXT DEFAULT NULL, CHANGE userselection userselection TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`'); + $this->addSql('ALTER TABLE phplist_sendprocess CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); + $this->addSql('ALTER TABLE phplist_subscribepage DROP FOREIGN KEY FK_5BAC7737CF60E67C'); + $this->addSql('DROP INDEX IDX_5BAC7737CF60E67C ON phplist_subscribepage'); + $this->addSql('ALTER TABLE phplist_subscribepage CHANGE active active TINYINT(1) DEFAULT 0'); + $this->addSql('ALTER TABLE phplist_subscribepage_data CHANGE data data TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_templateimage DROP FOREIGN KEY FK_30A85BA97601F83'); + $this->addSql('ALTER TABLE phplist_templateimage CHANGE template template INT DEFAULT 0 NOT NULL'); + $this->addSql('DROP INDEX urlindex ON phplist_urlcache'); + $this->addSql('ALTER TABLE phplist_urlcache CHANGE url url VARCHAR(2083) NOT NULL'); + $this->addSql('CREATE INDEX urlindex ON phplist_urlcache (url(255))'); + $this->addSql('ALTER TABLE phplist_user_blacklist DROP INDEX primary, ADD UNIQUE INDEX email (email)'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data DROP INDEX primary, ADD UNIQUE INDEX email (email)'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data DROP FOREIGN KEY FK_6D67150CE7927C74'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data CHANGE email email VARCHAR(150) NOT NULL, CHANGE data data TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_user_user CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE confirmed confirmed TINYINT(1) DEFAULT 0, CHANGE blacklisted blacklisted TINYINT(1) DEFAULT 0, CHANGE bouncecount bouncecount INT DEFAULT 0, CHANGE htmlemail htmlemail TINYINT(1) DEFAULT 0, CHANGE disabled disabled TINYINT(1) DEFAULT 0, CHANGE extradata extradata TEXT DEFAULT NULL, CHANGE optedin optedin TINYINT(1) DEFAULT 0, CHANGE uuid uuid VARCHAR(36) DEFAULT \'\', CHANGE passwordchanged passwordchanged DATE DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_user_user_attribute DROP FOREIGN KEY FK_E24E310878C45AB5'); + $this->addSql('ALTER TABLE phplist_user_user_attribute DROP FOREIGN KEY FK_E24E3108F132696E'); + $this->addSql('ALTER TABLE phplist_user_user_attribute CHANGE value value TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_user_user_history DROP FOREIGN KEY FK_6DBB605CF132696E'); + $this->addSql('ALTER TABLE phplist_user_user_history CHANGE detail detail TEXT DEFAULT NULL, CHANGE systeminfo systeminfo TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_usermessage DROP FOREIGN KEY FK_7F30F469F132696E'); + $this->addSql('ALTER TABLE phplist_usermessage DROP FOREIGN KEY FK_7F30F46931478478'); + } +} From c5a67cb9fff1bed64962b3fcf52091066a63c84e Mon Sep 17 00:00:00 2001 From: Tatevik Date: Thu, 30 Oct 2025 11:41:13 +0400 Subject: [PATCH 09/22] Separate MySql --- src/Migrations/Version20251028092901.php | 9 +++++++++ src/Migrations/Version20251029105320.php | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/src/Migrations/Version20251028092901.php b/src/Migrations/Version20251028092901.php index 2882e0cd..4ddedd92 100644 --- a/src/Migrations/Version20251028092901.php +++ b/src/Migrations/Version20251028092901.php @@ -4,6 +4,7 @@ namespace PhpList\Core\Migrations; +use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -23,6 +24,14 @@ public function getDescription(): string */ public function up(Schema $schema): void { + $platform = $this->connection->getDatabasePlatform(); + $this->skipIf( + !$platform instanceof MySQLPlatform, + sprintf( + 'This migration is only applicable for MySQL. Current platform: %s', + get_class($platform) + ) + ); // this up() migration is auto-generated, please modify it to your needs $this->addSql(file_get_contents(__DIR__.'/initial_schema.sql')); } diff --git a/src/Migrations/Version20251029105320.php b/src/Migrations/Version20251029105320.php index 6e9e49a2..37d1db72 100644 --- a/src/Migrations/Version20251029105320.php +++ b/src/Migrations/Version20251029105320.php @@ -4,6 +4,7 @@ namespace PhpList\Core\Migrations; +use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -19,6 +20,15 @@ public function getDescription(): string public function up(Schema $schema): void { + $platform = $this->connection->getDatabasePlatform(); + $this->skipIf( + !$platform instanceof MySQLPlatform, + sprintf( + 'This migration is only applicable for MySQL. Current platform: %s', + get_class($platform) + ) + ); + // this up() migration is auto-generated, please modify it to your needs $this->addSql('ALTER TABLE phplist_admin CHANGE modified modified DATETIME NOT NULL, CHANGE superuser superuser TINYINT(1) NOT NULL, CHANGE disabled disabled TINYINT(1) NOT NULL, CHANGE privileges privileges LONGTEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690D3B10C48 FOREIGN KEY (adminattributeid) REFERENCES phplist_adminattribute (id)'); @@ -96,6 +106,15 @@ public function up(Schema $schema): void public function down(Schema $schema): void { + $platform = $this->connection->getDatabasePlatform(); + $this->skipIf( + !$platform instanceof MySQLPlatform, + sprintf( + 'This migration is only applicable for MySQL. Current platform: %s', + get_class($platform) + ) + ); + // this down() migration is auto-generated, please modify it to your needs $this->addSql('ALTER TABLE phplist_admin CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE disabled disabled TINYINT(1) DEFAULT 0, CHANGE superuser superuser TINYINT(1) DEFAULT 0, CHANGE privileges privileges TEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_admin_attribute DROP FOREIGN KEY FK_58E07690D3B10C48'); From f53d1c1266e5ccdddda378aef50c30604956825d Mon Sep 17 00:00:00 2001 From: Tatevik Date: Thu, 30 Oct 2025 11:41:44 +0400 Subject: [PATCH 10/22] Use psql --- config/config_test.yml | 6 +- config/doctrine.yml | 1 + src/Core/Doctrine/OnlyOrmTablesFilter.php | 87 +++++++++++++++-------- 3 files changed, 62 insertions(+), 32 deletions(-) diff --git a/config/config_test.yml b/config/config_test.yml index 36ce489c..7d47d878 100644 --- a/config/config_test.yml +++ b/config/config_test.yml @@ -13,10 +13,10 @@ doctrine: dbal: # driver: 'pdo_sqlite' # memory: true - driver: 'pdo_mysql' + driver: 'pdo_pgsql' host: '%database_host%' - port: '%database_port%' - dbname: 'phplist' + port: '5433' + dbname: 'phplistdb' user: '%database_user%' password: '%database_password%' charset: UTF8 diff --git a/config/doctrine.yml b/config/doctrine.yml index 327cf305..caaaec71 100644 --- a/config/doctrine.yml +++ b/config/doctrine.yml @@ -11,6 +11,7 @@ doctrine: user: '%database_user%' password: '%database_password%' charset: UTF8 + use_savepoints: true orm: auto_generate_proxy_classes: '%kernel.debug%' diff --git a/src/Core/Doctrine/OnlyOrmTablesFilter.php b/src/Core/Doctrine/OnlyOrmTablesFilter.php index 7601c81a..95fdd2d3 100644 --- a/src/Core/Doctrine/OnlyOrmTablesFilter.php +++ b/src/Core/Doctrine/OnlyOrmTablesFilter.php @@ -4,52 +4,81 @@ namespace PhpList\Core\Core\Doctrine; +use Doctrine\DBAL\Schema\AbstractAsset; +use Doctrine\DBAL\Schema\Sequence; +use Doctrine\DBAL\Schema\Table; use Doctrine\ORM\EntityManagerInterface; class OnlyOrmTablesFilter { /** @var string[]|null */ private ?array $allow = null; + /** @var string[]|null */ + private ?array $allowPrefixes = null; - public function __construct(private readonly EntityManagerInterface $entityManager) - { - } + public function __construct(private readonly EntityManagerInterface $entityManager) {} - public function __invoke(string $assetName): bool + /** + * Doctrine (DBAL 3+) may pass strings OR AbstractAsset (Table, Sequence, etc.). + */ + public function __invoke(string|AbstractAsset $asset): bool { - // asset names can be "schema.table" ➜ normalize - $pos = strrpos($assetName, '.'); - if ($pos !== false) { - $assetName = substr($assetName, $pos + 1); + $name = \is_string($asset) ? $asset : $asset->getName(); + + if (false !== ($pos = strrpos($name, '.'))) { + $name = substr($name, $pos + 1); } + $nameLower = strtolower($name); - // Build the whitelist lazily to avoid touching the EM during container compilation or early boot. - if ($this->allow === null) { - $names = []; - foreach ($this->entityManager->getMetadataFactory()->getAllMetadata() as $m) { - // main table - $table = $m->getTableName(); - if ($table) { - $names[] = $table; - } + [$allow, $allowPrefixes] = $this->buildAllowOnce(); - // many-to-many join tables - foreach ($m->getAssociationMappings() as $assoc) { - if (isset($assoc['joinTable']['name'])) { - $join = $assoc['joinTable']['name']; - if ($join) { - $names[] = $join; - } - } + if (\is_string($asset) || $asset instanceof Table) { + return \in_array($nameLower, $allow, true); + } + + // PostgreSQL sequences: allow those that belong to our ORM tables + // (default naming: {table}_{column}_seq, so we check table_ prefix) + if ($asset instanceof Sequence) { + foreach ($allowPrefixes as $prefix) { + if (str_starts_with($nameLower, $prefix)) { + return true; } } + // Disallow unrelated sequences + return false; + } + + // Other dependent assets (indexes, FKs) are tied to allowed tables → allow + return true; + } - // keep the migration table visible too - $names[] = 'doctrine_migration_versions'; + private function buildAllowOnce(): array + { + if ($this->allow !== null) { + return [$this->allow, $this->allowPrefixes]; + } - $this->allow = array_values(array_unique($names)); + $tables = []; + foreach ($this->entityManager->getMetadataFactory()->getAllMetadata() as $m) { + if ($t = $m->getTableName()) { + $tables[] = strtolower($t); + } + // many-to-many join tables + foreach ($m->getAssociationMappings() as $assoc) { + if (!empty($assoc['joinTable']['name'])) { + $tables[] = strtolower($assoc['joinTable']['name']); + } + } } - return in_array($assetName, $this->allow, true); + $tables[] = 'doctrine_migration_versions'; + + $tables = array_values(array_unique($tables)); + $prefixes = array_map(static fn($t) => $t . '_', $tables); + + $this->allow = $tables; + $this->allowPrefixes = $prefixes; + + return [$this->allow, $this->allowPrefixes]; } } From f5ccafefff864c5e8de43d2b0b0a3785245523ff Mon Sep 17 00:00:00 2001 From: Tatevik Date: Thu, 30 Oct 2025 12:06:42 +0400 Subject: [PATCH 11/22] Rename indexes --- src/Domain/Analytics/Model/LinkTrack.php | 10 +++++----- src/Domain/Analytics/Model/LinkTrackForward.php | 6 +++--- src/Domain/Analytics/Model/LinkTrackMl.php | 4 ++-- src/Domain/Analytics/Model/LinkTrackUmlClick.php | 8 ++++---- .../Analytics/Model/LinkTrackUserClick.php | 10 +++++----- src/Domain/Analytics/Model/UserMessageView.php | 6 +++--- src/Domain/Analytics/Model/UserStats.php | 10 +++++----- src/Domain/Configuration/Model/EventLog.php | 4 ++-- src/Domain/Configuration/Model/I18n.php | 4 ++-- src/Domain/Configuration/Model/UrlCache.php | 2 +- src/Domain/Identity/Model/Administrator.php | 2 +- src/Domain/Messaging/Model/Bounce.php | 4 ++-- src/Domain/Messaging/Model/BounceRegex.php | 2 +- src/Domain/Messaging/Model/ListMessage.php | 4 ++-- src/Domain/Messaging/Model/Message.php | 2 +- src/Domain/Messaging/Model/MessageAttachment.php | 4 ++-- src/Domain/Messaging/Model/Template.php | 2 +- src/Domain/Messaging/Model/TemplateImage.php | 2 +- src/Domain/Messaging/Model/UserMessage.php | 10 +++++----- src/Domain/Messaging/Model/UserMessageBounce.php | 8 ++++---- .../Messaging/Model/UserMessageForward.php | 6 +++--- src/Domain/Subscription/Model/Subscriber.php | 16 ++++++++-------- .../Model/SubscriberAttributeDefinition.php | 4 ++-- .../Model/SubscriberAttributeValue.php | 6 +++--- .../Subscription/Model/SubscriberHistory.php | 4 ++-- src/Domain/Subscription/Model/SubscriberList.php | 4 ++-- src/Domain/Subscription/Model/Subscription.php | 8 ++++---- src/Domain/Subscription/Model/UserBlacklist.php | 2 +- .../Subscription/Model/UserBlacklistData.php | 4 ++-- 29 files changed, 79 insertions(+), 79 deletions(-) diff --git a/src/Domain/Analytics/Model/LinkTrack.php b/src/Domain/Analytics/Model/LinkTrack.php index 65f56318..848dde5e 100644 --- a/src/Domain/Analytics/Model/LinkTrack.php +++ b/src/Domain/Analytics/Model/LinkTrack.php @@ -13,11 +13,11 @@ #[ORM\Entity(repositoryClass: LinkTrackRepository::class)] #[ORM\Table(name: 'phplist_linktrack')] -#[ORM\UniqueConstraint(name: 'miduidurlindex', columns: ['messageid', 'userid', 'url'])] -#[ORM\Index(name: 'midindex', columns: ['messageid'])] -#[ORM\Index(name: 'miduidindex', columns: ['messageid', 'userid'])] -#[ORM\Index(name: 'uidindex', columns: ['userid'])] -#[ORM\Index(name: 'urlindex', columns: ['url'])] +#[ORM\UniqueConstraint(name: 'phplist_linktrack_miduidurlindex', columns: ['messageid', 'userid', 'url'])] +#[ORM\Index(name: 'phplist_linktrack_midindex', columns: ['messageid'])] +#[ORM\Index(name: 'phplist_linktrack_miduidindex', columns: ['messageid', 'userid'])] +#[ORM\Index(name: 'phplist_linktrack_uidindex', columns: ['userid'])] +#[ORM\Index(name: 'phplist_linktrack_urlindex', columns: ['url'])] class LinkTrack implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Analytics/Model/LinkTrackForward.php b/src/Domain/Analytics/Model/LinkTrackForward.php index 17049dfc..0e03c017 100644 --- a/src/Domain/Analytics/Model/LinkTrackForward.php +++ b/src/Domain/Analytics/Model/LinkTrackForward.php @@ -11,9 +11,9 @@ #[ORM\Entity(repositoryClass: LinkTrackForwardRepository::class)] #[ORM\Table(name: 'phplist_linktrack_forward')] -#[ORM\UniqueConstraint(name: 'urlunique', columns: ['urlhash'])] -#[ORM\Index(name: 'urlindex', columns: ['url'])] -#[ORM\Index(name: 'uuididx', columns: ['uuid'])] +#[ORM\UniqueConstraint(name: 'phplist_linktrack_forward_urlunique', columns: ['urlhash'])] +#[ORM\Index(name: 'phplist_linktrack_forward_urlindex', columns: ['url'])] +#[ORM\Index(name: 'phplist_linktrack_forward_uuididx', columns: ['uuid'])] class LinkTrackForward implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Analytics/Model/LinkTrackMl.php b/src/Domain/Analytics/Model/LinkTrackMl.php index 8569fa14..419c7911 100644 --- a/src/Domain/Analytics/Model/LinkTrackMl.php +++ b/src/Domain/Analytics/Model/LinkTrackMl.php @@ -11,8 +11,8 @@ #[ORM\Entity(repositoryClass: LinkTrackMlRepository::class)] #[ORM\Table(name: 'phplist_linktrack_ml')] -#[ORM\Index(name: 'fwdindex', columns: ['forwardid'])] -#[ORM\Index(name: 'midindex', columns: ['messageid'])] +#[ORM\Index(name: 'phplist_linktrack_ml_fwdindex', columns: ['forwardid'])] +#[ORM\Index(name: 'phplist_linktrack_ml_midindex', columns: ['messageid'])] class LinkTrackMl implements DomainModel { #[ORM\Id] diff --git a/src/Domain/Analytics/Model/LinkTrackUmlClick.php b/src/Domain/Analytics/Model/LinkTrackUmlClick.php index 2b8c8068..3faf811d 100644 --- a/src/Domain/Analytics/Model/LinkTrackUmlClick.php +++ b/src/Domain/Analytics/Model/LinkTrackUmlClick.php @@ -12,10 +12,10 @@ #[ORM\Entity(repositoryClass: LinkTrackUmlClickRepository::class)] #[ORM\Table(name: 'phplist_linktrack_uml_click')] -#[ORM\UniqueConstraint(name: 'miduidfwdid', columns: ['messageid', 'userid', 'forwardid'])] -#[ORM\Index(name: 'midindex', columns: ['messageid'])] -#[ORM\Index(name: 'miduidindex', columns: ['messageid', 'userid'])] -#[ORM\Index(name: 'uidindex', columns: ['userid'])] +#[ORM\UniqueConstraint(name: 'phplist_linktrack_uml_click_miduidfwdid', columns: ['messageid', 'userid', 'forwardid'])] +#[ORM\Index(name: 'phplist_linktrack_uml_click_midindex', columns: ['messageid'])] +#[ORM\Index(name: 'phplist_linktrack_uml_click_miduidindex', columns: ['messageid', 'userid'])] +#[ORM\Index(name: 'phplist_linktrack_uml_click_uidindex', columns: ['userid'])] class LinkTrackUmlClick implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Analytics/Model/LinkTrackUserClick.php b/src/Domain/Analytics/Model/LinkTrackUserClick.php index 464ae3e0..27205cbb 100644 --- a/src/Domain/Analytics/Model/LinkTrackUserClick.php +++ b/src/Domain/Analytics/Model/LinkTrackUserClick.php @@ -11,11 +11,11 @@ #[ORM\Entity(repositoryClass: LinkTrackUserClickRepository::class)] #[ORM\Table(name: 'phplist_linktrack_userclick')] -#[ORM\Index(name: 'linkindex', columns: ['linkid'])] -#[ORM\Index(name: 'linkuserindex', columns: ['linkid', 'userid'])] -#[ORM\Index(name: 'linkusermessageindex', columns: ['linkid', 'userid', 'messageid'])] -#[ORM\Index(name: 'midindex', columns: ['messageid'])] -#[ORM\Index(name: 'uidindex', columns: ['userid'])] +#[ORM\Index(name: 'phplist_linktrack_userclick_linkindex', columns: ['linkid'])] +#[ORM\Index(name: 'phplist_linktrack_userclick_linkuserindex', columns: ['linkid', 'userid'])] +#[ORM\Index(name: 'phplist_linktrack_userclick_linkusermessageindex', columns: ['linkid', 'userid', 'messageid'])] +#[ORM\Index(name: 'phplist_linktrack_userclick_midindex', columns: ['messageid'])] +#[ORM\Index(name: 'phplist_linktrack_userclick_uidindex', columns: ['userid'])] class LinkTrackUserClick implements DomainModel { #[ORM\Id] diff --git a/src/Domain/Analytics/Model/UserMessageView.php b/src/Domain/Analytics/Model/UserMessageView.php index 6b80b75e..846c8e97 100644 --- a/src/Domain/Analytics/Model/UserMessageView.php +++ b/src/Domain/Analytics/Model/UserMessageView.php @@ -12,9 +12,9 @@ #[ORM\Entity(repositoryClass: UserMessageViewRepository::class)] #[ORM\Table(name: 'phplist_user_message_view')] -#[ORM\Index(name: 'msgidx', columns: ['messageid'])] -#[ORM\Index(name: 'useridx', columns: ['userid'])] -#[ORM\Index(name: 'usermsgidx', columns: ['userid', 'messageid'])] +#[ORM\Index(name: 'phplist_user_message_view_msgidx', columns: ['messageid'])] +#[ORM\Index(name: 'phplist_user_message_view_useridx', columns: ['userid'])] +#[ORM\Index(name: 'phplist_user_message_view_usermsgidx', columns: ['userid', 'messageid'])] class UserMessageView implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Analytics/Model/UserStats.php b/src/Domain/Analytics/Model/UserStats.php index ef1eb469..c7b4b97e 100644 --- a/src/Domain/Analytics/Model/UserStats.php +++ b/src/Domain/Analytics/Model/UserStats.php @@ -11,11 +11,11 @@ #[ORM\Entity(repositoryClass: UserStatsRepository::class)] #[ORM\Table(name: 'phplist_userstats')] -#[ORM\UniqueConstraint(name: 'entry', columns: ['unixdate', 'item', 'listid'])] -#[ORM\Index(name: 'dateindex', columns: ['unixdate'])] -#[ORM\Index(name: 'itemindex', columns: ['item'])] -#[ORM\Index(name: 'listdateindex', columns: ['listid', 'unixdate'])] -#[ORM\Index(name: 'listindex', columns: ['listid'])] +#[ORM\UniqueConstraint(name: 'phplist_userstats_entry', columns: ['unixdate', 'item', 'listid'])] +#[ORM\Index(name: 'phplist_userstats_dateindex', columns: ['unixdate'])] +#[ORM\Index(name: 'phplist_userstats_itemindex', columns: ['item'])] +#[ORM\Index(name: 'phplist_userstats_listdateindex', columns: ['listid', 'unixdate'])] +#[ORM\Index(name: 'phplist_userstats_listindex', columns: ['listid'])] class UserStats implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Configuration/Model/EventLog.php b/src/Domain/Configuration/Model/EventLog.php index a5dbfdae..c0cff22b 100644 --- a/src/Domain/Configuration/Model/EventLog.php +++ b/src/Domain/Configuration/Model/EventLog.php @@ -13,8 +13,8 @@ #[ORM\Entity(repositoryClass: EventLogRepository::class)] #[ORM\Table(name: 'phplist_eventlog')] -#[ORM\Index(name: 'enteredidx', columns: ['entered'])] -#[ORM\Index(name: 'pageidx', columns: ['page'])] +#[ORM\Index(name: 'phplist_eventlog_enteredidx', columns: ['entered'])] +#[ORM\Index(name: 'phplist_eventlog_pageidx', columns: ['page'])] #[ORM\HasLifecycleCallbacks] class EventLog implements DomainModel, Identity { diff --git a/src/Domain/Configuration/Model/I18n.php b/src/Domain/Configuration/Model/I18n.php index b8eefd63..72397bb4 100644 --- a/src/Domain/Configuration/Model/I18n.php +++ b/src/Domain/Configuration/Model/I18n.php @@ -15,8 +15,8 @@ */ #[ORM\Entity(repositoryClass: I18nRepository::class)] #[ORM\Table(name: 'phplist_i18n')] -#[ORM\UniqueConstraint(name: 'lanorigunq', columns: ['lan', 'original'])] -#[ORM\Index(name: 'lanorigidx', columns: ['lan', 'original'])] +#[ORM\UniqueConstraint(name: 'phplist_i18n_lanorigunq', columns: ['lan', 'original'])] +#[ORM\Index(name: 'phplist_i18n_lanorigidx', columns: ['lan', 'original'])] class I18n implements DomainModel { #[ORM\Id] diff --git a/src/Domain/Configuration/Model/UrlCache.php b/src/Domain/Configuration/Model/UrlCache.php index 1f62268f..b6d032b9 100644 --- a/src/Domain/Configuration/Model/UrlCache.php +++ b/src/Domain/Configuration/Model/UrlCache.php @@ -12,7 +12,7 @@ #[ORM\Entity(repositoryClass: UrlCacheRepository::class)] #[ORM\Table(name: 'phplist_urlcache')] -#[ORM\Index(name: 'urlindex', columns: ['url'])] +#[ORM\Index(name: 'phplist_urlcache_urlindex', columns: ['url'])] #[ORM\HasLifecycleCallbacks] class UrlCache implements DomainModel, Identity { diff --git a/src/Domain/Identity/Model/Administrator.php b/src/Domain/Identity/Model/Administrator.php index 34c8a49b..6e0d0882 100644 --- a/src/Domain/Identity/Model/Administrator.php +++ b/src/Domain/Identity/Model/Administrator.php @@ -23,7 +23,7 @@ */ #[ORM\Entity(repositoryClass: AdministratorRepository::class)] #[ORM\Table(name: 'phplist_admin')] -#[ORM\UniqueConstraint(name: 'loginnameidx', columns: ['loginname'])] +#[ORM\UniqueConstraint(name: 'phplist_admin_loginnameidx', columns: ['loginname'])] #[ORM\HasLifecycleCallbacks] class Administrator implements DomainModel, Identity, CreationDate, ModificationDate { diff --git a/src/Domain/Messaging/Model/Bounce.php b/src/Domain/Messaging/Model/Bounce.php index b90f7ef0..dd3471e9 100644 --- a/src/Domain/Messaging/Model/Bounce.php +++ b/src/Domain/Messaging/Model/Bounce.php @@ -12,8 +12,8 @@ #[ORM\Entity(repositoryClass: BounceRepository::class)] #[ORM\Table(name: 'phplist_bounce')] -#[ORM\Index(name: 'dateindex', columns: ['date'])] -#[ORM\Index(name: 'statusidx', columns: ['status'])] +#[ORM\Index(name: 'phplist_bounce_dateindex', columns: ['date'])] +#[ORM\Index(name: 'phplist_bounce_statusidx', columns: ['status'])] class Bounce implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Messaging/Model/BounceRegex.php b/src/Domain/Messaging/Model/BounceRegex.php index 0401d26b..c54ca7c0 100644 --- a/src/Domain/Messaging/Model/BounceRegex.php +++ b/src/Domain/Messaging/Model/BounceRegex.php @@ -11,7 +11,7 @@ #[ORM\Entity(repositoryClass: BounceRegexRepository::class)] #[ORM\Table(name: 'phplist_bounceregex')] -#[ORM\UniqueConstraint(name: 'regex', columns: ['regexhash'])] +#[ORM\UniqueConstraint(name: 'phplist_bounceregex_regex', columns: ['regexhash'])] class BounceRegex implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Messaging/Model/ListMessage.php b/src/Domain/Messaging/Model/ListMessage.php index bf586e7c..0a488bdd 100644 --- a/src/Domain/Messaging/Model/ListMessage.php +++ b/src/Domain/Messaging/Model/ListMessage.php @@ -15,8 +15,8 @@ #[ORM\Entity(repositoryClass: ListMessageRepository::class)] #[ORM\Table(name: 'phplist_listmessage')] -#[ORM\UniqueConstraint(name: 'messageid', columns: ['messageid', 'listid'])] -#[ORM\Index(name: 'listmessageidx', columns: ['listid', 'messageid'])] +#[ORM\UniqueConstraint(name: 'phplist_listmessage_messageid', columns: ['messageid', 'listid'])] +#[ORM\Index(name: 'phplist_listmessage_listmessageidx', columns: ['listid', 'messageid'])] #[ORM\HasLifecycleCallbacks] class ListMessage implements DomainModel, Identity, ModificationDate { diff --git a/src/Domain/Messaging/Model/Message.php b/src/Domain/Messaging/Model/Message.php index ca7b842f..90f5036c 100644 --- a/src/Domain/Messaging/Model/Message.php +++ b/src/Domain/Messaging/Model/Message.php @@ -23,7 +23,7 @@ #[ORM\Entity(repositoryClass: MessageRepository::class)] #[ORM\Table(name: 'phplist_message')] -#[ORM\Index(name: 'uuididx', columns: ['uuid'])] +#[ORM\Index(name: 'phplist_message_uuididx', columns: ['uuid'])] #[ORM\HasLifecycleCallbacks] class Message implements DomainModel, Identity, ModificationDate, OwnableInterface { diff --git a/src/Domain/Messaging/Model/MessageAttachment.php b/src/Domain/Messaging/Model/MessageAttachment.php index 2675790d..e26d0d87 100644 --- a/src/Domain/Messaging/Model/MessageAttachment.php +++ b/src/Domain/Messaging/Model/MessageAttachment.php @@ -10,8 +10,8 @@ #[ORM\Entity(repositoryClass: MessageAttachmentRepository::class)] #[ORM\Table(name: 'phplist_message_attachment')] -#[ORM\Index(name: 'messageattidx', columns: ['messageid', 'attachmentid'])] -#[ORM\Index(name: 'messageidx', columns: ['messageid'])] +#[ORM\Index(name: 'phplist_message_attachment_messageattidx', columns: ['messageid', 'attachmentid'])] +#[ORM\Index(name: 'phplist_message_attachment_messageidx', columns: ['messageid'])] class MessageAttachment implements Identity { #[ORM\Id] diff --git a/src/Domain/Messaging/Model/Template.php b/src/Domain/Messaging/Model/Template.php index f7e3f5d0..efff0de4 100644 --- a/src/Domain/Messaging/Model/Template.php +++ b/src/Domain/Messaging/Model/Template.php @@ -13,7 +13,7 @@ #[ORM\Entity(repositoryClass: TemplateRepository::class)] #[ORM\Table(name: 'phplist_template')] -#[ORM\UniqueConstraint(name: 'title', columns: ['title'])] +#[ORM\UniqueConstraint(name: 'phplist_template_title', columns: ['title'])] class Template implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Messaging/Model/TemplateImage.php b/src/Domain/Messaging/Model/TemplateImage.php index 1ef7d7b5..2cc5288f 100644 --- a/src/Domain/Messaging/Model/TemplateImage.php +++ b/src/Domain/Messaging/Model/TemplateImage.php @@ -11,7 +11,7 @@ #[ORM\Entity(repositoryClass: TemplateImageRepository::class)] #[ORM\Table(name: 'phplist_templateimage')] -#[ORM\Index(name: 'templateidx', columns: ['template'])] +#[ORM\Index(name: 'phplist_templateimage_templateidx', columns: ['template'])] class TemplateImage implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Messaging/Model/UserMessage.php b/src/Domain/Messaging/Model/UserMessage.php index c846fa11..cdb6b7c2 100644 --- a/src/Domain/Messaging/Model/UserMessage.php +++ b/src/Domain/Messaging/Model/UserMessage.php @@ -13,11 +13,11 @@ #[ORM\Entity(repositoryClass: UserMessageRepository::class)] #[ORM\Table(name: 'phplist_usermessage')] -#[ORM\Index(name: 'enteredindex', columns: ['entered'])] -#[ORM\Index(name: 'messageidindex', columns: ['messageid'])] -#[ORM\Index(name: 'statusidx', columns: ['status'])] -#[ORM\Index(name: 'useridindex', columns: ['userid'])] -#[ORM\Index(name: 'viewedidx', columns: ['viewed'])] +#[ORM\Index(name: 'phplist_usermessage_enteredindex', columns: ['entered'])] +#[ORM\Index(name: 'phplist_usermessage_messageidindex', columns: ['messageid'])] +#[ORM\Index(name: 'phplist_usermessage_statusidx', columns: ['status'])] +#[ORM\Index(name: 'phplist_usermessage_useridindex', columns: ['userid'])] +#[ORM\Index(name: 'phplist_usermessage_viewedidx', columns: ['viewed'])] class UserMessage implements DomainModel { #[ORM\Id] diff --git a/src/Domain/Messaging/Model/UserMessageBounce.php b/src/Domain/Messaging/Model/UserMessageBounce.php index b4adbaa9..3b58bf47 100644 --- a/src/Domain/Messaging/Model/UserMessageBounce.php +++ b/src/Domain/Messaging/Model/UserMessageBounce.php @@ -12,10 +12,10 @@ #[ORM\Entity(repositoryClass: UserMessageBounceRepository::class)] #[ORM\Table(name: 'phplist_user_message_bounce')] -#[ORM\Index(name: 'bounceidx', columns: ['bounce'])] -#[ORM\Index(name: 'msgidx', columns: ['message'])] -#[ORM\Index(name: 'umbindex', columns: ['user', 'message', 'bounce'])] -#[ORM\Index(name: 'useridx', columns: ['user'])] +#[ORM\Index(name: 'phplist_user_message_bounce_bounceidx', columns: ['bounce'])] +#[ORM\Index(name: 'phplist_user_message_bounce_msgidx', columns: ['message'])] +#[ORM\Index(name: 'phplist_user_message_bounce_umbindex', columns: ['user', 'message', 'bounce'])] +#[ORM\Index(name: 'phplist_user_message_bounce_useridx', columns: ['user'])] class UserMessageBounce implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Messaging/Model/UserMessageForward.php b/src/Domain/Messaging/Model/UserMessageForward.php index 9b2a8ef4..3b920189 100644 --- a/src/Domain/Messaging/Model/UserMessageForward.php +++ b/src/Domain/Messaging/Model/UserMessageForward.php @@ -12,9 +12,9 @@ #[ORM\Entity(repositoryClass: UserMessageForwardRepository::class)] #[ORM\Table(name: 'phplist_user_message_forward')] -#[ORM\Index(name: 'messageidx', columns: ['message'])] -#[ORM\Index(name: 'useridx', columns: ['user'])] -#[ORM\Index(name: 'usermessageidx', columns: ['user', 'message'])] +#[ORM\Index(name: 'phplist_user_message_forward_messageidx', columns: ['message'])] +#[ORM\Index(name: 'phplist_user_message_forward_useridx', columns: ['user'])] +#[ORM\Index(name: 'phplist_user_message_forward_usermessageidx', columns: ['user', 'message'])] class UserMessageForward implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Subscription/Model/Subscriber.php b/src/Domain/Subscription/Model/Subscriber.php index c332544f..a0c35d73 100644 --- a/src/Domain/Subscription/Model/Subscriber.php +++ b/src/Domain/Subscription/Model/Subscriber.php @@ -23,14 +23,14 @@ */ #[ORM\Entity(repositoryClass: SubscriberRepository::class)] #[ORM\Table(name: 'phplist_user_user')] -#[ORM\Index(name: 'idxuniqid', columns: ['uniqid'])] -#[ORM\Index(name: 'enteredindex', columns: ['entered'])] -#[ORM\Index(name: 'confidx', columns: ['confirmed'])] -#[ORM\Index(name: 'blidx', columns: ['blacklisted'])] -#[ORM\Index(name: 'optidx', columns: ['optedin'])] -#[ORM\Index(name: 'uuididx', columns: ['uuid'])] -#[ORM\Index(name: 'foreignkey', columns: ['foreignkey'])] -#[ORM\UniqueConstraint(name: 'email', columns: ['email'])] +#[ORM\Index(name: 'phplist_user_user_idxuniqid', columns: ['uniqid'])] +#[ORM\Index(name: 'phplist_user_user_enteredindex', columns: ['entered'])] +#[ORM\Index(name: 'phplist_user_user_confidx', columns: ['confirmed'])] +#[ORM\Index(name: 'phplist_user_user_blidx', columns: ['blacklisted'])] +#[ORM\Index(name: 'phplist_user_user_optidx', columns: ['optedin'])] +#[ORM\Index(name: 'phplist_user_user_uuididx', columns: ['uuid'])] +#[ORM\Index(name: 'phplist_user_user_foreignkey', columns: ['foreignkey'])] +#[ORM\UniqueConstraint(name: 'phplist_user_user_email', columns: ['email'])] #[ORM\HasLifecycleCallbacks] class Subscriber implements DomainModel, Identity, CreationDate, ModificationDate { diff --git a/src/Domain/Subscription/Model/SubscriberAttributeDefinition.php b/src/Domain/Subscription/Model/SubscriberAttributeDefinition.php index dc7259d6..7b943b5c 100644 --- a/src/Domain/Subscription/Model/SubscriberAttributeDefinition.php +++ b/src/Domain/Subscription/Model/SubscriberAttributeDefinition.php @@ -11,8 +11,8 @@ #[ORM\Entity(repositoryClass: SubscriberAttributeDefinitionRepository::class)] #[ORM\Table(name: 'phplist_user_attribute')] -#[ORM\Index(name: 'idnameindex', columns: ['id', 'name'])] -#[ORM\Index(name: 'nameindex', columns: ['name'])] +#[ORM\Index(name: 'phplist_user_attribute_idnameindex', columns: ['id', 'name'])] +#[ORM\Index(name: 'phplist_user_attribute_nameindex', columns: ['name'])] class SubscriberAttributeDefinition implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Subscription/Model/SubscriberAttributeValue.php b/src/Domain/Subscription/Model/SubscriberAttributeValue.php index 05209709..d2144f95 100644 --- a/src/Domain/Subscription/Model/SubscriberAttributeValue.php +++ b/src/Domain/Subscription/Model/SubscriberAttributeValue.php @@ -10,9 +10,9 @@ #[ORM\Entity(repositoryClass: SubscriberAttributeValueRepository::class)] #[ORM\Table(name: 'phplist_user_user_attribute')] -#[ORM\Index(name: 'attindex', columns: ['attributeid'])] -#[ORM\Index(name: 'attuserid', columns: ['userid', 'attributeid'])] -#[ORM\Index(name: 'userindex', columns: ['userid'])] +#[ORM\Index(name: 'phplist_user_user_attribute_attindex', columns: ['attributeid'])] +#[ORM\Index(name: 'phplist_user_user_attribute_attuserid', columns: ['userid', 'attributeid'])] +#[ORM\Index(name: 'phplist_user_user_attribute_userindex', columns: ['userid'])] class SubscriberAttributeValue implements DomainModel { #[ORM\Id] diff --git a/src/Domain/Subscription/Model/SubscriberHistory.php b/src/Domain/Subscription/Model/SubscriberHistory.php index 0eaa3f7a..1799c01b 100644 --- a/src/Domain/Subscription/Model/SubscriberHistory.php +++ b/src/Domain/Subscription/Model/SubscriberHistory.php @@ -12,8 +12,8 @@ #[ORM\Entity(repositoryClass: SubscriberHistoryRepository::class)] #[ORM\Table(name: 'phplist_user_user_history')] -#[ORM\Index(name: 'dateidx', columns: ['date'])] -#[ORM\Index(name: 'userididx', columns: ['userid'])] +#[ORM\Index(name: 'phplist_user_user_history_dateidx', columns: ['date'])] +#[ORM\Index(name: 'phplist_user_user_history_userididx', columns: ['userid'])] class SubscriberHistory implements DomainModel, Identity { #[ORM\Id] diff --git a/src/Domain/Subscription/Model/SubscriberList.php b/src/Domain/Subscription/Model/SubscriberList.php index 966cc308..e23e8735 100644 --- a/src/Domain/Subscription/Model/SubscriberList.php +++ b/src/Domain/Subscription/Model/SubscriberList.php @@ -26,8 +26,8 @@ */ #[ORM\Entity(repositoryClass: SubscriberListRepository::class)] #[ORM\Table(name: 'phplist_list')] -#[ORM\Index(name: 'nameidx', columns: ['name'])] -#[ORM\Index(name: 'listorderidx', columns: ['listorder'])] +#[ORM\Index(name: 'phplist_list_nameidx', columns: ['name'])] +#[ORM\Index(name: 'phplist_list_listorderidx', columns: ['listorder'])] #[ORM\HasLifecycleCallbacks] class SubscriberList implements DomainModel, Identity, CreationDate, ModificationDate, OwnableInterface { diff --git a/src/Domain/Subscription/Model/Subscription.php b/src/Domain/Subscription/Model/Subscription.php index 89a6287c..fe4b5e2a 100644 --- a/src/Domain/Subscription/Model/Subscription.php +++ b/src/Domain/Subscription/Model/Subscription.php @@ -23,10 +23,10 @@ */ #[ORM\Entity(repositoryClass: SubscriptionRepository::class)] #[ORM\Table(name: 'phplist_listuser')] -#[ORM\Index(name: 'userenteredidx', columns: ['userid', 'entered'])] -#[ORM\Index(name: 'userlistenteredidx', columns: ['userid', 'entered', 'listid'])] -#[ORM\Index(name: 'useridx', columns: ['userid'])] -#[ORM\Index(name: 'listidx', columns: ['listid'])] +#[ORM\Index(name: 'phplist_listuser_userenteredidx', columns: ['userid', 'entered'])] +#[ORM\Index(name: 'phplist_listuser_userlistenteredidx', columns: ['userid', 'entered', 'listid'])] +#[ORM\Index(name: 'phplist_listuser_useridx', columns: ['userid'])] +#[ORM\Index(name: 'phplist_listuser_listidx', columns: ['listid'])] #[ORM\HasLifecycleCallbacks] class Subscription implements DomainModel, CreationDate, ModificationDate { diff --git a/src/Domain/Subscription/Model/UserBlacklist.php b/src/Domain/Subscription/Model/UserBlacklist.php index 73d5b42c..9b150686 100644 --- a/src/Domain/Subscription/Model/UserBlacklist.php +++ b/src/Domain/Subscription/Model/UserBlacklist.php @@ -11,7 +11,7 @@ #[ORM\Entity(repositoryClass: UserBlacklistRepository::class)] #[ORM\Table(name: 'phplist_user_blacklist')] -#[ORM\Index(name: 'emailidx', columns: ['email'])] +#[ORM\Index(name: 'phplist_user_blacklist_emailidx', columns: ['email'])] class UserBlacklist implements DomainModel { #[ORM\Id] diff --git a/src/Domain/Subscription/Model/UserBlacklistData.php b/src/Domain/Subscription/Model/UserBlacklistData.php index 4aaa19ad..4ac769e9 100644 --- a/src/Domain/Subscription/Model/UserBlacklistData.php +++ b/src/Domain/Subscription/Model/UserBlacklistData.php @@ -10,8 +10,8 @@ #[ORM\Entity(repositoryClass: UserBlacklistDataRepository::class)] #[ORM\Table(name: 'phplist_user_blacklist_data')] -#[ORM\Index(name: 'emailidx', columns: ['email'])] -#[ORM\Index(name: 'emailnameidx', columns: ['email', 'name'])] +#[ORM\Index(name: 'phplist_user_blacklist_data_emailidx', columns: ['email'])] +#[ORM\Index(name: 'phplist_user_blacklist_data_emailnameidx', columns: ['email', 'name'])] class UserBlacklistData implements DomainModel { #[ORM\Id] From 1219b3f9f4d6aa78e651a163c66439cee8a2a748 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Thu, 30 Oct 2025 12:28:24 +0400 Subject: [PATCH 12/22] PostgreSqlPlatform --- config/config_test.yml | 14 +- src/Core/Doctrine/OnlyOrmTablesFilter.php | 3 - ...ersion20251030081120PostgreSqlPlatform.php | 258 ++++++++++++++++++ 3 files changed, 265 insertions(+), 10 deletions(-) create mode 100644 src/Migrations/Version20251030081120PostgreSqlPlatform.php diff --git a/config/config_test.yml b/config/config_test.yml index 7d47d878..66d2ddea 100644 --- a/config/config_test.yml +++ b/config/config_test.yml @@ -13,11 +13,11 @@ doctrine: dbal: # driver: 'pdo_sqlite' # memory: true - driver: 'pdo_pgsql' - host: '%database_host%' - port: '5433' - dbname: 'phplistdb' - user: '%database_user%' - password: '%database_password%' - charset: UTF8 + driver: 'pdo_mysql' + host: '%database_host%' + port: '%database_port%' + dbname: 'phplist' + user: '%database_user%' + password: '%database_password%' + charset: UTF8 diff --git a/src/Core/Doctrine/OnlyOrmTablesFilter.php b/src/Core/Doctrine/OnlyOrmTablesFilter.php index 95fdd2d3..49327710 100644 --- a/src/Core/Doctrine/OnlyOrmTablesFilter.php +++ b/src/Core/Doctrine/OnlyOrmTablesFilter.php @@ -18,9 +18,6 @@ class OnlyOrmTablesFilter public function __construct(private readonly EntityManagerInterface $entityManager) {} - /** - * Doctrine (DBAL 3+) may pass strings OR AbstractAsset (Table, Sequence, etc.). - */ public function __invoke(string|AbstractAsset $asset): bool { $name = \is_string($asset) ? $asset : $asset->getName(); diff --git a/src/Migrations/Version20251030081120PostgreSqlPlatform.php b/src/Migrations/Version20251030081120PostgreSqlPlatform.php new file mode 100644 index 00000000..443d7df7 --- /dev/null +++ b/src/Migrations/Version20251030081120PostgreSqlPlatform.php @@ -0,0 +1,258 @@ +connection->getDatabasePlatform(); + $this->skipIf( + !$platform instanceof PostgreSqlPlatform, + sprintf( + 'This migration is only applicable for MySQL. Current platform: %s', + get_class($platform) + ) + ); + // this up() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE TABLE phplist_admin (id INT NOT NULL, created TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, loginname VARCHAR(66) NOT NULL, namelc VARCHAR(255) DEFAULT NULL, email VARCHAR(255) NOT NULL, modifiedby VARCHAR(66) DEFAULT NULL, password VARCHAR(255) DEFAULT NULL, passwordchanged DATE DEFAULT NULL, disabled BOOLEAN NOT NULL, superuser BOOLEAN NOT NULL, privileges TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX phplist_admin_loginnameidx ON phplist_admin (loginname)'); + $this->addSql('CREATE TABLE phplist_admin_attribute (adminattributeid INT NOT NULL, adminid INT NOT NULL, value VARCHAR(255) DEFAULT NULL, PRIMARY KEY(adminattributeid, adminid))'); + $this->addSql('CREATE INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute (adminattributeid)'); + $this->addSql('CREATE INDEX IDX_58E07690B8ED4D93 ON phplist_admin_attribute (adminid)'); + $this->addSql('CREATE TABLE phplist_admin_login (id INT NOT NULL, adminid INT NOT NULL, moment BIGINT NOT NULL, remote_ip4 VARCHAR(32) NOT NULL, remote_ip6 VARCHAR(50) NOT NULL, sessionid VARCHAR(50) NOT NULL, active BOOLEAN NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_5FCE0842B8ED4D93 ON phplist_admin_login (adminid)'); + $this->addSql('CREATE TABLE phplist_admin_password_request (id_key INT NOT NULL, admin INT DEFAULT NULL, date TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, key_value VARCHAR(32) NOT NULL, PRIMARY KEY(id_key))'); + $this->addSql('CREATE INDEX IDX_DC146F3B880E0D76 ON phplist_admin_password_request (admin)'); + $this->addSql('CREATE TABLE phplist_adminattribute (id INT NOT NULL, name VARCHAR(255) NOT NULL, type VARCHAR(30) DEFAULT NULL, listorder INT DEFAULT NULL, default_value VARCHAR(255) DEFAULT NULL, required BOOLEAN DEFAULT NULL, tablename VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE phplist_admintoken (id INT NOT NULL, adminid INT DEFAULT NULL, entered INT NOT NULL, expires TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, value VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken (adminid)'); + $this->addSql('CREATE TABLE phplist_attachment (id INT NOT NULL, filename VARCHAR(255) DEFAULT NULL, remotefile VARCHAR(255) DEFAULT NULL, mimetype VARCHAR(255) DEFAULT NULL, description TEXT DEFAULT NULL, size INT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE phplist_bounce (id INT NOT NULL, date TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, header TEXT DEFAULT NULL, data BYTEA DEFAULT NULL, status VARCHAR(20) DEFAULT NULL, comment TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_bounce_dateindex ON phplist_bounce (date)'); + $this->addSql('CREATE INDEX phplist_bounce_statusidx ON phplist_bounce (status)'); + $this->addSql('CREATE TABLE phplist_bounceregex (id INT NOT NULL, regex VARCHAR(2083) DEFAULT NULL, regexhash VARCHAR(32) DEFAULT NULL, action VARCHAR(255) DEFAULT NULL, listorder INT DEFAULT 0, admin INT DEFAULT NULL, comment TEXT DEFAULT NULL, status VARCHAR(255) DEFAULT NULL, count INT DEFAULT 0, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX phplist_bounceregex_regex ON phplist_bounceregex (regexhash)'); + $this->addSql('CREATE TABLE phplist_bounceregex_bounce (regex INT NOT NULL, bounce INT NOT NULL, PRIMARY KEY(regex, bounce))'); + $this->addSql('CREATE TABLE phplist_config (item VARCHAR(35) NOT NULL, value TEXT DEFAULT NULL, editable BOOLEAN DEFAULT true NOT NULL, type VARCHAR(25) DEFAULT NULL, PRIMARY KEY(item))'); + $this->addSql('CREATE TABLE phplist_eventlog (id INT NOT NULL, entered TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, page VARCHAR(100) DEFAULT NULL, entry TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_eventlog_enteredidx ON phplist_eventlog (entered)'); + $this->addSql('CREATE INDEX phplist_eventlog_pageidx ON phplist_eventlog (page)'); + $this->addSql('CREATE TABLE phplist_i18n (lan VARCHAR(10) NOT NULL, original VARCHAR(255) NOT NULL, translation TEXT NOT NULL, PRIMARY KEY(lan, original))'); + $this->addSql('CREATE UNIQUE INDEX phplist_i18n_lanorigunq ON phplist_i18n (lan, original)'); + $this->addSql('CREATE TABLE phplist_linktrack (linkid INT NOT NULL, messageid INT NOT NULL, userid INT NOT NULL, url VARCHAR(255) DEFAULT NULL, forward VARCHAR(255) DEFAULT NULL, firstclick TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, latestclick TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, clicked INT DEFAULT 0, PRIMARY KEY(linkid))'); + $this->addSql('CREATE INDEX phplist_linktrack_midindex ON phplist_linktrack (messageid)'); + $this->addSql('CREATE INDEX phplist_linktrack_miduidindex ON phplist_linktrack (messageid, userid)'); + $this->addSql('CREATE INDEX phplist_linktrack_uidindex ON phplist_linktrack (userid)'); + $this->addSql('CREATE INDEX phplist_linktrack_urlindex ON phplist_linktrack (url)'); + $this->addSql('CREATE UNIQUE INDEX phplist_linktrack_miduidurlindex ON phplist_linktrack (messageid, userid, url)'); + $this->addSql('CREATE TABLE phplist_linktrack_forward (id INT NOT NULL, url VARCHAR(255) DEFAULT NULL, urlhash VARCHAR(32) DEFAULT NULL, uuid VARCHAR(36) DEFAULT \'\', personalise BOOLEAN DEFAULT false, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_linktrack_forward_urlindex ON phplist_linktrack_forward (url)'); + $this->addSql('CREATE INDEX phplist_linktrack_forward_uuididx ON phplist_linktrack_forward (uuid)'); + $this->addSql('CREATE UNIQUE INDEX phplist_linktrack_forward_urlunique ON phplist_linktrack_forward (urlhash)'); + $this->addSql('CREATE TABLE phplist_linktrack_ml (messageid INT NOT NULL, forwardid INT NOT NULL, firstclick TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, latestclick TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, total INT DEFAULT 0, clicked INT DEFAULT 0, htmlclicked INT DEFAULT 0, textclicked INT DEFAULT 0, PRIMARY KEY(messageid, forwardid))'); + $this->addSql('CREATE INDEX phplist_linktrack_ml_fwdindex ON phplist_linktrack_ml (forwardid)'); + $this->addSql('CREATE INDEX phplist_linktrack_ml_midindex ON phplist_linktrack_ml (messageid)'); + $this->addSql('CREATE TABLE phplist_linktrack_uml_click (id INT NOT NULL, messageid INT NOT NULL, userid INT NOT NULL, forwardid INT DEFAULT NULL, firstclick TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, latestclick TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, clicked INT DEFAULT 0, htmlclicked INT DEFAULT 0, textclicked INT DEFAULT 0, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_linktrack_uml_click_midindex ON phplist_linktrack_uml_click (messageid)'); + $this->addSql('CREATE INDEX phplist_linktrack_uml_click_miduidindex ON phplist_linktrack_uml_click (messageid, userid)'); + $this->addSql('CREATE INDEX phplist_linktrack_uml_click_uidindex ON phplist_linktrack_uml_click (userid)'); + $this->addSql('CREATE UNIQUE INDEX phplist_linktrack_uml_click_miduidfwdid ON phplist_linktrack_uml_click (messageid, userid, forwardid)'); + $this->addSql('CREATE TABLE phplist_linktrack_userclick (linkid INT NOT NULL, userid INT NOT NULL, messageid INT NOT NULL, name VARCHAR(255) DEFAULT NULL, data TEXT DEFAULT NULL, date TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(linkid, userid, messageid))'); + $this->addSql('CREATE INDEX phplist_linktrack_userclick_linkindex ON phplist_linktrack_userclick (linkid)'); + $this->addSql('CREATE INDEX phplist_linktrack_userclick_linkuserindex ON phplist_linktrack_userclick (linkid, userid)'); + $this->addSql('CREATE INDEX phplist_linktrack_userclick_linkusermessageindex ON phplist_linktrack_userclick (linkid, userid, messageid)'); + $this->addSql('CREATE INDEX phplist_linktrack_userclick_midindex ON phplist_linktrack_userclick (messageid)'); + $this->addSql('CREATE INDEX phplist_linktrack_userclick_uidindex ON phplist_linktrack_userclick (userid)'); + $this->addSql('CREATE TABLE phplist_list (id INT NOT NULL, owner INT DEFAULT NULL, name VARCHAR(255) NOT NULL, rssfeed VARCHAR(255) DEFAULT NULL, description VARCHAR(255) NOT NULL, entered TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, listorder INT DEFAULT NULL, prefix VARCHAR(10) DEFAULT NULL, active BOOLEAN NOT NULL, category VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_A4CE8621CF60E67C ON phplist_list (owner)'); + $this->addSql('CREATE INDEX phplist_list_nameidx ON phplist_list (name)'); + $this->addSql('CREATE INDEX phplist_list_listorderidx ON phplist_list (listorder)'); + $this->addSql('CREATE TABLE phplist_listmessage (id INT NOT NULL, messageid INT NOT NULL, listid INT NOT NULL, entered TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_83B22D7A31478478 ON phplist_listmessage (messageid)'); + $this->addSql('CREATE INDEX IDX_83B22D7A8E44C1EF ON phplist_listmessage (listid)'); + $this->addSql('CREATE INDEX phplist_listmessage_listmessageidx ON phplist_listmessage (listid, messageid)'); + $this->addSql('CREATE UNIQUE INDEX phplist_listmessage_messageid ON phplist_listmessage (messageid, listid)'); + $this->addSql('CREATE TABLE phplist_listuser (userid INT NOT NULL, listid INT NOT NULL, entered TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, PRIMARY KEY(userid, listid))'); + $this->addSql('CREATE INDEX phplist_listuser_userenteredidx ON phplist_listuser (userid, entered)'); + $this->addSql('CREATE INDEX phplist_listuser_userlistenteredidx ON phplist_listuser (userid, entered, listid)'); + $this->addSql('CREATE INDEX phplist_listuser_useridx ON phplist_listuser (userid)'); + $this->addSql('CREATE INDEX phplist_listuser_listidx ON phplist_listuser (listid)'); + $this->addSql('CREATE TABLE phplist_message (id INT NOT NULL, owner INT DEFAULT NULL, template INT DEFAULT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, uuid VARCHAR(36) DEFAULT \'\', htmlformatted BOOLEAN NOT NULL, sendformat VARCHAR(20) DEFAULT NULL, astext BOOLEAN DEFAULT false NOT NULL, ashtml BOOLEAN DEFAULT false NOT NULL, aspdf BOOLEAN DEFAULT false NOT NULL, astextandhtml BOOLEAN DEFAULT false NOT NULL, astextandpdf BOOLEAN DEFAULT false NOT NULL, repeatinterval INT DEFAULT 0, repeatuntil TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, requeueinterval INT DEFAULT 0, requeueuntil TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, embargo TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, status VARCHAR(255) DEFAULT NULL, processed BOOLEAN DEFAULT false NOT NULL, viewed INT DEFAULT 0 NOT NULL, bouncecount INT DEFAULT 0 NOT NULL, entered TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, sent TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, sendstart TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, subject VARCHAR(255) DEFAULT \'(no subject)\' NOT NULL, message TEXT DEFAULT NULL, textmessage TEXT DEFAULT NULL, footer TEXT DEFAULT NULL, fromfield VARCHAR(255) DEFAULT \'\' NOT NULL, tofield VARCHAR(255) DEFAULT \'\' NOT NULL, replyto VARCHAR(255) DEFAULT \'\' NOT NULL, userselection TEXT DEFAULT NULL, rsstemplate VARCHAR(100) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_C5D81FCDCF60E67C ON phplist_message (owner)'); + $this->addSql('CREATE INDEX IDX_C5D81FCD97601F83 ON phplist_message (template)'); + $this->addSql('CREATE INDEX phplist_message_uuididx ON phplist_message (uuid)'); + $this->addSql('CREATE TABLE phplist_message_attachment (id INT NOT NULL, messageid INT NOT NULL, attachmentid INT NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_message_attachment_messageattidx ON phplist_message_attachment (messageid, attachmentid)'); + $this->addSql('CREATE INDEX phplist_message_attachment_messageidx ON phplist_message_attachment (messageid)'); + $this->addSql('CREATE TABLE phplist_messagedata (name VARCHAR(100) NOT NULL, id INT NOT NULL, data TEXT DEFAULT NULL, PRIMARY KEY(name, id))'); + $this->addSql('CREATE TABLE phplist_sendprocess (id INT NOT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, started TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, alive INT DEFAULT 1, ipaddress VARCHAR(50) DEFAULT NULL, page VARCHAR(100) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE phplist_subscribepage (id INT NOT NULL, owner INT DEFAULT NULL, title VARCHAR(255) NOT NULL, active BOOLEAN DEFAULT false NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX IDX_5BAC7737CF60E67C ON phplist_subscribepage (owner)'); + $this->addSql('CREATE TABLE phplist_subscribepage_data (id INT NOT NULL, name VARCHAR(100) NOT NULL, data TEXT DEFAULT NULL, PRIMARY KEY(id, name))'); + $this->addSql('CREATE TABLE phplist_template (id INT NOT NULL, title VARCHAR(255) NOT NULL, template BYTEA DEFAULT NULL, template_text BYTEA DEFAULT NULL, listorder INT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE UNIQUE INDEX phplist_template_title ON phplist_template (title)'); + $this->addSql('CREATE TABLE phplist_templateimage (id INT NOT NULL, template INT NOT NULL, mimetype VARCHAR(100) DEFAULT NULL, filename VARCHAR(100) DEFAULT NULL, data BYTEA DEFAULT NULL, width INT DEFAULT NULL, height INT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_templateimage_templateidx ON phplist_templateimage (template)'); + $this->addSql('CREATE TABLE phplist_urlcache (id INT NOT NULL, url VARCHAR(255) NOT NULL, lastmodified INT DEFAULT NULL, added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, content BYTEA DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_urlcache_urlindex ON phplist_urlcache (url)'); + $this->addSql('CREATE TABLE phplist_user_attribute (id INT NOT NULL, name VARCHAR(255) NOT NULL, type VARCHAR(30) DEFAULT NULL, listorder INT DEFAULT NULL, default_value VARCHAR(255) DEFAULT NULL, required BOOLEAN DEFAULT NULL, tablename VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_user_attribute_idnameindex ON phplist_user_attribute (id, name)'); + $this->addSql('CREATE INDEX phplist_user_attribute_nameindex ON phplist_user_attribute (name)'); + $this->addSql('CREATE TABLE phplist_user_blacklist (email VARCHAR(255) NOT NULL, added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, PRIMARY KEY(email))'); + $this->addSql('CREATE INDEX phplist_user_blacklist_emailidx ON phplist_user_blacklist (email)'); + $this->addSql('CREATE TABLE phplist_user_blacklist_data (email VARCHAR(255) NOT NULL, name VARCHAR(25) NOT NULL, data TEXT DEFAULT NULL, PRIMARY KEY(email))'); + $this->addSql('CREATE INDEX phplist_user_blacklist_data_emailidx ON phplist_user_blacklist_data (email)'); + $this->addSql('CREATE INDEX phplist_user_blacklist_data_emailnameidx ON phplist_user_blacklist_data (email, name)'); + $this->addSql('CREATE TABLE phplist_user_message_bounce (id INT NOT NULL, "user" INT NOT NULL, message INT NOT NULL, bounce INT NOT NULL, time TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_user_message_bounce_bounceidx ON phplist_user_message_bounce (bounce)'); + $this->addSql('CREATE INDEX phplist_user_message_bounce_msgidx ON phplist_user_message_bounce (message)'); + $this->addSql('CREATE INDEX phplist_user_message_bounce_umbindex ON phplist_user_message_bounce ("user", message, bounce)'); + $this->addSql('CREATE INDEX phplist_user_message_bounce_useridx ON phplist_user_message_bounce ("user")'); + $this->addSql('CREATE TABLE phplist_user_message_forward (id INT NOT NULL, "user" INT NOT NULL, message INT NOT NULL, forward VARCHAR(255) DEFAULT NULL, status VARCHAR(255) DEFAULT NULL, time TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT CURRENT_TIMESTAMP NOT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_user_message_forward_messageidx ON phplist_user_message_forward (message)'); + $this->addSql('CREATE INDEX phplist_user_message_forward_useridx ON phplist_user_message_forward ("user")'); + $this->addSql('CREATE INDEX phplist_user_message_forward_usermessageidx ON phplist_user_message_forward ("user", message)'); + $this->addSql('CREATE TABLE phplist_user_message_view (id INT NOT NULL, messageid INT NOT NULL, userid INT NOT NULL, viewed TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, ip VARCHAR(255) DEFAULT NULL, data TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_user_message_view_msgidx ON phplist_user_message_view (messageid)'); + $this->addSql('CREATE INDEX phplist_user_message_view_useridx ON phplist_user_message_view (userid)'); + $this->addSql('CREATE INDEX phplist_user_message_view_usermsgidx ON phplist_user_message_view (userid, messageid)'); + $this->addSql('CREATE TABLE phplist_user_user (id INT NOT NULL, entered TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, email VARCHAR(255) NOT NULL, confirmed BOOLEAN NOT NULL, blacklisted BOOLEAN NOT NULL, bouncecount INT NOT NULL, uniqid VARCHAR(255) DEFAULT NULL, htmlemail BOOLEAN NOT NULL, disabled BOOLEAN NOT NULL, extradata TEXT DEFAULT NULL, optedin BOOLEAN NOT NULL, uuid VARCHAR(36) NOT NULL, subscribepage INT DEFAULT NULL, rssfrequency VARCHAR(100) DEFAULT NULL, password VARCHAR(255) DEFAULT NULL, passwordchanged TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, foreignkey VARCHAR(100) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_user_user_idxuniqid ON phplist_user_user (uniqid)'); + $this->addSql('CREATE INDEX phplist_user_user_enteredindex ON phplist_user_user (entered)'); + $this->addSql('CREATE INDEX phplist_user_user_confidx ON phplist_user_user (confirmed)'); + $this->addSql('CREATE INDEX phplist_user_user_blidx ON phplist_user_user (blacklisted)'); + $this->addSql('CREATE INDEX phplist_user_user_optidx ON phplist_user_user (optedin)'); + $this->addSql('CREATE INDEX phplist_user_user_uuididx ON phplist_user_user (uuid)'); + $this->addSql('CREATE INDEX phplist_user_user_foreignkey ON phplist_user_user (foreignkey)'); + $this->addSql('CREATE UNIQUE INDEX phplist_user_user_email ON phplist_user_user (email)'); + $this->addSql('CREATE TABLE phplist_user_user_attribute (attributeid INT NOT NULL, userid INT NOT NULL, value TEXT DEFAULT NULL, PRIMARY KEY(attributeid, userid))'); + $this->addSql('CREATE INDEX phplist_user_user_attribute_attindex ON phplist_user_user_attribute (attributeid)'); + $this->addSql('CREATE INDEX phplist_user_user_attribute_attuserid ON phplist_user_user_attribute (userid, attributeid)'); + $this->addSql('CREATE INDEX phplist_user_user_attribute_userindex ON phplist_user_user_attribute (userid)'); + $this->addSql('CREATE TABLE phplist_user_user_history (id INT NOT NULL, userid INT NOT NULL, ip VARCHAR(255) DEFAULT NULL, date TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, summary VARCHAR(255) DEFAULT NULL, detail TEXT DEFAULT NULL, systeminfo TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_user_user_history_dateidx ON phplist_user_user_history (date)'); + $this->addSql('CREATE INDEX phplist_user_user_history_userididx ON phplist_user_user_history (userid)'); + $this->addSql('CREATE TABLE phplist_usermessage (userid INT NOT NULL, messageid INT NOT NULL, entered TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, viewed TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, status VARCHAR(255) DEFAULT NULL, PRIMARY KEY(userid, messageid))'); + $this->addSql('CREATE INDEX phplist_usermessage_enteredindex ON phplist_usermessage (entered)'); + $this->addSql('CREATE INDEX phplist_usermessage_messageidindex ON phplist_usermessage (messageid)'); + $this->addSql('CREATE INDEX phplist_usermessage_statusidx ON phplist_usermessage (status)'); + $this->addSql('CREATE INDEX phplist_usermessage_useridindex ON phplist_usermessage (userid)'); + $this->addSql('CREATE INDEX phplist_usermessage_viewedidx ON phplist_usermessage (viewed)'); + $this->addSql('CREATE TABLE phplist_userstats (id INT NOT NULL, unixdate INT DEFAULT NULL, item VARCHAR(255) DEFAULT NULL, listid INT DEFAULT 0, value INT DEFAULT 0, PRIMARY KEY(id))'); + $this->addSql('CREATE INDEX phplist_userstats_dateindex ON phplist_userstats (unixdate)'); + $this->addSql('CREATE INDEX phplist_userstats_itemindex ON phplist_userstats (item)'); + $this->addSql('CREATE INDEX phplist_userstats_listdateindex ON phplist_userstats (listid, unixdate)'); + $this->addSql('CREATE INDEX phplist_userstats_listindex ON phplist_userstats (listid)'); + $this->addSql('CREATE UNIQUE INDEX phplist_userstats_entry ON phplist_userstats (unixdate, item, listid)'); + $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690D3B10C48 FOREIGN KEY (adminattributeid) REFERENCES phplist_adminattribute (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_admin_login ADD CONSTRAINT FK_5FCE0842B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_admin_password_request ADD CONSTRAINT FK_DC146F3B880E0D76 FOREIGN KEY (admin) REFERENCES phplist_admin (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_admintoken ADD CONSTRAINT FK_CB15D477B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_list ADD CONSTRAINT FK_A4CE8621CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A31478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A8E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E411F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E4118E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCDCF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCD97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id) ON DELETE SET NULL NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_subscribepage ADD CONSTRAINT FK_5BAC7737CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_templateimage ADD CONSTRAINT FK_30A85BA97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data ADD CONSTRAINT FK_6D67150CE7927C74 FOREIGN KEY (email) REFERENCES phplist_user_blacklist (email) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E310878C45AB5 FOREIGN KEY (attributeid) REFERENCES phplist_user_attribute (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E3108F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_user_user_history ADD CONSTRAINT FK_6DBB605CF132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F469F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F46931478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + } + + public function down(Schema $schema): void + { + $platform = $this->connection->getDatabasePlatform(); + $this->skipIf( + !$platform instanceof PostgreSqlPlatform, + sprintf( + 'This migration is only applicable for MySQL. Current platform: %s', + get_class($platform) + ) + ); + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('CREATE SCHEMA public'); + $this->addSql('ALTER TABLE phplist_admin_attribute DROP CONSTRAINT FK_58E07690D3B10C48'); + $this->addSql('ALTER TABLE phplist_admin_attribute DROP CONSTRAINT FK_58E07690B8ED4D93'); + $this->addSql('ALTER TABLE phplist_admin_login DROP CONSTRAINT FK_5FCE0842B8ED4D93'); + $this->addSql('ALTER TABLE phplist_admin_password_request DROP CONSTRAINT FK_DC146F3B880E0D76'); + $this->addSql('ALTER TABLE phplist_admintoken DROP CONSTRAINT FK_CB15D477B8ED4D93'); + $this->addSql('ALTER TABLE phplist_list DROP CONSTRAINT FK_A4CE8621CF60E67C'); + $this->addSql('ALTER TABLE phplist_listmessage DROP CONSTRAINT FK_83B22D7A31478478'); + $this->addSql('ALTER TABLE phplist_listmessage DROP CONSTRAINT FK_83B22D7A8E44C1EF'); + $this->addSql('ALTER TABLE phplist_listuser DROP CONSTRAINT FK_F467E411F132696E'); + $this->addSql('ALTER TABLE phplist_listuser DROP CONSTRAINT FK_F467E4118E44C1EF'); + $this->addSql('ALTER TABLE phplist_message DROP CONSTRAINT FK_C5D81FCDCF60E67C'); + $this->addSql('ALTER TABLE phplist_message DROP CONSTRAINT FK_C5D81FCD97601F83'); + $this->addSql('ALTER TABLE phplist_subscribepage DROP CONSTRAINT FK_5BAC7737CF60E67C'); + $this->addSql('ALTER TABLE phplist_templateimage DROP CONSTRAINT FK_30A85BA97601F83'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data DROP CONSTRAINT FK_6D67150CE7927C74'); + $this->addSql('ALTER TABLE phplist_user_user_attribute DROP CONSTRAINT FK_E24E310878C45AB5'); + $this->addSql('ALTER TABLE phplist_user_user_attribute DROP CONSTRAINT FK_E24E3108F132696E'); + $this->addSql('ALTER TABLE phplist_user_user_history DROP CONSTRAINT FK_6DBB605CF132696E'); + $this->addSql('ALTER TABLE phplist_usermessage DROP CONSTRAINT FK_7F30F469F132696E'); + $this->addSql('ALTER TABLE phplist_usermessage DROP CONSTRAINT FK_7F30F46931478478'); + $this->addSql('DROP TABLE phplist_admin'); + $this->addSql('DROP TABLE phplist_admin_attribute'); + $this->addSql('DROP TABLE phplist_admin_login'); + $this->addSql('DROP TABLE phplist_admin_password_request'); + $this->addSql('DROP TABLE phplist_adminattribute'); + $this->addSql('DROP TABLE phplist_admintoken'); + $this->addSql('DROP TABLE phplist_attachment'); + $this->addSql('DROP TABLE phplist_bounce'); + $this->addSql('DROP TABLE phplist_bounceregex'); + $this->addSql('DROP TABLE phplist_bounceregex_bounce'); + $this->addSql('DROP TABLE phplist_config'); + $this->addSql('DROP TABLE phplist_eventlog'); + $this->addSql('DROP TABLE phplist_i18n'); + $this->addSql('DROP TABLE phplist_linktrack'); + $this->addSql('DROP TABLE phplist_linktrack_forward'); + $this->addSql('DROP TABLE phplist_linktrack_ml'); + $this->addSql('DROP TABLE phplist_linktrack_uml_click'); + $this->addSql('DROP TABLE phplist_linktrack_userclick'); + $this->addSql('DROP TABLE phplist_list'); + $this->addSql('DROP TABLE phplist_listmessage'); + $this->addSql('DROP TABLE phplist_listuser'); + $this->addSql('DROP TABLE phplist_message'); + $this->addSql('DROP TABLE phplist_message_attachment'); + $this->addSql('DROP TABLE phplist_messagedata'); + $this->addSql('DROP TABLE phplist_sendprocess'); + $this->addSql('DROP TABLE phplist_subscribepage'); + $this->addSql('DROP TABLE phplist_subscribepage_data'); + $this->addSql('DROP TABLE phplist_template'); + $this->addSql('DROP TABLE phplist_templateimage'); + $this->addSql('DROP TABLE phplist_urlcache'); + $this->addSql('DROP TABLE phplist_user_attribute'); + $this->addSql('DROP TABLE phplist_user_blacklist'); + $this->addSql('DROP TABLE phplist_user_blacklist_data'); + $this->addSql('DROP TABLE phplist_user_message_bounce'); + $this->addSql('DROP TABLE phplist_user_message_forward'); + $this->addSql('DROP TABLE phplist_user_message_view'); + $this->addSql('DROP TABLE phplist_user_user'); + $this->addSql('DROP TABLE phplist_user_user_attribute'); + $this->addSql('DROP TABLE phplist_user_user_history'); + $this->addSql('DROP TABLE phplist_usermessage'); + $this->addSql('DROP TABLE phplist_userstats'); + } +} From d8472dc2684ab55e2f3e69edc7d9fcad090a9b93 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Thu, 30 Oct 2025 12:38:09 +0400 Subject: [PATCH 13/22] MySqlSqlPlatform rename indexes --- ...901.php => Version20251028092901MySql.php} | 4 +- ...> Version20251029105320MySqlRelations.php} | 4 +- ...ersion20251030081120PostgreSqlPlatform.php | 2 +- .../Version20251030083621MySqlRenameIndex.php | 187 ++++++++++++++++++ 4 files changed, 192 insertions(+), 5 deletions(-) rename src/Migrations/{Version20251028092901.php => Version20251028092901MySql.php} (86%) rename src/Migrations/{Version20251029105320.php => Version20251029105320MySqlRelations.php} (99%) create mode 100644 src/Migrations/Version20251030083621MySqlRenameIndex.php diff --git a/src/Migrations/Version20251028092901.php b/src/Migrations/Version20251028092901MySql.php similarity index 86% rename from src/Migrations/Version20251028092901.php rename to src/Migrations/Version20251028092901MySql.php index 4ddedd92..2cc9bcd4 100644 --- a/src/Migrations/Version20251028092901.php +++ b/src/Migrations/Version20251028092901MySql.php @@ -11,11 +11,11 @@ /** * Manual Migration */ -final class Version20251028092901 extends AbstractMigration +final class Version20251028092901MySql extends AbstractMigration { public function getDescription(): string { - return ''; + return 'Initial schema from SQL file generated from phplist3'; } /** diff --git a/src/Migrations/Version20251029105320.php b/src/Migrations/Version20251029105320MySqlRelations.php similarity index 99% rename from src/Migrations/Version20251029105320.php rename to src/Migrations/Version20251029105320MySqlRelations.php index 37d1db72..2b540997 100644 --- a/src/Migrations/Version20251029105320.php +++ b/src/Migrations/Version20251029105320MySqlRelations.php @@ -11,11 +11,11 @@ /** * Auto-generated Migration: Please modify to your needs! */ -final class Version20251029105320 extends AbstractMigration +final class Version20251029105320MySqlRelations extends AbstractMigration { public function getDescription(): string { - return ''; + return 'Update according to symfony Entity mappings'; } public function up(Schema $schema): void diff --git a/src/Migrations/Version20251030081120PostgreSqlPlatform.php b/src/Migrations/Version20251030081120PostgreSqlPlatform.php index 443d7df7..f9544df2 100644 --- a/src/Migrations/Version20251030081120PostgreSqlPlatform.php +++ b/src/Migrations/Version20251030081120PostgreSqlPlatform.php @@ -15,7 +15,7 @@ final class Version20251030081120PostgreSqlPlatform extends AbstractMigration { public function getDescription(): string { - return ''; + return 'PostgreSql platform migration according to current Entity state'; } public function up(Schema $schema): void diff --git a/src/Migrations/Version20251030083621MySqlRenameIndex.php b/src/Migrations/Version20251030083621MySqlRenameIndex.php new file mode 100644 index 00000000..815fcc27 --- /dev/null +++ b/src/Migrations/Version20251030083621MySqlRenameIndex.php @@ -0,0 +1,187 @@ +addSql('ALTER TABLE phplist_admin RENAME INDEX loginnameidx TO phplist_admin_loginnameidx'); + $this->addSql('ALTER TABLE phplist_bounce RENAME INDEX dateindex TO phplist_bounce_dateindex'); + $this->addSql('ALTER TABLE phplist_bounce RENAME INDEX statusidx TO phplist_bounce_statusidx'); + $this->addSql('ALTER TABLE phplist_bounceregex RENAME INDEX regex TO phplist_bounceregex_regex'); + $this->addSql('ALTER TABLE phplist_eventlog RENAME INDEX enteredidx TO phplist_eventlog_enteredidx'); + $this->addSql('ALTER TABLE phplist_eventlog RENAME INDEX pageidx TO phplist_eventlog_pageidx'); + $this->addSql('ALTER TABLE phplist_i18n RENAME INDEX lanorigunq TO phplist_i18n_lanorigunq'); + $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX midindex TO phplist_linktrack_midindex'); + $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX miduidindex TO phplist_linktrack_miduidindex'); + $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX uidindex TO phplist_linktrack_uidindex'); + $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX urlindex TO phplist_linktrack_urlindex'); + $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX miduidurlindex TO phplist_linktrack_miduidurlindex'); + $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX urlindex TO phplist_linktrack_forward_urlindex'); + $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX uuididx TO phplist_linktrack_forward_uuididx'); + $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX urlunique TO phplist_linktrack_forward_urlunique'); + $this->addSql('ALTER TABLE phplist_linktrack_ml RENAME INDEX fwdindex TO phplist_linktrack_ml_fwdindex'); + $this->addSql('ALTER TABLE phplist_linktrack_ml RENAME INDEX midindex TO phplist_linktrack_ml_midindex'); + $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX midindex TO phplist_linktrack_uml_click_midindex'); + $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX miduidindex TO phplist_linktrack_uml_click_miduidindex'); + $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX uidindex TO phplist_linktrack_uml_click_uidindex'); + $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX miduidfwdid TO phplist_linktrack_uml_click_miduidfwdid'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX linkindex TO phplist_linktrack_userclick_linkindex'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX linkuserindex TO phplist_linktrack_userclick_linkuserindex'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX linkusermessageindex TO phplist_linktrack_userclick_linkusermessageindex'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX midindex TO phplist_linktrack_userclick_midindex'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX uidindex TO phplist_linktrack_userclick_uidindex'); + $this->addSql('ALTER TABLE phplist_list RENAME INDEX nameidx TO phplist_list_nameidx'); + $this->addSql('ALTER TABLE phplist_list RENAME INDEX listorderidx TO phplist_list_listorderidx'); + $this->addSql('ALTER TABLE phplist_listmessage RENAME INDEX listmessageidx TO phplist_listmessage_listmessageidx'); + $this->addSql('ALTER TABLE phplist_listmessage RENAME INDEX messageid TO phplist_listmessage_messageid'); + $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX userenteredidx TO phplist_listuser_userenteredidx'); + $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX userlistenteredidx TO phplist_listuser_userlistenteredidx'); + $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX useridx TO phplist_listuser_useridx'); + $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX listidx TO phplist_listuser_listidx'); + $this->addSql('ALTER TABLE phplist_message RENAME INDEX uuididx TO phplist_message_uuididx'); + $this->addSql('ALTER TABLE phplist_message_attachment RENAME INDEX messageattidx TO phplist_message_attachment_messageattidx'); + $this->addSql('ALTER TABLE phplist_message_attachment RENAME INDEX messageidx TO phplist_message_attachment_messageidx'); + $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_template RENAME INDEX title TO phplist_template_title'); + $this->addSql('ALTER TABLE phplist_templateimage RENAME INDEX templateidx TO phplist_templateimage_templateidx'); + $this->addSql('ALTER TABLE phplist_urlcache RENAME INDEX urlindex TO phplist_urlcache_urlindex'); + $this->addSql('ALTER TABLE phplist_user_attribute RENAME INDEX idnameindex TO phplist_user_attribute_idnameindex'); + $this->addSql('ALTER TABLE phplist_user_attribute RENAME INDEX nameindex TO phplist_user_attribute_nameindex'); + $this->addSql('ALTER TABLE phplist_user_blacklist RENAME INDEX emailidx TO phplist_user_blacklist_emailidx'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data RENAME INDEX emailidx TO phplist_user_blacklist_data_emailidx'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data RENAME INDEX emailnameidx TO phplist_user_blacklist_data_emailnameidx'); + $this->addSql('ALTER TABLE phplist_user_message_bounce RENAME INDEX bounceidx TO phplist_user_message_bounce_bounceidx'); + $this->addSql('ALTER TABLE phplist_user_message_bounce RENAME INDEX msgidx TO phplist_user_message_bounce_msgidx'); + $this->addSql('ALTER TABLE phplist_user_message_bounce RENAME INDEX umbindex TO phplist_user_message_bounce_umbindex'); + $this->addSql('ALTER TABLE phplist_user_message_bounce RENAME INDEX useridx TO phplist_user_message_bounce_useridx'); + $this->addSql('ALTER TABLE phplist_user_message_forward RENAME INDEX messageidx TO phplist_user_message_forward_messageidx'); + $this->addSql('ALTER TABLE phplist_user_message_forward RENAME INDEX useridx TO phplist_user_message_forward_useridx'); + $this->addSql('ALTER TABLE phplist_user_message_forward RENAME INDEX usermessageidx TO phplist_user_message_forward_usermessageidx'); + $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX msgidx TO phplist_user_message_view_msgidx'); + $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX useridx TO phplist_user_message_view_useridx'); + $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX usermsgidx TO phplist_user_message_view_usermsgidx'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX idxuniqid TO phplist_user_user_idxuniqid'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX enteredindex TO phplist_user_user_enteredindex'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX confidx TO phplist_user_user_confidx'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX blidx TO phplist_user_user_blidx'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX optidx TO phplist_user_user_optidx'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX uuididx TO phplist_user_user_uuididx'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX foreignkey TO phplist_user_user_foreignkey'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX email TO phplist_user_user_email'); + $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX attindex TO phplist_user_user_attribute_attindex'); + $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX attuserid TO phplist_user_user_attribute_attuserid'); + $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX userindex TO phplist_user_user_attribute_userindex'); + $this->addSql('ALTER TABLE phplist_user_user_history RENAME INDEX dateidx TO phplist_user_user_history_dateidx'); + $this->addSql('ALTER TABLE phplist_user_user_history RENAME INDEX userididx TO phplist_user_user_history_userididx'); + $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX enteredindex TO phplist_usermessage_enteredindex'); + $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX messageidindex TO phplist_usermessage_messageidindex'); + $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX statusidx TO phplist_usermessage_statusidx'); + $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX useridindex TO phplist_usermessage_useridindex'); + $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX viewedidx TO phplist_usermessage_viewedidx'); + $this->addSql('ALTER TABLE phplist_userstats RENAME INDEX dateindex TO phplist_userstats_dateindex'); + $this->addSql('ALTER TABLE phplist_userstats RENAME INDEX itemindex TO phplist_userstats_itemindex'); + $this->addSql('ALTER TABLE phplist_userstats RENAME INDEX listdateindex TO phplist_userstats_listdateindex'); + $this->addSql('ALTER TABLE phplist_userstats RENAME INDEX listindex TO phplist_userstats_listindex'); + $this->addSql('ALTER TABLE phplist_userstats RENAME INDEX entry TO phplist_userstats_entry'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE phplist_admin RENAME INDEX phplist_admin_loginnameidx TO loginnameidx'); + $this->addSql('ALTER TABLE phplist_bounce RENAME INDEX phplist_bounce_dateindex TO dateindex'); + $this->addSql('ALTER TABLE phplist_bounce RENAME INDEX phplist_bounce_statusidx TO statusidx'); + $this->addSql('ALTER TABLE phplist_bounceregex RENAME INDEX phplist_bounceregex_regex TO regex'); + $this->addSql('ALTER TABLE phplist_eventlog RENAME INDEX phplist_eventlog_enteredidx TO enteredidx'); + $this->addSql('ALTER TABLE phplist_eventlog RENAME INDEX phplist_eventlog_pageidx TO pageidx'); + $this->addSql('ALTER TABLE phplist_i18n RENAME INDEX phplist_i18n_lanorigunq TO lanorigunq'); + $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX phplist_linktrack_miduidurlindex TO miduidurlindex'); + $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX phplist_linktrack_midindex TO midindex'); + $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX phplist_linktrack_uidindex TO uidindex'); + $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX phplist_linktrack_urlindex TO urlindex'); + $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX phplist_linktrack_miduidindex TO miduidindex'); + $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX phplist_linktrack_forward_urlunique TO urlunique'); + $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX phplist_linktrack_forward_uuididx TO uuididx'); + $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX phplist_linktrack_forward_urlindex TO urlindex'); + $this->addSql('ALTER TABLE phplist_linktrack_ml RENAME INDEX phplist_linktrack_ml_midindex TO midindex'); + $this->addSql('ALTER TABLE phplist_linktrack_ml RENAME INDEX phplist_linktrack_ml_fwdindex TO fwdindex'); + $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX phplist_linktrack_uml_click_miduidfwdid TO miduidfwdid'); + $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX phplist_linktrack_uml_click_midindex TO midindex'); + $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX phplist_linktrack_uml_click_uidindex TO uidindex'); + $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX phplist_linktrack_uml_click_miduidindex TO miduidindex'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX phplist_linktrack_userclick_linkindex TO linkindex'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX phplist_linktrack_userclick_uidindex TO uidindex'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX phplist_linktrack_userclick_midindex TO midindex'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX phplist_linktrack_userclick_linkuserindex TO linkuserindex'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX phplist_linktrack_userclick_linkusermessageindex TO linkusermessageindex'); + $this->addSql('ALTER TABLE phplist_list RENAME INDEX phplist_list_nameidx TO nameidx'); + $this->addSql('ALTER TABLE phplist_list RENAME INDEX phplist_list_listorderidx TO listorderidx'); + $this->addSql('ALTER TABLE phplist_listmessage RENAME INDEX phplist_listmessage_messageid TO messageid'); + $this->addSql('ALTER TABLE phplist_listmessage RENAME INDEX phplist_listmessage_listmessageidx TO listmessageidx'); + $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX phplist_listuser_userenteredidx TO userenteredidx'); + $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX phplist_listuser_useridx TO useridx'); + $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX phplist_listuser_listidx TO listidx'); + $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX phplist_listuser_userlistenteredidx TO userlistenteredidx'); + $this->addSql('ALTER TABLE phplist_message RENAME INDEX phplist_message_uuididx TO uuididx'); + $this->addSql('ALTER TABLE phplist_message_attachment RENAME INDEX phplist_message_attachment_messageidx TO messageidx'); + $this->addSql('ALTER TABLE phplist_message_attachment RENAME INDEX phplist_message_attachment_messageattidx TO messageattidx'); + $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`'); + $this->addSql('ALTER TABLE phplist_template RENAME INDEX phplist_template_title TO title'); + $this->addSql('ALTER TABLE phplist_templateimage RENAME INDEX phplist_templateimage_templateidx TO templateidx'); + $this->addSql('ALTER TABLE phplist_urlcache RENAME INDEX phplist_urlcache_urlindex TO urlindex'); + $this->addSql('ALTER TABLE phplist_user_attribute RENAME INDEX phplist_user_attribute_nameindex TO nameindex'); + $this->addSql('ALTER TABLE phplist_user_attribute RENAME INDEX phplist_user_attribute_idnameindex TO idnameindex'); + $this->addSql('ALTER TABLE phplist_user_blacklist RENAME INDEX phplist_user_blacklist_emailidx TO emailidx'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data RENAME INDEX phplist_user_blacklist_data_emailidx TO emailidx'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data RENAME INDEX phplist_user_blacklist_data_emailnameidx TO emailnameidx'); + $this->addSql('ALTER TABLE phplist_user_message_bounce RENAME INDEX phplist_user_message_bounce_umbindex TO umbindex'); + $this->addSql('ALTER TABLE phplist_user_message_bounce RENAME INDEX phplist_user_message_bounce_useridx TO useridx'); + $this->addSql('ALTER TABLE phplist_user_message_bounce RENAME INDEX phplist_user_message_bounce_msgidx TO msgidx'); + $this->addSql('ALTER TABLE phplist_user_message_bounce RENAME INDEX phplist_user_message_bounce_bounceidx TO bounceidx'); + $this->addSql('ALTER TABLE phplist_user_message_forward RENAME INDEX phplist_user_message_forward_usermessageidx TO usermessageidx'); + $this->addSql('ALTER TABLE phplist_user_message_forward RENAME INDEX phplist_user_message_forward_useridx TO useridx'); + $this->addSql('ALTER TABLE phplist_user_message_forward RENAME INDEX phplist_user_message_forward_messageidx TO messageidx'); + $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX phplist_user_message_view_usermsgidx TO usermsgidx'); + $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX phplist_user_message_view_msgidx TO msgidx'); + $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX phplist_user_message_view_useridx TO useridx'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_email TO email'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_foreignkey TO foreignkey'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_idxuniqid TO idxuniqid'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_enteredindex TO enteredindex'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_confidx TO confidx'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_blidx TO blidx'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_optidx TO optidx'); + $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_uuididx TO uuididx'); + $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX phplist_user_user_attribute_userindex TO userindex'); + $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX phplist_user_user_attribute_attindex TO attindex'); + $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX phplist_user_user_attribute_attuserid TO attuserid'); + $this->addSql('ALTER TABLE phplist_user_user_history RENAME INDEX phplist_user_user_history_userididx TO userididx'); + $this->addSql('ALTER TABLE phplist_user_user_history RENAME INDEX phplist_user_user_history_dateidx TO dateidx'); + $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX phplist_usermessage_messageidindex TO messageidindex'); + $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX phplist_usermessage_useridindex TO useridindex'); + $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX phplist_usermessage_enteredindex TO enteredindex'); + $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX phplist_usermessage_statusidx TO statusidx'); + $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX phplist_usermessage_viewedidx TO viewedidx'); + $this->addSql('ALTER TABLE phplist_userstats RENAME INDEX phplist_userstats_entry TO entry'); + $this->addSql('ALTER TABLE phplist_userstats RENAME INDEX phplist_userstats_dateindex TO dateindex'); + $this->addSql('ALTER TABLE phplist_userstats RENAME INDEX phplist_userstats_itemindex TO itemindex'); + $this->addSql('ALTER TABLE phplist_userstats RENAME INDEX phplist_userstats_listindex TO listindex'); + $this->addSql('ALTER TABLE phplist_userstats RENAME INDEX phplist_userstats_listdateindex TO listdateindex'); + } +} From 0868ccda1c789bd180e4d341221266cbe886899c Mon Sep 17 00:00:00 2001 From: Tatevik Date: Thu, 30 Oct 2025 12:51:29 +0400 Subject: [PATCH 14/22] Fix: cs --- .github/workflows/ci.yml | 2 +- config/PHPMD/rules.xml | 3 ++- src/Core/Doctrine/OnlyOrmTablesFilter.php | 19 +++++++++++-------- .../Command/CleanUpOldSessionTokens.php | 3 --- .../Messaging/Command/ProcessQueueCommand.php | 3 --- src/Migrations/Version20251028092901MySql.php | 4 ---- src/Routing/ExtraLoader.php | 4 ---- 7 files changed, 14 insertions(+), 24 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 43dea8d7..8e0d5fbe 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -75,4 +75,4 @@ jobs: - name: Running PHPMD run: vendor/bin/phpmd src/ text config/PHPMD/rules.xml; - name: Running PHP_CodeSniffer - run: vendor/bin/phpcs --standard=config/PhpCodeSniffer/ bin/ src/ tests/ public/; + run: vendor/bin/phpcs --standard=config/PhpCodeSniffer/ --ignore=*/Migrations/* bin/ src/ tests/ public/; diff --git a/config/PHPMD/rules.xml b/config/PHPMD/rules.xml index 081ed9f3..b8b0c3df 100644 --- a/config/PHPMD/rules.xml +++ b/config/PHPMD/rules.xml @@ -4,6 +4,8 @@ PHPMD rules for phpList + */Migrations/* + @@ -71,5 +73,4 @@ - diff --git a/src/Core/Doctrine/OnlyOrmTablesFilter.php b/src/Core/Doctrine/OnlyOrmTablesFilter.php index 49327710..69097fcd 100644 --- a/src/Core/Doctrine/OnlyOrmTablesFilter.php +++ b/src/Core/Doctrine/OnlyOrmTablesFilter.php @@ -16,13 +16,15 @@ class OnlyOrmTablesFilter /** @var string[]|null */ private ?array $allowPrefixes = null; - public function __construct(private readonly EntityManagerInterface $entityManager) {} + public function __construct(private readonly EntityManagerInterface $entityManager) + { + } public function __invoke(string|AbstractAsset $asset): bool { $name = \is_string($asset) ? $asset : $asset->getName(); - - if (false !== ($pos = strrpos($name, '.'))) { + $pos = strrpos($name, '.'); + if (false !== $pos) { $name = substr($name, $pos + 1); } $nameLower = strtolower($name); @@ -56,12 +58,13 @@ private function buildAllowOnce(): array } $tables = []; - foreach ($this->entityManager->getMetadataFactory()->getAllMetadata() as $m) { - if ($t = $m->getTableName()) { - $tables[] = strtolower($t); + foreach ($this->entityManager->getMetadataFactory()->getAllMetadata() as $metadatum) { + $tableName = $metadatum->getTableName(); + if ($tableName) { + $tables[] = strtolower($tableName); } // many-to-many join tables - foreach ($m->getAssociationMappings() as $assoc) { + foreach ($metadatum->getAssociationMappings() as $assoc) { if (!empty($assoc['joinTable']['name'])) { $tables[] = strtolower($assoc['joinTable']['name']); } @@ -71,7 +74,7 @@ private function buildAllowOnce(): array $tables[] = 'doctrine_migration_versions'; $tables = array_values(array_unique($tables)); - $prefixes = array_map(static fn($t) => $t . '_', $tables); + $prefixes = array_map(static fn($table) => $table . '_', $tables); $this->allow = $tables; $this->allowPrefixes = $prefixes; diff --git a/src/Domain/Identity/Command/CleanUpOldSessionTokens.php b/src/Domain/Identity/Command/CleanUpOldSessionTokens.php index 820db648..981a5210 100644 --- a/src/Domain/Identity/Command/CleanUpOldSessionTokens.php +++ b/src/Domain/Identity/Command/CleanUpOldSessionTokens.php @@ -28,9 +28,6 @@ public function __construct(AdministratorTokenRepository $tokenRepository, Entit $this->entityManager = $entityManager; } - /** - * @SuppressWarnings("PHPMD.UnusedFormalParameter") - */ protected function execute(InputInterface $input, OutputInterface $output): int { try { diff --git a/src/Domain/Messaging/Command/ProcessQueueCommand.php b/src/Domain/Messaging/Command/ProcessQueueCommand.php index 600246cb..ec2d1af8 100644 --- a/src/Domain/Messaging/Command/ProcessQueueCommand.php +++ b/src/Domain/Messaging/Command/ProcessQueueCommand.php @@ -57,9 +57,6 @@ public function __construct( $this->entityManager = $entityManager; } - /** - * @SuppressWarnings("PHPMD.UnusedFormalParameter") - */ protected function execute(InputInterface $input, OutputInterface $output): int { $lock = $this->lockFactory->createLock('queue_processor'); diff --git a/src/Migrations/Version20251028092901MySql.php b/src/Migrations/Version20251028092901MySql.php index 2cc9bcd4..056c60ae 100644 --- a/src/Migrations/Version20251028092901MySql.php +++ b/src/Migrations/Version20251028092901MySql.php @@ -18,10 +18,6 @@ public function getDescription(): string return 'Initial schema from SQL file generated from phplist3'; } - /** - * @SuppressWarnings(PHPMD.ShortMethodName) - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - */ public function up(Schema $schema): void { $platform = $this->connection->getDatabasePlatform(); diff --git a/src/Routing/ExtraLoader.php b/src/Routing/ExtraLoader.php index 39853031..d5f40ec1 100644 --- a/src/Routing/ExtraLoader.php +++ b/src/Routing/ExtraLoader.php @@ -43,8 +43,6 @@ public function __construct(ApplicationStructure $applicationStructure) /** * Loads a resource. * - * @SuppressWarnings("PHPMD.UnusedFormalParameter") - * * @param mixed $resource the resource (unused) * @param string|null $type the resource type or null if unknown (unused) * @@ -69,8 +67,6 @@ public function load($resource, string $type = null): RouteCollection /** * Checks whether this class supports the given resource. * - * @SuppressWarnings("PHPMD.UnusedFormalParameter") - * * @param mixed $resource a resource (unused) * @param string|null $type The resource type or null if unknown * From e00142d0ca871fb89d7a449c0506cdc55c5abae0 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Thu, 30 Oct 2025 13:09:59 +0400 Subject: [PATCH 15/22] Fix: test configs --- config/config_test.yml | 14 +++++++------- .../Version20251030081120PostgreSqlPlatform.php | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/config/config_test.yml b/config/config_test.yml index 66d2ddea..36ce489c 100644 --- a/config/config_test.yml +++ b/config/config_test.yml @@ -13,11 +13,11 @@ doctrine: dbal: # driver: 'pdo_sqlite' # memory: true - driver: 'pdo_mysql' - host: '%database_host%' - port: '%database_port%' - dbname: 'phplist' - user: '%database_user%' - password: '%database_password%' - charset: UTF8 + driver: 'pdo_mysql' + host: '%database_host%' + port: '%database_port%' + dbname: 'phplist' + user: '%database_user%' + password: '%database_password%' + charset: UTF8 diff --git a/src/Migrations/Version20251030081120PostgreSqlPlatform.php b/src/Migrations/Version20251030081120PostgreSqlPlatform.php index f9544df2..ee31039e 100644 --- a/src/Migrations/Version20251030081120PostgreSqlPlatform.php +++ b/src/Migrations/Version20251030081120PostgreSqlPlatform.php @@ -24,7 +24,7 @@ public function up(Schema $schema): void $this->skipIf( !$platform instanceof PostgreSqlPlatform, sprintf( - 'This migration is only applicable for MySQL. Current platform: %s', + 'This migration is only applicable for PostgreSql. Current platform: %s', get_class($platform) ) ); @@ -187,7 +187,7 @@ public function down(Schema $schema): void $this->skipIf( !$platform instanceof PostgreSqlPlatform, sprintf( - 'This migration is only applicable for MySQL. Current platform: %s', + 'This migration is only applicable for PostgreSql. Current platform: %s', get_class($platform) ) ); From f7ec29de6be35adcf905e9eca255a77ff9725725 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Thu, 30 Oct 2025 14:14:10 +0400 Subject: [PATCH 16/22] Add migration template --- config/doctrine_migrations.yml | 1 + src/Migrations/_template_migration.php | 40 ++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/Migrations/_template_migration.php diff --git a/config/doctrine_migrations.yml b/config/doctrine_migrations.yml index cd7f9e12..aa423abe 100644 --- a/config/doctrine_migrations.yml +++ b/config/doctrine_migrations.yml @@ -4,6 +4,7 @@ doctrine_migrations: # 'TatevikGr\RssBundle\RssFeedBundle\Migrations': '%kernel.project_dir%/vendor/tatevikgr/rss-bundle/src/RssFeedBundle/Migrations' all_or_nothing: true organize_migrations: false + custom_template: '%kernel.project_dir%/src/Migrations/_template_migration.php' storage: table_storage: table_name: 'doctrine_migration_versions' diff --git a/src/Migrations/_template_migration.php b/src/Migrations/_template_migration.php new file mode 100644 index 00000000..efd94272 --- /dev/null +++ b/src/Migrations/_template_migration.php @@ -0,0 +1,40 @@ +; + +use Doctrine\DBAL\Platforms\PostgreSQLPlatform; +use Doctrine\DBAL\Platforms\MySQLPlatform; +use Doctrine\Migrations\AbstractMigration; +use Doctrine\DBAL\Schema\Schema; + +final class extends AbstractMigration +{ + public function getDescription(): string + { + return ''; + } + + public function up(Schema $schema): void + { + $platform = $this->connection->getDatabasePlatform(); + $this->skipIf(!$platform instanceof , sprintf( + 'Unsupported platform for this migration: %s', + get_class($platform) + )); + + + } + + public function down(Schema $schema): void + { + $platform = $this->connection->getDatabasePlatform(); + $this->skipIf(!$platform instanceof , sprintf( + 'Unsupported platform for this migration: %s', + get_class($platform) + )); + + + } +} From cdc34172a7bcf97880d22a16148a418f24c9e5e3 Mon Sep 17 00:00:00 2001 From: TatevikGr Date: Fri, 31 Oct 2025 09:02:27 +0400 Subject: [PATCH 17/22] PR agent (#365) * .coderabbit.yaml This reverts commit 2246e490b4fb1385d09a855ac608fc0cd989a2c1. --------- Co-authored-by: Tatevik --- .coderabbit.yaml | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 .coderabbit.yaml diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 00000000..3cc5119b --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,9 @@ +language: "en-US" +reviews: + profile: "chill" + high_level_summary: true + auto_review: + enabled: true + base_branches: + - ".*" + drafts: false From 6381d1c4fdda9815a78cd432cbdca23419fdefdb Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 31 Oct 2025 09:08:43 +0400 Subject: [PATCH 18/22] rename template --- config/doctrine_migrations.yml | 2 +- .../{_template_migration.php => _template_migration.php.tpl} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename src/Migrations/{_template_migration.php => _template_migration.php.tpl} (100%) diff --git a/config/doctrine_migrations.yml b/config/doctrine_migrations.yml index aa423abe..97e3bd6f 100644 --- a/config/doctrine_migrations.yml +++ b/config/doctrine_migrations.yml @@ -4,7 +4,7 @@ doctrine_migrations: # 'TatevikGr\RssBundle\RssFeedBundle\Migrations': '%kernel.project_dir%/vendor/tatevikgr/rss-bundle/src/RssFeedBundle/Migrations' all_or_nothing: true organize_migrations: false - custom_template: '%kernel.project_dir%/src/Migrations/_template_migration.php' + custom_template: '%kernel.project_dir%/src/Migrations/_template_migration.php.tpl' storage: table_storage: table_name: 'doctrine_migration_versions' diff --git a/src/Migrations/_template_migration.php b/src/Migrations/_template_migration.php.tpl similarity index 100% rename from src/Migrations/_template_migration.php rename to src/Migrations/_template_migration.php.tpl From 76d19a26a10141e936618b6d2c9dc7baeafd0d0a Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 31 Oct 2025 09:57:40 +0400 Subject: [PATCH 19/22] After review 0 --- resources/Database/Schema.sql | 898 ++++++++++++------ src/Domain/Identity/Model/Administrator.php | 6 +- src/Domain/Messaging/Model/Bounce.php | 2 +- .../Messaging/Model/Message/MessageFormat.php | 10 +- ...ersion20251030081120PostgreSqlPlatform.php | 1 - .../Version20251030083621MySqlRenameIndex.php | 19 + src/Migrations/initial_schema.sql | 45 - .../Identity/Model/AdministratorTokenTest.php | 2 +- 8 files changed, 651 insertions(+), 332 deletions(-) diff --git a/resources/Database/Schema.sql b/resources/Database/Schema.sql index d14d73b3..c22ff92b 100644 --- a/resources/Database/Schema.sql +++ b/resources/Database/Schema.sql @@ -1,207 +1,358 @@ +-- MySQL dump 10.13 Distrib 8.0.43, for Linux (x86_64) +-- +-- Host: localhost Database: phplistdb +-- ------------------------------------------------------ +-- Server version 8.0.43-0ubuntu0.20.04.1+esm1 + +/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; +/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; +/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; +/*!50503 SET NAMES utf8mb4 */; +/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */; +/*!40103 SET TIME_ZONE='+00:00' */; +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; + +-- +-- Table structure for table `phplist_admin` +-- + DROP TABLE IF EXISTS `phplist_admin`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_admin` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `loginname` varchar(25) NOT NULL, - `namelc` varchar(255) DEFAULT NULL, - `email` varchar(255) NOT NULL, - `created` datetime DEFAULT NULL, - `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `modifiedby` varchar(25) DEFAULT NULL, - `password` varchar(255) DEFAULT NULL, - `passwordchanged` date DEFAULT NULL, - `superuser` tinyint(4) DEFAULT '0', - `disabled` tinyint(4) DEFAULT '0', - `privileges` text, - PRIMARY KEY (`id`), - UNIQUE KEY `loginnameidx` (`loginname`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + `id` int NOT NULL AUTO_INCREMENT, + `loginname` varchar(66) NOT NULL, + `namelc` varchar(255) DEFAULT NULL, + `email` varchar(255) NOT NULL, + `created` datetime DEFAULT NULL, + `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + `modifiedby` varchar(66) DEFAULT NULL, + `password` varchar(255) DEFAULT NULL, + `passwordchanged` date DEFAULT NULL, + `superuser` tinyint DEFAULT '0', + `disabled` tinyint DEFAULT '0', + `privileges` text, + PRIMARY KEY (`id`), + UNIQUE KEY `loginnameidx` (`loginname`) +) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_admin_attribute` +-- DROP TABLE IF EXISTS `phplist_admin_attribute`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_admin_attribute` ( - `adminattributeid` int(11) NOT NULL, - `adminid` int(11) NOT NULL, - `value` varchar(255) DEFAULT NULL, - PRIMARY KEY (`adminattributeid`,`adminid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `adminattributeid` int NOT NULL, + `adminid` int NOT NULL, + `value` varchar(255) DEFAULT NULL, + PRIMARY KEY (`adminattributeid`,`adminid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_admin_login` +-- + +DROP TABLE IF EXISTS `phplist_admin_login`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_admin_login` ( + `id` int NOT NULL AUTO_INCREMENT, + `moment` bigint NOT NULL, + `adminid` int NOT NULL, + `remote_ip4` varchar(32) NOT NULL, + `remote_ip6` varchar(50) NOT NULL, + `sessionid` varchar(50) NOT NULL, + `active` tinyint NOT NULL DEFAULT '0', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=414 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_admin_password_request` +-- DROP TABLE IF EXISTS `phplist_admin_password_request`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_admin_password_request` ( - `id_key` int(11) NOT NULL AUTO_INCREMENT, - `date` datetime DEFAULT NULL, - `admin` int(11) DEFAULT NULL, - `key_value` varchar(32) NOT NULL, - PRIMARY KEY (`id_key`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `id_key` int NOT NULL AUTO_INCREMENT, + `date` datetime DEFAULT NULL, + `admin` int DEFAULT NULL, + `key_value` varchar(32) NOT NULL, + PRIMARY KEY (`id_key`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_adminattribute` +-- DROP TABLE IF EXISTS `phplist_adminattribute`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_adminattribute` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `name` varchar(255) NOT NULL, - `type` varchar(30) DEFAULT NULL, - `listorder` int(11) DEFAULT NULL, - `default_value` varchar(255) DEFAULT NULL, - `required` tinyint(4) DEFAULT NULL, - `tablename` varchar(255) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) NOT NULL, + `type` varchar(30) DEFAULT NULL, + `listorder` int DEFAULT NULL, + `default_value` varchar(255) DEFAULT NULL, + `required` tinyint DEFAULT NULL, + `tablename` varchar(255) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_admintoken` +-- DROP TABLE IF EXISTS `phplist_admintoken`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_admintoken` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `adminid` int(11) NOT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `adminid` int NOT NULL, `value` varchar(255) DEFAULT NULL, - `entered` int(11) NOT NULL, + `entered` int NOT NULL, `expires` datetime NOT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=51 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=3670 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_attachment` +-- DROP TABLE IF EXISTS `phplist_attachment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_attachment` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `filename` varchar(255) DEFAULT NULL, `remotefile` varchar(255) DEFAULT NULL, `mimetype` varchar(255) DEFAULT NULL, `description` text, - `size` int(11) DEFAULT NULL, + `size` int DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_bounce` +-- DROP TABLE IF EXISTS `phplist_bounce`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_bounce` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `date` datetime DEFAULT NULL, `header` text, `data` mediumblob, `status` varchar(255) DEFAULT NULL, `comment` text, PRIMARY KEY (`id`), - KEY `dateindex` (`date`) -) ENGINE=InnoDB AUTO_INCREMENT=2168 DEFAULT CHARSET=utf8; - -DROP TABLE IF EXISTS phplist_bounceregex; -CREATE TABLE phplist_bounceregex ( - id int(11) NOT NULL AUTO_INCREMENT, - regex varchar(2083) DEFAULT NULL, - regexhash char(32) DEFAULT NULL, - action varchar(255) DEFAULT NULL, - listorder int(11) DEFAULT '0', - admin int(11) DEFAULT NULL, - comment text, - status varchar(255) DEFAULT NULL, - count int(11) DEFAULT '0', - PRIMARY KEY (id), - UNIQUE KEY regex (regexhash) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + KEY `dateindex` (`date`), + KEY `statusidx` (`status`(20)) +) ENGINE=InnoDB AUTO_INCREMENT=37 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_bounceregex` +-- + +DROP TABLE IF EXISTS `phplist_bounceregex`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_bounceregex` ( + `id` int NOT NULL AUTO_INCREMENT, + `regex` varchar(2083) DEFAULT NULL, + `regexhash` char(32) DEFAULT NULL, + `action` varchar(255) DEFAULT NULL, + `listorder` int DEFAULT '0', + `admin` int DEFAULT NULL, + `comment` text, + `status` varchar(255) DEFAULT NULL, + `count` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `regex` (`regexhash`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_bounceregex_bounce` +-- DROP TABLE IF EXISTS `phplist_bounceregex_bounce`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_bounceregex_bounce` ( - `regex` int(11) NOT NULL, - `bounce` int(11) NOT NULL, + `regex` int NOT NULL, + `bounce` int NOT NULL, PRIMARY KEY (`regex`,`bounce`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_config` +-- DROP TABLE IF EXISTS `phplist_config`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_config` ( `item` varchar(35) NOT NULL, `value` longtext, - `editable` tinyint(4) DEFAULT '1', + `editable` tinyint DEFAULT '1', `type` varchar(25) DEFAULT NULL, PRIMARY KEY (`item`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_eventlog` +-- DROP TABLE IF EXISTS `phplist_eventlog`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_eventlog` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `entered` datetime DEFAULT NULL, `page` varchar(100) DEFAULT NULL, `entry` text, PRIMARY KEY (`id`), KEY `enteredidx` (`entered`), KEY `pageidx` (`page`) -) ENGINE=InnoDB AUTO_INCREMENT=204119 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=343 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_i18n` +-- DROP TABLE IF EXISTS `phplist_i18n`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_i18n` ( - `lan` varchar(255) NOT NULL, + `lan` varchar(10) NOT NULL, `original` text NOT NULL, `translation` text NOT NULL, - KEY `lanorigidx` (`lan`(50),`original`(200)) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; + UNIQUE KEY `lanorigunq` (`lan`,`original`(200)), + KEY `lanorigidx` (`lan`,`original`(200)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `phplist_language`; -CREATE TABLE `phplist_language` ( - `iso` varchar(10) DEFAULT NULL, - `name` varchar(255) DEFAULT NULL, - `charset` varchar(100) DEFAULT NULL -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- +-- Table structure for table `phplist_linktrack` +-- DROP TABLE IF EXISTS `phplist_linktrack`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_linktrack` ( - `linkid` int(11) NOT NULL AUTO_INCREMENT, - `messageid` int(11) NOT NULL, - `userid` int(11) NOT NULL, + `linkid` int NOT NULL AUTO_INCREMENT, + `messageid` int NOT NULL, + `userid` int NOT NULL, `url` varchar(255) DEFAULT NULL, - `forward` text, + `forward` varchar(255) DEFAULT NULL, `firstclick` datetime DEFAULT NULL, - `latestclick` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `clicked` int(11) DEFAULT '0', + `latestclick` timestamp NULL DEFAULT NULL, + `clicked` int DEFAULT '0', PRIMARY KEY (`linkid`), UNIQUE KEY `miduidurlindex` (`messageid`,`userid`,`url`), KEY `midindex` (`messageid`), KEY `uidindex` (`userid`), KEY `urlindex` (`url`), KEY `miduidindex` (`messageid`,`userid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -DROP TABLE IF EXISTS phplist_linktrack_forward; -CREATE TABLE phplist_linktrack_forward ( - id int(11) NOT NULL AUTO_INCREMENT, - url varchar(2083) DEFAULT NULL, - urlhash char(32) DEFAULT NULL, - personalise tinyint(4) DEFAULT '0', - PRIMARY KEY (id), - UNIQUE KEY urlunique (urlhash), - KEY urlindex (url(255)) -) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_linktrack_forward` +-- + +DROP TABLE IF EXISTS `phplist_linktrack_forward`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_linktrack_forward` ( + `id` int NOT NULL AUTO_INCREMENT, + `url` varchar(2083) DEFAULT NULL, + `urlhash` char(32) DEFAULT NULL, + `uuid` varchar(36) DEFAULT '', + `personalise` tinyint DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `urlunique` (`urlhash`), + KEY `urlindex` (`url`(255)), + KEY `uuididx` (`uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_linktrack_ml` +-- DROP TABLE IF EXISTS `phplist_linktrack_ml`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_linktrack_ml` ( - `messageid` int(11) NOT NULL, - `forwardid` int(11) NOT NULL, + `messageid` int NOT NULL, + `forwardid` int NOT NULL, `firstclick` datetime DEFAULT NULL, `latestclick` datetime DEFAULT NULL, - `total` int(11) DEFAULT '0', - `clicked` int(11) DEFAULT '0', - `htmlclicked` int(11) DEFAULT '0', - `textclicked` int(11) DEFAULT '0', + `total` int DEFAULT '0', + `clicked` int DEFAULT '0', + `htmlclicked` int DEFAULT '0', + `textclicked` int DEFAULT '0', PRIMARY KEY (`messageid`,`forwardid`), KEY `midindex` (`messageid`), KEY `fwdindex` (`forwardid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_linktrack_uml_click` +-- DROP TABLE IF EXISTS `phplist_linktrack_uml_click`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_linktrack_uml_click` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `messageid` int(11) NOT NULL, - `userid` int(11) NOT NULL, - `forwardid` int(11) DEFAULT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `messageid` int NOT NULL, + `userid` int NOT NULL, + `forwardid` int DEFAULT NULL, `firstclick` datetime DEFAULT NULL, `latestclick` datetime DEFAULT NULL, - `clicked` int(11) DEFAULT '0', - `htmlclicked` int(11) DEFAULT '0', - `textclicked` int(11) DEFAULT '0', + `clicked` int DEFAULT '0', + `htmlclicked` int DEFAULT '0', + `textclicked` int DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `miduidfwdid` (`messageid`,`userid`,`forwardid`), KEY `midindex` (`messageid`), KEY `uidindex` (`userid`), KEY `miduidindex` (`messageid`,`userid`) -) ENGINE=InnoDB AUTO_INCREMENT=58434 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_linktrack_userclick` +-- DROP TABLE IF EXISTS `phplist_linktrack_userclick`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_linktrack_userclick` ( - `linkid` int(11) NOT NULL, - `userid` int(11) NOT NULL, - `messageid` int(11) NOT NULL, + `linkid` int NOT NULL, + `userid` int NOT NULL, + `messageid` int NOT NULL, `name` varchar(255) DEFAULT NULL, `data` text, `date` datetime DEFAULT NULL, @@ -210,52 +361,127 @@ CREATE TABLE `phplist_linktrack_userclick` ( KEY `midindex` (`messageid`), KEY `linkuserindex` (`linkid`,`userid`), KEY `linkusermessageindex` (`linkid`,`userid`,`messageid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_list` +-- DROP TABLE IF EXISTS `phplist_list`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_list` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `description` text, `entered` datetime DEFAULT NULL, - `listorder` int(11) DEFAULT NULL, + `listorder` int DEFAULT NULL, `prefix` varchar(10) DEFAULT NULL, `rssfeed` varchar(255) DEFAULT NULL, `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `active` tinyint(4) DEFAULT NULL, - `owner` int(11) DEFAULT NULL, + `active` tinyint DEFAULT NULL, + `owner` int DEFAULT NULL, `category` varchar(255) DEFAULT '', PRIMARY KEY (`id`), KEY `nameidx` (`name`), KEY `listorderidx` (`listorder`) -) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_listattr_becities` +-- + +DROP TABLE IF EXISTS `phplist_listattr_becities`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_listattr_becities` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `listorder` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`(150)) +) ENGINE=InnoDB AUTO_INCREMENT=2680 DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_listattr_termsofservice` +-- + +DROP TABLE IF EXISTS `phplist_listattr_termsofservice`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_listattr_termsofservice` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `listorder` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`(150)) +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_listattr_ukcounties` +-- + +DROP TABLE IF EXISTS `phplist_listattr_ukcounties`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_listattr_ukcounties` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `listorder` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`(150)) +) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_listattr_ukcounties1` +-- + +DROP TABLE IF EXISTS `phplist_listattr_ukcounties1`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_listattr_ukcounties1` ( + `id` int NOT NULL AUTO_INCREMENT, + `name` varchar(255) DEFAULT NULL, + `listorder` int DEFAULT '0', + PRIMARY KEY (`id`), + UNIQUE KEY `name` (`name`(150)) +) ENGINE=InnoDB AUTO_INCREMENT=184 DEFAULT CHARSET=utf8mb4; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_listmessage` +-- DROP TABLE IF EXISTS `phplist_listmessage`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_listmessage` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `messageid` int(11) NOT NULL, - `listid` int(11) NOT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `messageid` int NOT NULL, + `listid` int NOT NULL, `entered` datetime DEFAULT NULL, `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), UNIQUE KEY `messageid` (`messageid`,`listid`), KEY `listmessageidx` (`listid`,`messageid`) -) ENGINE=InnoDB AUTO_INCREMENT=15 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=36 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `phplist_listrss`; -CREATE TABLE `phplist_listrss` ( - `listid` int(11) NOT NULL, - `type` varchar(255) NOT NULL, - `entered` datetime NOT NULL, - `info` text, - KEY `listididx` (`listid`), - KEY `enteredidx` (`entered`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- +-- Table structure for table `phplist_listuser` +-- DROP TABLE IF EXISTS `phplist_listuser`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_listuser` ( - `userid` int(11) NOT NULL, - `listid` int(11) NOT NULL, + `userid` int NOT NULL, + `listid` int NOT NULL, `entered` datetime DEFAULT NULL, `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`userid`,`listid`), @@ -263,192 +489,235 @@ CREATE TABLE `phplist_listuser` ( KEY `userlistenteredidx` (`userid`,`listid`,`entered`), KEY `useridx` (`userid`), KEY `listidx` (`listid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_message` +-- DROP TABLE IF EXISTS `phplist_message`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_message` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `subject` varchar(255) NOT NULL DEFAULT '(no subject)', + `id` int NOT NULL AUTO_INCREMENT, + `uuid` varchar(36) DEFAULT '', + `subject` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '(no subject)', `fromfield` varchar(255) NOT NULL DEFAULT '', `tofield` varchar(255) NOT NULL DEFAULT '', `replyto` varchar(255) NOT NULL DEFAULT '', - `message` mediumtext, - `textmessage` mediumtext, + `message` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `textmessage` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, `footer` text, `entered` datetime DEFAULT NULL, `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `embargo` datetime DEFAULT NULL, - `repeatinterval` int(11) DEFAULT '0', + `repeatinterval` int DEFAULT '0', `repeatuntil` datetime DEFAULT NULL, - `requeueinterval` int(11) DEFAULT '0', + `requeueinterval` int DEFAULT '0', `requeueuntil` datetime DEFAULT NULL, `status` varchar(255) DEFAULT NULL, `userselection` text, `sent` datetime DEFAULT NULL, - `htmlformatted` tinyint(4) DEFAULT '0', + `htmlformatted` tinyint DEFAULT '0', `sendformat` varchar(20) DEFAULT NULL, - `template` int(11) DEFAULT NULL, - `processed` mediumint(8) unsigned DEFAULT '0', - `astext` int(11) DEFAULT '0', - `ashtml` int(11) DEFAULT '0', - `astextandhtml` int(11) DEFAULT '0', - `aspdf` int(11) DEFAULT '0', - `astextandpdf` int(11) DEFAULT '0', - `viewed` int(11) DEFAULT '0', - `bouncecount` int(11) DEFAULT '0', + `template` int DEFAULT NULL, + `processed` int unsigned DEFAULT '0', + `astext` int DEFAULT '0', + `ashtml` int DEFAULT '0', + `astextandhtml` int DEFAULT '0', + `aspdf` int DEFAULT '0', + `astextandpdf` int DEFAULT '0', + `viewed` int DEFAULT '0', + `bouncecount` int DEFAULT '0', `sendstart` datetime DEFAULT NULL, `rsstemplate` varchar(100) DEFAULT NULL, - `owner` int(11) DEFAULT NULL, - PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + `owner` int DEFAULT NULL, + PRIMARY KEY (`id`), + KEY `uuididx` (`uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_message_attachment` +-- DROP TABLE IF EXISTS `phplist_message_attachment`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_message_attachment` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `messageid` int(11) NOT NULL, - `attachmentid` int(11) NOT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `messageid` int NOT NULL, + `attachmentid` int NOT NULL, PRIMARY KEY (`id`), KEY `messageidx` (`messageid`), KEY `messageattidx` (`messageid`,`attachmentid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_messagedata` +-- DROP TABLE IF EXISTS `phplist_messagedata`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_messagedata` ( `name` varchar(100) NOT NULL, - `id` int(11) NOT NULL, - `data` text, + `id` int NOT NULL, + `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, PRIMARY KEY (`name`,`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -DROP TABLE IF EXISTS `phplist_rssitem`; -CREATE TABLE `phplist_rssitem` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `title` varchar(100) NOT NULL, - `link` varchar(100) NOT NULL, - `source` varchar(255) DEFAULT NULL, - `list` int(11) NOT NULL, - `added` datetime DEFAULT NULL, - `processed` mediumint(8) unsigned DEFAULT '0', - `astext` int(11) DEFAULT '0', - `ashtml` int(11) DEFAULT '0', - PRIMARY KEY (`id`), - KEY `titlelinkidx` (`title`,`link`), - KEY `titleidx` (`title`), - KEY `listidx` (`list`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -DROP TABLE IF EXISTS `phplist_rssitem_data`; -CREATE TABLE `phplist_rssitem_data` ( - `itemid` int(11) NOT NULL, - `tag` varchar(100) NOT NULL, - `data` text, - PRIMARY KEY (`itemid`,`tag`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `phplist_rssitem_user`; -CREATE TABLE `phplist_rssitem_user` ( - `itemid` int(11) NOT NULL, - `userid` int(11) NOT NULL, - `entered` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - PRIMARY KEY (`itemid`,`userid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- +-- Table structure for table `phplist_sendprocess` +-- DROP TABLE IF EXISTS `phplist_sendprocess`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_sendprocess` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `started` datetime DEFAULT NULL, `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, - `alive` int(11) DEFAULT '1', + `alive` int DEFAULT '1', `ipaddress` varchar(50) DEFAULT NULL, `page` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB AUTO_INCREMENT=18 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_subscribepage` +-- DROP TABLE IF EXISTS `phplist_subscribepage`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_subscribepage` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, - `active` tinyint(4) DEFAULT '0', - `owner` int(11) DEFAULT NULL, + `active` tinyint DEFAULT '0', + `owner` int DEFAULT NULL, PRIMARY KEY (`id`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_subscribepage_data` +-- DROP TABLE IF EXISTS `phplist_subscribepage_data`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_subscribepage_data` ( - `id` int(11) NOT NULL, + `id` int NOT NULL, `name` varchar(100) NOT NULL, `data` text, PRIMARY KEY (`id`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_template` +-- DROP TABLE IF EXISTS `phplist_template`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_template` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `title` varchar(255) NOT NULL, `template` longblob, - `listorder` int(11) DEFAULT NULL, + `template_text` longblob, + `listorder` int DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `title` (`title`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_templateimage` +-- DROP TABLE IF EXISTS `phplist_templateimage`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_templateimage` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `template` int(11) NOT NULL DEFAULT '0', + `id` int NOT NULL AUTO_INCREMENT, + `template` int NOT NULL DEFAULT '0', `mimetype` varchar(100) DEFAULT NULL, `filename` varchar(100) DEFAULT NULL, `data` longblob, - `width` int(11) DEFAULT NULL, - `height` int(11) DEFAULT NULL, + `width` int DEFAULT NULL, + `height` int DEFAULT NULL, PRIMARY KEY (`id`), KEY `templateidx` (`template`) -) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_urlcache` +-- + +DROP TABLE IF EXISTS `phplist_urlcache`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_urlcache` ( + `id` int NOT NULL AUTO_INCREMENT, + `url` varchar(2083) NOT NULL, + `lastmodified` int DEFAULT NULL, + `added` datetime DEFAULT NULL, + `content` longblob, + PRIMARY KEY (`id`), + KEY `urlindex` (`url`(255)) +) ENGINE=InnoDB AUTO_INCREMENT=207 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `phplist_translation`; -CREATE TABLE `phplist_translation` ( - `tag` varchar(255) NOT NULL, - `page` varchar(100) NOT NULL, - `lan` varchar(10) NOT NULL, - `translation` text, - KEY `tagidx` (`tag`), - KEY `pageidx` (`page`), - KEY `lanidx` (`lan`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; - -DROP TABLE IF EXISTS phplist_urlcache; -CREATE TABLE phplist_urlcache ( - id int(11) NOT NULL AUTO_INCREMENT, - url varchar(2083) NOT NULL, - lastmodified int(11) DEFAULT NULL, - added datetime DEFAULT NULL, - content mediumtext, - PRIMARY KEY (id), - KEY urlindex (url(255)) -) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=utf8; +-- +-- Table structure for table `phplist_user_attribute` +-- DROP TABLE IF EXISTS `phplist_user_attribute`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_attribute` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `type` varchar(30) DEFAULT NULL, - `listorder` int(11) DEFAULT NULL, + `listorder` int DEFAULT NULL, `default_value` varchar(255) DEFAULT NULL, - `required` tinyint(4) DEFAULT NULL, + `required` tinyint DEFAULT NULL, `tablename` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`), KEY `nameindex` (`name`), KEY `idnameindex` (`id`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_blacklist` +-- DROP TABLE IF EXISTS `phplist_user_blacklist`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_blacklist` ( `email` varchar(255) NOT NULL, `added` datetime DEFAULT NULL, UNIQUE KEY `email` (`email`), KEY `emailidx` (`email`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_blacklist_data` +-- DROP TABLE IF EXISTS `phplist_user_blacklist_data`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_blacklist_data` ( `email` varchar(150) NOT NULL, `name` varchar(25) NOT NULL, @@ -456,27 +725,41 @@ CREATE TABLE `phplist_user_blacklist_data` ( UNIQUE KEY `email` (`email`), KEY `emailidx` (`email`), KEY `emailnameidx` (`email`,`name`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_message_bounce` +-- DROP TABLE IF EXISTS `phplist_user_message_bounce`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_message_bounce` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `user` int(11) NOT NULL, - `message` int(11) NOT NULL, - `bounce` int(11) NOT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `user` int NOT NULL, + `message` int NOT NULL, + `bounce` int NOT NULL, `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`), KEY `umbindex` (`user`,`message`,`bounce`), KEY `useridx` (`user`), KEY `msgidx` (`message`), KEY `bounceidx` (`bounce`) -) ENGINE=InnoDB AUTO_INCREMENT=2168 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_message_forward` +-- DROP TABLE IF EXISTS `phplist_user_message_forward`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_message_forward` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `user` int(11) NOT NULL, - `message` int(11) NOT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `user` int NOT NULL, + `message` int NOT NULL, `forward` varchar(255) DEFAULT NULL, `status` varchar(255) DEFAULT NULL, `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, @@ -484,32 +767,54 @@ CREATE TABLE `phplist_user_message_forward` ( KEY `usermessageidx` (`user`,`message`), KEY `useridx` (`user`), KEY `messageidx` (`message`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_message_view` +-- + +DROP TABLE IF EXISTS `phplist_user_message_view`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; +CREATE TABLE `phplist_user_message_view` ( + `id` int NOT NULL AUTO_INCREMENT, + `messageid` int NOT NULL, + `userid` int NOT NULL, + `viewed` datetime DEFAULT NULL, + `ip` varchar(255) DEFAULT NULL, + `data` longtext, + PRIMARY KEY (`id`), + KEY `usermsgidx` (`userid`,`messageid`), + KEY `msgidx` (`messageid`), + KEY `useridx` (`userid`) +) ENGINE=InnoDB AUTO_INCREMENT=25 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; -DROP TABLE IF EXISTS `phplist_user_rss`; -CREATE TABLE `phplist_user_rss` ( - `userid` int(11) NOT NULL, - `last` datetime DEFAULT NULL, - PRIMARY KEY (`userid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- +-- Table structure for table `phplist_user_user` +-- DROP TABLE IF EXISTS `phplist_user_user`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_user` ( - `id` int(11) NOT NULL AUTO_INCREMENT, + `id` int NOT NULL AUTO_INCREMENT, `email` varchar(255) NOT NULL, - `confirmed` tinyint(4) DEFAULT '0', - `blacklisted` tinyint(4) DEFAULT '0', - `optedin` tinyint(4) DEFAULT '0', - `bouncecount` int(11) DEFAULT '0', + `confirmed` tinyint DEFAULT '0', + `blacklisted` tinyint DEFAULT '0', + `optedin` tinyint DEFAULT '0', + `bouncecount` int DEFAULT '0', `entered` datetime DEFAULT NULL, `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `uniqid` varchar(255) DEFAULT NULL, - `htmlemail` tinyint(4) DEFAULT '0', - `subscribepage` int(11) DEFAULT NULL, + `uuid` varchar(36) DEFAULT '', + `htmlemail` tinyint DEFAULT '0', + `subscribepage` int DEFAULT NULL, `rssfrequency` varchar(100) DEFAULT NULL, `password` varchar(255) DEFAULT NULL, `passwordchanged` date DEFAULT NULL, - `disabled` tinyint(4) DEFAULT '0', + `disabled` tinyint DEFAULT '0', `extradata` text, `foreignkey` varchar(100) DEFAULT NULL, PRIMARY KEY (`id`), @@ -519,24 +824,39 @@ CREATE TABLE `phplist_user_user` ( KEY `enteredindex` (`entered`), KEY `confidx` (`confirmed`), KEY `blidx` (`blacklisted`), - KEY `optidx` (`optedin`) -) ENGINE=InnoDB AUTO_INCREMENT=102306 DEFAULT CHARSET=utf8; + KEY `optidx` (`optedin`), + KEY `uuididx` (`uuid`) +) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_user_attribute` +-- DROP TABLE IF EXISTS `phplist_user_user_attribute`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_user_attribute` ( - `attributeid` int(11) NOT NULL, - `userid` int(11) NOT NULL, - `value` varchar(255) DEFAULT NULL, + `attributeid` int NOT NULL, + `userid` int NOT NULL, + `value` text, PRIMARY KEY (`attributeid`,`userid`), KEY `userindex` (`userid`), KEY `attindex` (`attributeid`), KEY `attuserid` (`userid`,`attributeid`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_user_user_history` +-- DROP TABLE IF EXISTS `phplist_user_user_history`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_user_history` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `userid` int(11) NOT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `userid` int NOT NULL, `ip` varchar(255) DEFAULT NULL, `date` datetime DEFAULT NULL, `summary` varchar(255) DEFAULT NULL, @@ -545,12 +865,19 @@ CREATE TABLE `phplist_user_user_history` ( PRIMARY KEY (`id`), KEY `userididx` (`userid`), KEY `dateidx` (`date`) -) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8; +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_usermessage` +-- DROP TABLE IF EXISTS `phplist_usermessage`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_usermessage` ( - `messageid` int(11) NOT NULL, - `userid` int(11) NOT NULL, + `messageid` int NOT NULL, + `userid` int NOT NULL, `entered` datetime NOT NULL, `viewed` datetime DEFAULT NULL, `status` varchar(255) DEFAULT NULL, @@ -560,19 +887,38 @@ CREATE TABLE `phplist_usermessage` ( KEY `enteredindex` (`entered`), KEY `statusidx` (`status`), KEY `viewedidx` (`viewed`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; + +-- +-- Table structure for table `phplist_userstats` +-- DROP TABLE IF EXISTS `phplist_userstats`; +/*!40101 SET @saved_cs_client = @@character_set_client */; +/*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_userstats` ( - `id` int(11) NOT NULL AUTO_INCREMENT, - `unixdate` int(11) DEFAULT NULL, + `id` int NOT NULL AUTO_INCREMENT, + `unixdate` int DEFAULT NULL, `item` varchar(255) DEFAULT NULL, - `listid` int(11) DEFAULT '0', - `value` int(11) DEFAULT '0', + `listid` int DEFAULT '0', + `value` int DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `entry` (`unixdate`,`item`,`listid`), KEY `dateindex` (`unixdate`), KEY `itemindex` (`item`), KEY `listindex` (`listid`), KEY `listdateindex` (`listid`,`unixdate`) -) ENGINE=InnoDB DEFAULT CHARSET=utf8; +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; +/*!40101 SET character_set_client = @saved_cs_client */; +/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */; + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; +/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; +/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; + +-- Dump completed on 2025-10-28 14:22:41 diff --git a/src/Domain/Identity/Model/Administrator.php b/src/Domain/Identity/Model/Administrator.php index 6e0d0882..09ba46e0 100644 --- a/src/Domain/Identity/Model/Administrator.php +++ b/src/Domain/Identity/Model/Administrator.php @@ -32,8 +32,8 @@ class Administrator implements DomainModel, Identity, CreationDate, Modification #[ORM\GeneratedValue] private ?int $id = null; - #[ORM\Column(name: 'created', type: 'datetime', nullable: true)] - protected DateTime $createdAt; + #[ORM\Column(name: 'created', type: 'datetime', nullable: false)] + protected ?DateTime $createdAt = null; #[ORM\Column(name: 'modified', type: 'datetime', nullable: false)] private DateTime $updatedAt; @@ -77,7 +77,7 @@ public function getId(): ?int return $this->id; } - public function getCreatedAt(): DateTime + public function getCreatedAt(): ?DateTime { return $this->createdAt; } diff --git a/src/Domain/Messaging/Model/Bounce.php b/src/Domain/Messaging/Model/Bounce.php index dd3471e9..dbcb5106 100644 --- a/src/Domain/Messaging/Model/Bounce.php +++ b/src/Domain/Messaging/Model/Bounce.php @@ -30,7 +30,7 @@ class Bounce implements DomainModel, Identity #[ORM\Column(type: 'blob', nullable: true)] private ?string $data; - #[ORM\Column(type: 'string', length: 20, nullable: true)] + #[ORM\Column(type: 'string', length: 255, nullable: true)] private ?string $status; #[ORM\Column(type: 'text', nullable: true)] diff --git a/src/Domain/Messaging/Model/Message/MessageFormat.php b/src/Domain/Messaging/Model/Message/MessageFormat.php index b76558ff..5deedefb 100644 --- a/src/Domain/Messaging/Model/Message/MessageFormat.php +++ b/src/Domain/Messaging/Model/Message/MessageFormat.php @@ -17,19 +17,19 @@ class MessageFormat implements EmbeddableInterface #[ORM\Column(name: 'sendformat', type: 'string', length: 20, nullable: true)] private ?string $sendFormat = null; - #[ORM\Column(name: 'astext', type: 'boolean', options: ['default' => false])] + #[ORM\Column(name: 'astext', type: 'boolean')] private bool $asText = false; - #[ORM\Column(name: 'ashtml', type: 'boolean', options: ['default' => false])] + #[ORM\Column(name: 'ashtml', type: 'boolean')] private bool $asHtml = false; - #[ORM\Column(name: 'aspdf', type: 'boolean', options: ['default' => false])] + #[ORM\Column(name: 'aspdf', type: 'boolean')] private bool $asPdf = false; - #[ORM\Column(name: 'astextandhtml', type: 'boolean', options: ['default' => false])] + #[ORM\Column(name: 'astextandhtml', type: 'boolean')] private bool $asTextAndHtml = false; - #[ORM\Column(name: 'astextandpdf', type: 'boolean', options: ['default' => false])] + #[ORM\Column(name: 'astextandpdf', type: 'boolean')] private bool $asTextAndPdf = false; public const FORMAT_TEXT = 'text'; diff --git a/src/Migrations/Version20251030081120PostgreSqlPlatform.php b/src/Migrations/Version20251030081120PostgreSqlPlatform.php index ee31039e..ca189fa4 100644 --- a/src/Migrations/Version20251030081120PostgreSqlPlatform.php +++ b/src/Migrations/Version20251030081120PostgreSqlPlatform.php @@ -192,7 +192,6 @@ public function down(Schema $schema): void ) ); // this down() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE SCHEMA public'); $this->addSql('ALTER TABLE phplist_admin_attribute DROP CONSTRAINT FK_58E07690D3B10C48'); $this->addSql('ALTER TABLE phplist_admin_attribute DROP CONSTRAINT FK_58E07690B8ED4D93'); $this->addSql('ALTER TABLE phplist_admin_login DROP CONSTRAINT FK_5FCE0842B8ED4D93'); diff --git a/src/Migrations/Version20251030083621MySqlRenameIndex.php b/src/Migrations/Version20251030083621MySqlRenameIndex.php index 815fcc27..68706189 100644 --- a/src/Migrations/Version20251030083621MySqlRenameIndex.php +++ b/src/Migrations/Version20251030083621MySqlRenameIndex.php @@ -4,6 +4,7 @@ namespace PhpList\Core\Migrations; +use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; @@ -19,6 +20,15 @@ public function getDescription(): string public function up(Schema $schema): void { + $platform = $this->connection->getDatabasePlatform(); + $this->skipIf( + !$platform instanceof MySQLPlatform, + sprintf( + 'This migration is only applicable for MySQL. Current platform: %s', + get_class($platform) + ) + ); + // this up() migration is auto-generated, please modify it to your needs $this->addSql('ALTER TABLE phplist_admin RENAME INDEX loginnameidx TO phplist_admin_loginnameidx'); $this->addSql('ALTER TABLE phplist_bounce RENAME INDEX dateindex TO phplist_bounce_dateindex'); @@ -103,6 +113,15 @@ public function up(Schema $schema): void public function down(Schema $schema): void { + $platform = $this->connection->getDatabasePlatform(); + $this->skipIf( + !$platform instanceof MySQLPlatform, + sprintf( + 'This migration is only applicable for MySQL. Current platform: %s', + get_class($platform) + ) + ); + // this down() migration is auto-generated, please modify it to your needs $this->addSql('ALTER TABLE phplist_admin RENAME INDEX phplist_admin_loginnameidx TO loginnameidx'); $this->addSql('ALTER TABLE phplist_bounce RENAME INDEX phplist_bounce_dateindex TO dateindex'); diff --git a/src/Migrations/initial_schema.sql b/src/Migrations/initial_schema.sql index c22ff92b..7f9cf70a 100644 --- a/src/Migrations/initial_schema.sql +++ b/src/Migrations/initial_schema.sql @@ -19,7 +19,6 @@ -- Table structure for table `phplist_admin` -- -DROP TABLE IF EXISTS `phplist_admin`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_admin` ( @@ -44,7 +43,6 @@ CREATE TABLE `phplist_admin` ( -- Table structure for table `phplist_admin_attribute` -- -DROP TABLE IF EXISTS `phplist_admin_attribute`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_admin_attribute` ( @@ -59,7 +57,6 @@ CREATE TABLE `phplist_admin_attribute` ( -- Table structure for table `phplist_admin_login` -- -DROP TABLE IF EXISTS `phplist_admin_login`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_admin_login` ( @@ -78,7 +75,6 @@ CREATE TABLE `phplist_admin_login` ( -- Table structure for table `phplist_admin_password_request` -- -DROP TABLE IF EXISTS `phplist_admin_password_request`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_admin_password_request` ( @@ -94,7 +90,6 @@ CREATE TABLE `phplist_admin_password_request` ( -- Table structure for table `phplist_adminattribute` -- -DROP TABLE IF EXISTS `phplist_adminattribute`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_adminattribute` ( @@ -113,7 +108,6 @@ CREATE TABLE `phplist_adminattribute` ( -- Table structure for table `phplist_admintoken` -- -DROP TABLE IF EXISTS `phplist_admintoken`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_admintoken` ( @@ -130,7 +124,6 @@ CREATE TABLE `phplist_admintoken` ( -- Table structure for table `phplist_attachment` -- -DROP TABLE IF EXISTS `phplist_attachment`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_attachment` ( @@ -148,7 +141,6 @@ CREATE TABLE `phplist_attachment` ( -- Table structure for table `phplist_bounce` -- -DROP TABLE IF EXISTS `phplist_bounce`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_bounce` ( @@ -168,7 +160,6 @@ CREATE TABLE `phplist_bounce` ( -- Table structure for table `phplist_bounceregex` -- -DROP TABLE IF EXISTS `phplist_bounceregex`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_bounceregex` ( @@ -190,7 +181,6 @@ CREATE TABLE `phplist_bounceregex` ( -- Table structure for table `phplist_bounceregex_bounce` -- -DROP TABLE IF EXISTS `phplist_bounceregex_bounce`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_bounceregex_bounce` ( @@ -204,7 +194,6 @@ CREATE TABLE `phplist_bounceregex_bounce` ( -- Table structure for table `phplist_config` -- -DROP TABLE IF EXISTS `phplist_config`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_config` ( @@ -220,7 +209,6 @@ CREATE TABLE `phplist_config` ( -- Table structure for table `phplist_eventlog` -- -DROP TABLE IF EXISTS `phplist_eventlog`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_eventlog` ( @@ -238,7 +226,6 @@ CREATE TABLE `phplist_eventlog` ( -- Table structure for table `phplist_i18n` -- -DROP TABLE IF EXISTS `phplist_i18n`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_i18n` ( @@ -254,7 +241,6 @@ CREATE TABLE `phplist_i18n` ( -- Table structure for table `phplist_linktrack` -- -DROP TABLE IF EXISTS `phplist_linktrack`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_linktrack` ( @@ -279,7 +265,6 @@ CREATE TABLE `phplist_linktrack` ( -- Table structure for table `phplist_linktrack_forward` -- -DROP TABLE IF EXISTS `phplist_linktrack_forward`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_linktrack_forward` ( @@ -299,7 +284,6 @@ CREATE TABLE `phplist_linktrack_forward` ( -- Table structure for table `phplist_linktrack_ml` -- -DROP TABLE IF EXISTS `phplist_linktrack_ml`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_linktrack_ml` ( @@ -321,7 +305,6 @@ CREATE TABLE `phplist_linktrack_ml` ( -- Table structure for table `phplist_linktrack_uml_click` -- -DROP TABLE IF EXISTS `phplist_linktrack_uml_click`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_linktrack_uml_click` ( @@ -346,7 +329,6 @@ CREATE TABLE `phplist_linktrack_uml_click` ( -- Table structure for table `phplist_linktrack_userclick` -- -DROP TABLE IF EXISTS `phplist_linktrack_userclick`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_linktrack_userclick` ( @@ -368,7 +350,6 @@ CREATE TABLE `phplist_linktrack_userclick` ( -- Table structure for table `phplist_list` -- -DROP TABLE IF EXISTS `phplist_list`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_list` ( @@ -393,7 +374,6 @@ CREATE TABLE `phplist_list` ( -- Table structure for table `phplist_listattr_becities` -- -DROP TABLE IF EXISTS `phplist_listattr_becities`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_listattr_becities` ( @@ -409,7 +389,6 @@ CREATE TABLE `phplist_listattr_becities` ( -- Table structure for table `phplist_listattr_termsofservice` -- -DROP TABLE IF EXISTS `phplist_listattr_termsofservice`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_listattr_termsofservice` ( @@ -425,7 +404,6 @@ CREATE TABLE `phplist_listattr_termsofservice` ( -- Table structure for table `phplist_listattr_ukcounties` -- -DROP TABLE IF EXISTS `phplist_listattr_ukcounties`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_listattr_ukcounties` ( @@ -441,7 +419,6 @@ CREATE TABLE `phplist_listattr_ukcounties` ( -- Table structure for table `phplist_listattr_ukcounties1` -- -DROP TABLE IF EXISTS `phplist_listattr_ukcounties1`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_listattr_ukcounties1` ( @@ -457,7 +434,6 @@ CREATE TABLE `phplist_listattr_ukcounties1` ( -- Table structure for table `phplist_listmessage` -- -DROP TABLE IF EXISTS `phplist_listmessage`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_listmessage` ( @@ -476,7 +452,6 @@ CREATE TABLE `phplist_listmessage` ( -- Table structure for table `phplist_listuser` -- -DROP TABLE IF EXISTS `phplist_listuser`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_listuser` ( @@ -496,7 +471,6 @@ CREATE TABLE `phplist_listuser` ( -- Table structure for table `phplist_message` -- -DROP TABLE IF EXISTS `phplist_message`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_message` ( @@ -542,7 +516,6 @@ CREATE TABLE `phplist_message` ( -- Table structure for table `phplist_message_attachment` -- -DROP TABLE IF EXISTS `phplist_message_attachment`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_message_attachment` ( @@ -559,7 +532,6 @@ CREATE TABLE `phplist_message_attachment` ( -- Table structure for table `phplist_messagedata` -- -DROP TABLE IF EXISTS `phplist_messagedata`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_messagedata` ( @@ -574,7 +546,6 @@ CREATE TABLE `phplist_messagedata` ( -- Table structure for table `phplist_sendprocess` -- -DROP TABLE IF EXISTS `phplist_sendprocess`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_sendprocess` ( @@ -592,7 +563,6 @@ CREATE TABLE `phplist_sendprocess` ( -- Table structure for table `phplist_subscribepage` -- -DROP TABLE IF EXISTS `phplist_subscribepage`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_subscribepage` ( @@ -608,7 +578,6 @@ CREATE TABLE `phplist_subscribepage` ( -- Table structure for table `phplist_subscribepage_data` -- -DROP TABLE IF EXISTS `phplist_subscribepage_data`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_subscribepage_data` ( @@ -623,7 +592,6 @@ CREATE TABLE `phplist_subscribepage_data` ( -- Table structure for table `phplist_template` -- -DROP TABLE IF EXISTS `phplist_template`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_template` ( @@ -641,7 +609,6 @@ CREATE TABLE `phplist_template` ( -- Table structure for table `phplist_templateimage` -- -DROP TABLE IF EXISTS `phplist_templateimage`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_templateimage` ( @@ -661,7 +628,6 @@ CREATE TABLE `phplist_templateimage` ( -- Table structure for table `phplist_urlcache` -- -DROP TABLE IF EXISTS `phplist_urlcache`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_urlcache` ( @@ -679,7 +645,6 @@ CREATE TABLE `phplist_urlcache` ( -- Table structure for table `phplist_user_attribute` -- -DROP TABLE IF EXISTS `phplist_user_attribute`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_attribute` ( @@ -700,7 +665,6 @@ CREATE TABLE `phplist_user_attribute` ( -- Table structure for table `phplist_user_blacklist` -- -DROP TABLE IF EXISTS `phplist_user_blacklist`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_blacklist` ( @@ -715,7 +679,6 @@ CREATE TABLE `phplist_user_blacklist` ( -- Table structure for table `phplist_user_blacklist_data` -- -DROP TABLE IF EXISTS `phplist_user_blacklist_data`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_blacklist_data` ( @@ -732,7 +695,6 @@ CREATE TABLE `phplist_user_blacklist_data` ( -- Table structure for table `phplist_user_message_bounce` -- -DROP TABLE IF EXISTS `phplist_user_message_bounce`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_message_bounce` ( @@ -753,7 +715,6 @@ CREATE TABLE `phplist_user_message_bounce` ( -- Table structure for table `phplist_user_message_forward` -- -DROP TABLE IF EXISTS `phplist_user_message_forward`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_message_forward` ( @@ -774,7 +735,6 @@ CREATE TABLE `phplist_user_message_forward` ( -- Table structure for table `phplist_user_message_view` -- -DROP TABLE IF EXISTS `phplist_user_message_view`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_message_view` ( @@ -795,7 +755,6 @@ CREATE TABLE `phplist_user_message_view` ( -- Table structure for table `phplist_user_user` -- -DROP TABLE IF EXISTS `phplist_user_user`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_user` ( @@ -833,7 +792,6 @@ CREATE TABLE `phplist_user_user` ( -- Table structure for table `phplist_user_user_attribute` -- -DROP TABLE IF EXISTS `phplist_user_user_attribute`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_user_attribute` ( @@ -851,7 +809,6 @@ CREATE TABLE `phplist_user_user_attribute` ( -- Table structure for table `phplist_user_user_history` -- -DROP TABLE IF EXISTS `phplist_user_user_history`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_user_user_history` ( @@ -872,7 +829,6 @@ CREATE TABLE `phplist_user_user_history` ( -- Table structure for table `phplist_usermessage` -- -DROP TABLE IF EXISTS `phplist_usermessage`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_usermessage` ( @@ -894,7 +850,6 @@ CREATE TABLE `phplist_usermessage` ( -- Table structure for table `phplist_userstats` -- -DROP TABLE IF EXISTS `phplist_userstats`; /*!40101 SET @saved_cs_client = @@character_set_client */; /*!50503 SET character_set_client = utf8mb4 */; CREATE TABLE `phplist_userstats` ( diff --git a/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php b/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php index a519a85d..84a98df7 100644 --- a/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php +++ b/tests/Unit/Domain/Identity/Model/AdministratorTokenTest.php @@ -90,7 +90,7 @@ public function testGenerateKeyCreatesDifferentKeysForEachCall(): void self::assertNotSame($firstKey, $secondKey); } - public function testGetAdministratorInitiallyReturnsNull(): void + public function testGetAdministratorReturnsConstructorProvidedAdministrator(): void { self::assertNotNull($this->subject->getAdministrator()); } From a9a25c13023908b948ea40e24db6e372575dc3a6 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 31 Oct 2025 10:13:17 +0400 Subject: [PATCH 20/22] After review 1 --- resources/Database/Schema.sql | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/resources/Database/Schema.sql b/resources/Database/Schema.sql index c22ff92b..fa9e6966 100644 --- a/resources/Database/Schema.sql +++ b/resources/Database/Schema.sql @@ -502,12 +502,12 @@ DROP TABLE IF EXISTS `phplist_message`; CREATE TABLE `phplist_message` ( `id` int NOT NULL AUTO_INCREMENT, `uuid` varchar(36) DEFAULT '', - `subject` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '(no subject)', + `subject` varchar(255) NOT NULL DEFAULT '(no subject)', `fromfield` varchar(255) NOT NULL DEFAULT '', `tofield` varchar(255) NOT NULL DEFAULT '', `replyto` varchar(255) NOT NULL DEFAULT '', - `message` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, - `textmessage` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `message` longtext, + `textmessage` longtext, `footer` text, `entered` datetime DEFAULT NULL, `modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, @@ -565,7 +565,7 @@ DROP TABLE IF EXISTS `phplist_messagedata`; CREATE TABLE `phplist_messagedata` ( `name` varchar(100) NOT NULL, `id` int NOT NULL, - `data` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci, + `data` longtext, PRIMARY KEY (`name`,`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3; /*!40101 SET character_set_client = @saved_cs_client */; From 1e16cc0c4f413b852422b1ba7ff4175cef34803b Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 31 Oct 2025 11:06:33 +0400 Subject: [PATCH 21/22] Fix MySql migrations --- .../Identity/Model/AdministratorToken.php | 1 - src/Migrations/.gitkeep | 0 ...php => Version20251028092901MySqlInit.php} | 2 +- ...p => Version20251028092902MySqlUpdate.php} | 170 +++++++++++++--- .../Version20251029105320MySqlRelations.php | 192 ------------------ ...p => Version20251031072945PostGreInit.php} | 134 +++++++++--- src/Migrations/_template_migration.php.tpl | 9 +- 7 files changed, 255 insertions(+), 253 deletions(-) delete mode 100644 src/Migrations/.gitkeep rename src/Migrations/{Version20251028092901MySql.php => Version20251028092901MySqlInit.php} (92%) rename src/Migrations/{Version20251030083621MySqlRenameIndex.php => Version20251028092902MySqlUpdate.php} (51%) delete mode 100644 src/Migrations/Version20251029105320MySqlRelations.php rename src/Migrations/{Version20251030081120PostgreSqlPlatform.php => Version20251031072945PostGreInit.php} (74%) diff --git a/src/Domain/Identity/Model/AdministratorToken.php b/src/Domain/Identity/Model/AdministratorToken.php index af444bd2..4e37b2b5 100644 --- a/src/Domain/Identity/Model/AdministratorToken.php +++ b/src/Domain/Identity/Model/AdministratorToken.php @@ -7,7 +7,6 @@ use DateTime; use DateTimeZone; use Doctrine\ORM\Mapping as ORM; -use Doctrine\Persistence\Proxy; use PhpList\Core\Domain\Common\Model\Interfaces\CreationDate; use PhpList\Core\Domain\Common\Model\Interfaces\DomainModel; use PhpList\Core\Domain\Common\Model\Interfaces\Identity; diff --git a/src/Migrations/.gitkeep b/src/Migrations/.gitkeep deleted file mode 100644 index e69de29b..00000000 diff --git a/src/Migrations/Version20251028092901MySql.php b/src/Migrations/Version20251028092901MySqlInit.php similarity index 92% rename from src/Migrations/Version20251028092901MySql.php rename to src/Migrations/Version20251028092901MySqlInit.php index 056c60ae..7b345dad 100644 --- a/src/Migrations/Version20251028092901MySql.php +++ b/src/Migrations/Version20251028092901MySqlInit.php @@ -11,7 +11,7 @@ /** * Manual Migration */ -final class Version20251028092901MySql extends AbstractMigration +final class Version20251028092901MySqlInit extends AbstractMigration { public function getDescription(): string { diff --git a/src/Migrations/Version20251030083621MySqlRenameIndex.php b/src/Migrations/Version20251028092902MySqlUpdate.php similarity index 51% rename from src/Migrations/Version20251030083621MySqlRenameIndex.php rename to src/Migrations/Version20251028092902MySqlUpdate.php index 68706189..789bc1f0 100644 --- a/src/Migrations/Version20251030083621MySqlRenameIndex.php +++ b/src/Migrations/Version20251028092902MySqlUpdate.php @@ -4,45 +4,59 @@ namespace PhpList\Core\Migrations; +use Doctrine\DBAL\Platforms\PostgreSQLPlatform; use Doctrine\DBAL\Platforms\MySQLPlatform; -use Doctrine\DBAL\Schema\Schema; use Doctrine\Migrations\AbstractMigration; +use Doctrine\DBAL\Schema\Schema; -/** - * Auto-generated Migration: Please modify to your needs! - */ -final class Version20251030083621MySqlRenameIndex extends AbstractMigration +final class Version20251028092902MySqlUpdate extends AbstractMigration { public function getDescription(): string { - return 'Rename indexes as postgresql does not support duplicate index names'; + return ''; } public function up(Schema $schema): void { $platform = $this->connection->getDatabasePlatform(); - $this->skipIf( - !$platform instanceof MySQLPlatform, - sprintf( - 'This migration is only applicable for MySQL. Current platform: %s', - get_class($platform) - ) - ); + $this->skipIf(!$platform instanceof MySQLPlatform, sprintf( + 'Unsupported platform for this migration: %s', + get_class($platform) + )); - // this up() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE phplist_admin CHANGE created created DATETIME NOT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE superuser superuser TINYINT(1) NOT NULL, CHANGE disabled disabled TINYINT(1) NOT NULL, CHANGE privileges privileges LONGTEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_admin RENAME INDEX loginnameidx TO phplist_admin_loginnameidx'); + $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690D3B10C48 FOREIGN KEY (adminattributeid) REFERENCES phplist_adminattribute (id)'); + $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute (adminattributeid)'); + $this->addSql('CREATE INDEX IDX_58E07690B8ED4D93 ON phplist_admin_attribute (adminid)'); + $this->addSql('ALTER TABLE phplist_admin_login CHANGE active active TINYINT(1) NOT NULL'); + $this->addSql('ALTER TABLE phplist_admin_login ADD CONSTRAINT FK_5FCE0842B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_5FCE0842B8ED4D93 ON phplist_admin_login (adminid)'); + $this->addSql('ALTER TABLE phplist_admin_password_request CHANGE id_key id_key INT UNSIGNED AUTO_INCREMENT NOT NULL'); + $this->addSql('ALTER TABLE phplist_admin_password_request ADD CONSTRAINT FK_DC146F3B880E0D76 FOREIGN KEY (`admin`) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_DC146F3B880E0D76 ON phplist_admin_password_request (`admin`)'); + $this->addSql('ALTER TABLE phplist_admintoken CHANGE adminid adminid INT DEFAULT NULL, CHANGE value value VARCHAR(255) NOT NULL'); + $this->addSql('ALTER TABLE phplist_admintoken ADD CONSTRAINT FK_CB15D477B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id) ON DELETE CASCADE'); + $this->addSql('CREATE INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken (adminid)'); + $this->addSql('ALTER TABLE phplist_attachment CHANGE description description LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_bounce DROP INDEX statusidx, ADD INDEX phplist_bounce_statusidx (status)'); + $this->addSql('ALTER TABLE phplist_bounce CHANGE header header LONGTEXT DEFAULT NULL, CHANGE data data LONGBLOB DEFAULT NULL, CHANGE comment comment LONGTEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_bounce RENAME INDEX dateindex TO phplist_bounce_dateindex'); - $this->addSql('ALTER TABLE phplist_bounce RENAME INDEX statusidx TO phplist_bounce_statusidx'); + $this->addSql('ALTER TABLE phplist_bounceregex CHANGE regexhash regexhash VARCHAR(32) DEFAULT NULL, CHANGE comment comment LONGTEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_bounceregex RENAME INDEX regex TO phplist_bounceregex_regex'); + $this->addSql('ALTER TABLE phplist_config CHANGE editable editable TINYINT(1) DEFAULT 1 NOT NULL'); + $this->addSql('ALTER TABLE phplist_eventlog CHANGE entry entry LONGTEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_eventlog RENAME INDEX enteredidx TO phplist_eventlog_enteredidx'); $this->addSql('ALTER TABLE phplist_eventlog RENAME INDEX pageidx TO phplist_eventlog_pageidx'); - $this->addSql('ALTER TABLE phplist_i18n RENAME INDEX lanorigunq TO phplist_i18n_lanorigunq'); + $this->addSql('ALTER TABLE phplist_linktrack CHANGE latestclick latestclick DATETIME NOT NULL'); $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX midindex TO phplist_linktrack_midindex'); $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX miduidindex TO phplist_linktrack_miduidindex'); $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX uidindex TO phplist_linktrack_uidindex'); $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX urlindex TO phplist_linktrack_urlindex'); $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX miduidurlindex TO phplist_linktrack_miduidurlindex'); - $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX urlindex TO phplist_linktrack_forward_urlindex'); + $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX urlindex TO phplist_linktrack_forward_urlindex;'); + $this->addSql('ALTER TABLE phplist_linktrack_forward CHANGE urlhash urlhash VARCHAR(32) DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX uuididx TO phplist_linktrack_forward_uuididx'); $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX urlunique TO phplist_linktrack_forward_urlunique'); $this->addSql('ALTER TABLE phplist_linktrack_ml RENAME INDEX fwdindex TO phplist_linktrack_ml_fwdindex'); @@ -51,29 +65,59 @@ public function up(Schema $schema): void $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX miduidindex TO phplist_linktrack_uml_click_miduidindex'); $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX uidindex TO phplist_linktrack_uml_click_uidindex'); $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX miduidfwdid TO phplist_linktrack_uml_click_miduidfwdid'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick CHANGE data data LONGTEXT DEFAULT NULL, ADD PRIMARY KEY (linkid, userid, messageid)'); $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX linkindex TO phplist_linktrack_userclick_linkindex'); $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX linkuserindex TO phplist_linktrack_userclick_linkuserindex'); $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX linkusermessageindex TO phplist_linktrack_userclick_linkusermessageindex'); $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX midindex TO phplist_linktrack_userclick_midindex'); $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX uidindex TO phplist_linktrack_userclick_uidindex'); + $this->addSql('ALTER TABLE phplist_list CHANGE description description VARCHAR(255) NOT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE active active TINYINT(1) NOT NULL, CHANGE category category VARCHAR(255) NOT NULL'); + $this->addSql('ALTER TABLE phplist_list ADD CONSTRAINT FK_A4CE8621CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_A4CE8621CF60E67C ON phplist_list (owner)'); $this->addSql('ALTER TABLE phplist_list RENAME INDEX nameidx TO phplist_list_nameidx'); $this->addSql('ALTER TABLE phplist_list RENAME INDEX listorderidx TO phplist_list_listorderidx'); + $this->addSql('ALTER TABLE phplist_listmessage CHANGE modified modified DATETIME NOT NULL'); + $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A31478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id)'); + $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A8E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id)'); + $this->addSql('CREATE INDEX IDX_83B22D7A31478478 ON phplist_listmessage (messageid)'); + $this->addSql('CREATE INDEX IDX_83B22D7A8E44C1EF ON phplist_listmessage (listid)'); $this->addSql('ALTER TABLE phplist_listmessage RENAME INDEX listmessageidx TO phplist_listmessage_listmessageidx'); $this->addSql('ALTER TABLE phplist_listmessage RENAME INDEX messageid TO phplist_listmessage_messageid'); + $this->addSql('DROP INDEX userlistenteredidx ON phplist_listuser'); + $this->addSql('ALTER TABLE phplist_listuser CHANGE modified modified DATETIME NOT NULL'); + $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E411F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id)'); + $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E4118E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id) ON DELETE CASCADE'); + $this->addSql('CREATE INDEX phplist_listuser_userlistenteredidx ON phplist_listuser (userid, entered, listid)'); $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX userenteredidx TO phplist_listuser_userenteredidx'); - $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX userlistenteredidx TO phplist_listuser_userlistenteredidx'); $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX useridx TO phplist_listuser_useridx'); $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX listidx TO phplist_listuser_listidx'); + $this->addSql('ALTER TABLE phplist_message CHANGE footer footer LONGTEXT DEFAULT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE userselection userselection LONGTEXT DEFAULT NULL, CHANGE htmlformatted htmlformatted TINYINT(1) NOT NULL, CHANGE processed processed TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astext astext TINYINT(1) NOT NULL, CHANGE ashtml ashtml TINYINT(1) NOT NULL, CHANGE astextandhtml astextandhtml TINYINT(1) NOT NULL, CHANGE aspdf aspdf TINYINT(1) NOT NULL, CHANGE astextandpdf astextandpdf TINYINT(1) NOT NULL, CHANGE viewed viewed INT DEFAULT 0 NOT NULL, CHANGE bouncecount bouncecount INT DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCDCF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); + $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCD97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id) ON DELETE SET NULL'); + $this->addSql('CREATE INDEX IDX_C5D81FCDCF60E67C ON phplist_message (owner)'); + $this->addSql('CREATE INDEX IDX_C5D81FCD97601F83 ON phplist_message (template)'); $this->addSql('ALTER TABLE phplist_message RENAME INDEX uuididx TO phplist_message_uuididx'); $this->addSql('ALTER TABLE phplist_message_attachment RENAME INDEX messageattidx TO phplist_message_attachment_messageattidx'); $this->addSql('ALTER TABLE phplist_message_attachment RENAME INDEX messageidx TO phplist_message_attachment_messageidx'); $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_sendprocess CHANGE modified modified DATETIME NOT NULL'); + $this->addSql('ALTER TABLE phplist_subscribepage CHANGE active active TINYINT(1) DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE phplist_subscribepage ADD CONSTRAINT FK_5BAC7737CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); + $this->addSql('CREATE INDEX IDX_5BAC7737CF60E67C ON phplist_subscribepage (owner)'); + $this->addSql('ALTER TABLE phplist_subscribepage_data CHANGE data data LONGTEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_template RENAME INDEX title TO phplist_template_title'); + $this->addSql('ALTER TABLE phplist_templateimage CHANGE template template INT NOT NULL'); + $this->addSql('ALTER TABLE phplist_templateimage ADD CONSTRAINT FK_30A85BA97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id)'); $this->addSql('ALTER TABLE phplist_templateimage RENAME INDEX templateidx TO phplist_templateimage_templateidx'); $this->addSql('ALTER TABLE phplist_urlcache RENAME INDEX urlindex TO phplist_urlcache_urlindex'); $this->addSql('ALTER TABLE phplist_user_attribute RENAME INDEX idnameindex TO phplist_user_attribute_idnameindex'); $this->addSql('ALTER TABLE phplist_user_attribute RENAME INDEX nameindex TO phplist_user_attribute_nameindex'); + $this->addSql('DROP INDEX email ON phplist_user_blacklist'); + $this->addSql('ALTER TABLE phplist_user_blacklist ADD PRIMARY KEY (email)'); $this->addSql('ALTER TABLE phplist_user_blacklist RENAME INDEX emailidx TO phplist_user_blacklist_emailidx'); + $this->addSql('DROP INDEX email ON phplist_user_blacklist_data'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data CHANGE email email VARCHAR(255) NOT NULL, CHANGE data data LONGTEXT DEFAULT NULL, ADD PRIMARY KEY (email)'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data ADD CONSTRAINT FK_6D67150CE7927C74 FOREIGN KEY (email) REFERENCES phplist_user_blacklist (email) ON DELETE CASCADE'); $this->addSql('ALTER TABLE phplist_user_blacklist_data RENAME INDEX emailidx TO phplist_user_blacklist_data_emailidx'); $this->addSql('ALTER TABLE phplist_user_blacklist_data RENAME INDEX emailnameidx TO phplist_user_blacklist_data_emailnameidx'); $this->addSql('ALTER TABLE phplist_user_message_bounce RENAME INDEX bounceidx TO phplist_user_message_bounce_bounceidx'); @@ -86,6 +130,7 @@ public function up(Schema $schema): void $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX msgidx TO phplist_user_message_view_msgidx'); $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX useridx TO phplist_user_message_view_useridx'); $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX usermsgidx TO phplist_user_message_view_usermsgidx'); + $this->addSql('ALTER TABLE phplist_user_user CHANGE confirmed confirmed TINYINT(1) NOT NULL, CHANGE blacklisted blacklisted TINYINT(1) NOT NULL, CHANGE optedin optedin TINYINT(1) NOT NULL, CHANGE bouncecount bouncecount INT NOT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE uuid uuid VARCHAR(36) NOT NULL, CHANGE htmlemail htmlemail TINYINT(1) NOT NULL, CHANGE passwordchanged passwordchanged DATETIME DEFAULT NULL, CHANGE disabled disabled TINYINT(1) NOT NULL, CHANGE extradata extradata LONGTEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX idxuniqid TO phplist_user_user_idxuniqid'); $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX enteredindex TO phplist_user_user_enteredindex'); $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX confidx TO phplist_user_user_confidx'); @@ -94,11 +139,18 @@ public function up(Schema $schema): void $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX uuididx TO phplist_user_user_uuididx'); $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX foreignkey TO phplist_user_user_foreignkey'); $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX email TO phplist_user_user_email'); + $this->addSql('ALTER TABLE phplist_user_user_attribute CHANGE value value LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E310878C45AB5 FOREIGN KEY (attributeid) REFERENCES phplist_user_attribute (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E3108F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX attindex TO phplist_user_user_attribute_attindex'); $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX attuserid TO phplist_user_user_attribute_attuserid'); $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX userindex TO phplist_user_user_attribute_userindex'); + $this->addSql('ALTER TABLE phplist_user_user_history CHANGE detail detail LONGTEXT DEFAULT NULL, CHANGE systeminfo systeminfo LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_user_user_history ADD CONSTRAINT FK_6DBB605CF132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); $this->addSql('ALTER TABLE phplist_user_user_history RENAME INDEX dateidx TO phplist_user_user_history_dateidx'); $this->addSql('ALTER TABLE phplist_user_user_history RENAME INDEX userididx TO phplist_user_user_history_userididx'); + $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F469F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); + $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F46931478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id) ON DELETE CASCADE'); $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX enteredindex TO phplist_usermessage_enteredindex'); $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX messageidindex TO phplist_usermessage_messageidindex'); $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX statusidx TO phplist_usermessage_statusidx'); @@ -114,59 +166,105 @@ public function up(Schema $schema): void public function down(Schema $schema): void { $platform = $this->connection->getDatabasePlatform(); - $this->skipIf( - !$platform instanceof MySQLPlatform, - sprintf( - 'This migration is only applicable for MySQL. Current platform: %s', - get_class($platform) - ) - ); + $this->skipIf(!$platform instanceof MySQLPlatform, sprintf( + 'Unsupported platform for this migration: %s', + get_class($platform) + )); - // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE phplist_admin CHANGE created created DATETIME DEFAULT NULL, CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE disabled disabled TINYINT(1) DEFAULT 0, CHANGE superuser superuser TINYINT(1) DEFAULT 0, CHANGE privileges privileges TEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_admin RENAME INDEX phplist_admin_loginnameidx TO loginnameidx'); + $this->addSql('ALTER TABLE phplist_admin_attribute DROP FOREIGN KEY FK_58E07690D3B10C48'); + $this->addSql('ALTER TABLE phplist_admin_attribute DROP FOREIGN KEY FK_58E07690B8ED4D93'); + $this->addSql('DROP INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute'); + $this->addSql('DROP INDEX IDX_58E07690B8ED4D93 ON phplist_admin_attribute'); + $this->addSql('ALTER TABLE phplist_admin_login DROP FOREIGN KEY FK_5FCE0842B8ED4D93'); + $this->addSql('DROP INDEX IDX_5FCE0842B8ED4D93 ON phplist_admin_login'); + $this->addSql('ALTER TABLE phplist_admin_login CHANGE active active TINYINT(1) DEFAULT 0 NOT NULL'); + $this->addSql('ALTER TABLE phplist_admin_password_request DROP FOREIGN KEY FK_DC146F3B880E0D76'); + $this->addSql('DROP INDEX IDX_DC146F3B880E0D76 ON phplist_admin_password_request'); + $this->addSql('ALTER TABLE phplist_admin_password_request CHANGE id_key id_key INT AUTO_INCREMENT NOT NULL'); + $this->addSql('ALTER TABLE phplist_admintoken DROP FOREIGN KEY FK_CB15D477B8ED4D93'); + $this->addSql('DROP INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken'); + $this->addSql('ALTER TABLE phplist_admintoken CHANGE adminid adminid INT NOT NULL, CHANGE value value VARCHAR(255) DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_attachment CHANGE description description TEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_bounce DROP INDEX phplist_bounce_statusidx, ADD INDEX statusidx (status(20))'); + $this->addSql('ALTER TABLE phplist_bounce CHANGE header header TEXT DEFAULT NULL, CHANGE data data MEDIUMBLOB DEFAULT NULL, CHANGE comment comment TEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_bounce RENAME INDEX phplist_bounce_dateindex TO dateindex'); - $this->addSql('ALTER TABLE phplist_bounce RENAME INDEX phplist_bounce_statusidx TO statusidx'); + $this->addSql('ALTER TABLE phplist_bounceregex CHANGE regexhash regexhash CHAR(32) DEFAULT NULL, CHANGE comment comment TEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_bounceregex RENAME INDEX phplist_bounceregex_regex TO regex'); + $this->addSql('ALTER TABLE phplist_config CHANGE editable editable TINYINT(1) DEFAULT 1'); + $this->addSql('ALTER TABLE phplist_eventlog CHANGE entry entry TEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_eventlog RENAME INDEX phplist_eventlog_enteredidx TO enteredidx'); $this->addSql('ALTER TABLE phplist_eventlog RENAME INDEX phplist_eventlog_pageidx TO pageidx'); - $this->addSql('ALTER TABLE phplist_i18n RENAME INDEX phplist_i18n_lanorigunq TO lanorigunq'); + $this->addSql('ALTER TABLE phplist_linktrack CHANGE latestclick latestclick DATETIME DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX phplist_linktrack_miduidurlindex TO miduidurlindex'); $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX phplist_linktrack_midindex TO midindex'); $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX phplist_linktrack_uidindex TO uidindex'); $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX phplist_linktrack_urlindex TO urlindex'); $this->addSql('ALTER TABLE phplist_linktrack RENAME INDEX phplist_linktrack_miduidindex TO miduidindex'); + $this->addSql('ALTER TABLE phplist_linktrack_forward DROP INDEX phplist_linktrack_forward_urlindex, ADD INDEX urlindex (url(255))'); + $this->addSql('ALTER TABLE phplist_linktrack_forward CHANGE urlhash urlhash CHAR(32) DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX phplist_linktrack_forward_urlunique TO urlunique'); $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX phplist_linktrack_forward_uuididx TO uuididx'); - $this->addSql('ALTER TABLE phplist_linktrack_forward RENAME INDEX phplist_linktrack_forward_urlindex TO urlindex'); $this->addSql('ALTER TABLE phplist_linktrack_ml RENAME INDEX phplist_linktrack_ml_midindex TO midindex'); $this->addSql('ALTER TABLE phplist_linktrack_ml RENAME INDEX phplist_linktrack_ml_fwdindex TO fwdindex'); $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX phplist_linktrack_uml_click_miduidfwdid TO miduidfwdid'); $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX phplist_linktrack_uml_click_midindex TO midindex'); $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX phplist_linktrack_uml_click_uidindex TO uidindex'); $this->addSql('ALTER TABLE phplist_linktrack_uml_click RENAME INDEX phplist_linktrack_uml_click_miduidindex TO miduidindex'); + $this->addSql('DROP INDEX `primary` ON phplist_linktrack_userclick'); + $this->addSql('ALTER TABLE phplist_linktrack_userclick CHANGE data data TEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX phplist_linktrack_userclick_linkindex TO linkindex'); $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX phplist_linktrack_userclick_uidindex TO uidindex'); $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX phplist_linktrack_userclick_midindex TO midindex'); $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX phplist_linktrack_userclick_linkuserindex TO linkuserindex'); $this->addSql('ALTER TABLE phplist_linktrack_userclick RENAME INDEX phplist_linktrack_userclick_linkusermessageindex TO linkusermessageindex'); + $this->addSql('ALTER TABLE phplist_list DROP FOREIGN KEY FK_A4CE8621CF60E67C'); + $this->addSql('DROP INDEX IDX_A4CE8621CF60E67C ON phplist_list'); + $this->addSql('ALTER TABLE phplist_list CHANGE description description TEXT DEFAULT NULL, CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE active active TINYINT(1) DEFAULT NULL, CHANGE category category VARCHAR(255) DEFAULT \'\''); $this->addSql('ALTER TABLE phplist_list RENAME INDEX phplist_list_nameidx TO nameidx'); $this->addSql('ALTER TABLE phplist_list RENAME INDEX phplist_list_listorderidx TO listorderidx'); + $this->addSql('ALTER TABLE phplist_listmessage DROP FOREIGN KEY FK_83B22D7A31478478'); + $this->addSql('ALTER TABLE phplist_listmessage DROP FOREIGN KEY FK_83B22D7A8E44C1EF'); + $this->addSql('DROP INDEX IDX_83B22D7A31478478 ON phplist_listmessage'); + $this->addSql('DROP INDEX IDX_83B22D7A8E44C1EF ON phplist_listmessage'); + $this->addSql('ALTER TABLE phplist_listmessage CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); $this->addSql('ALTER TABLE phplist_listmessage RENAME INDEX phplist_listmessage_messageid TO messageid'); $this->addSql('ALTER TABLE phplist_listmessage RENAME INDEX phplist_listmessage_listmessageidx TO listmessageidx'); + $this->addSql('ALTER TABLE phplist_listuser DROP FOREIGN KEY FK_F467E411F132696E'); + $this->addSql('ALTER TABLE phplist_listuser DROP FOREIGN KEY FK_F467E4118E44C1EF'); + $this->addSql('DROP INDEX phplist_listuser_userlistenteredidx ON phplist_listuser'); + $this->addSql('ALTER TABLE phplist_listuser CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); + $this->addSql('CREATE INDEX userlistenteredidx ON phplist_listuser (userid, listid, entered)'); $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX phplist_listuser_userenteredidx TO userenteredidx'); $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX phplist_listuser_useridx TO useridx'); $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX phplist_listuser_listidx TO listidx'); - $this->addSql('ALTER TABLE phplist_listuser RENAME INDEX phplist_listuser_userlistenteredidx TO userlistenteredidx'); + $this->addSql('ALTER TABLE phplist_message DROP FOREIGN KEY FK_C5D81FCDCF60E67C'); + $this->addSql('ALTER TABLE phplist_message DROP FOREIGN KEY FK_C5D81FCD97601F83'); + $this->addSql('DROP INDEX IDX_C5D81FCDCF60E67C ON phplist_message'); + $this->addSql('DROP INDEX IDX_C5D81FCD97601F83 ON phplist_message'); + $this->addSql('ALTER TABLE phplist_message CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE htmlformatted htmlformatted TINYINT(1) DEFAULT 0, CHANGE astext astext INT DEFAULT 0, CHANGE ashtml ashtml INT DEFAULT 0, CHANGE aspdf aspdf INT DEFAULT 0, CHANGE astextandhtml astextandhtml INT DEFAULT 0, CHANGE astextandpdf astextandpdf INT DEFAULT 0, CHANGE processed processed INT UNSIGNED DEFAULT 0, CHANGE viewed viewed INT DEFAULT 0, CHANGE bouncecount bouncecount INT DEFAULT 0, CHANGE footer footer TEXT DEFAULT NULL, CHANGE userselection userselection TEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_message RENAME INDEX phplist_message_uuididx TO uuididx'); $this->addSql('ALTER TABLE phplist_message_attachment RENAME INDEX phplist_message_attachment_messageidx TO messageidx'); $this->addSql('ALTER TABLE phplist_message_attachment RENAME INDEX phplist_message_attachment_messageattidx TO messageattidx'); - $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`'); + $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT DEFAULT NULL'); + $this->addSql('ALTER TABLE phplist_sendprocess CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); + $this->addSql('ALTER TABLE phplist_subscribepage DROP FOREIGN KEY FK_5BAC7737CF60E67C'); + $this->addSql('DROP INDEX IDX_5BAC7737CF60E67C ON phplist_subscribepage'); + $this->addSql('ALTER TABLE phplist_subscribepage CHANGE active active TINYINT(1) DEFAULT 0'); + $this->addSql('ALTER TABLE phplist_subscribepage_data CHANGE data data TEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_template RENAME INDEX phplist_template_title TO title'); + $this->addSql('ALTER TABLE phplist_templateimage DROP FOREIGN KEY FK_30A85BA97601F83'); + $this->addSql('ALTER TABLE phplist_templateimage CHANGE template template INT DEFAULT 0 NOT NULL'); $this->addSql('ALTER TABLE phplist_templateimage RENAME INDEX phplist_templateimage_templateidx TO templateidx'); - $this->addSql('ALTER TABLE phplist_urlcache RENAME INDEX phplist_urlcache_urlindex TO urlindex'); + $this->addSql('ALTER TABLE phplist_urlcache DROP INDEX phplist_urlcache_urlindex, ADD INDEX urlindex (url(255))'); $this->addSql('ALTER TABLE phplist_user_attribute RENAME INDEX phplist_user_attribute_nameindex TO nameindex'); $this->addSql('ALTER TABLE phplist_user_attribute RENAME INDEX phplist_user_attribute_idnameindex TO idnameindex'); + $this->addSql('ALTER TABLE phplist_user_blacklist DROP INDEX `primary`, ADD UNIQUE INDEX email (email)'); $this->addSql('ALTER TABLE phplist_user_blacklist RENAME INDEX phplist_user_blacklist_emailidx TO emailidx'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data DROP INDEX `primary`, ADD UNIQUE INDEX email (email)'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data DROP FOREIGN KEY FK_6D67150CE7927C74'); + $this->addSql('ALTER TABLE phplist_user_blacklist_data CHANGE email email VARCHAR(150) NOT NULL, CHANGE data data TEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_user_blacklist_data RENAME INDEX phplist_user_blacklist_data_emailidx TO emailidx'); $this->addSql('ALTER TABLE phplist_user_blacklist_data RENAME INDEX phplist_user_blacklist_data_emailnameidx TO emailnameidx'); $this->addSql('ALTER TABLE phplist_user_message_bounce RENAME INDEX phplist_user_message_bounce_umbindex TO umbindex'); @@ -179,6 +277,7 @@ public function down(Schema $schema): void $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX phplist_user_message_view_usermsgidx TO usermsgidx'); $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX phplist_user_message_view_msgidx TO msgidx'); $this->addSql('ALTER TABLE phplist_user_message_view RENAME INDEX phplist_user_message_view_useridx TO useridx'); + $this->addSql('ALTER TABLE phplist_user_user CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE confirmed confirmed TINYINT(1) DEFAULT 0, CHANGE blacklisted blacklisted TINYINT(1) DEFAULT 0, CHANGE bouncecount bouncecount INT DEFAULT 0, CHANGE htmlemail htmlemail TINYINT(1) DEFAULT 0, CHANGE disabled disabled TINYINT(1) DEFAULT 0, CHANGE extradata extradata TEXT DEFAULT NULL, CHANGE optedin optedin TINYINT(1) DEFAULT 0, CHANGE uuid uuid VARCHAR(36) DEFAULT \'\', CHANGE passwordchanged passwordchanged DATE DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_email TO email'); $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_foreignkey TO foreignkey'); $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_idxuniqid TO idxuniqid'); @@ -187,11 +286,18 @@ public function down(Schema $schema): void $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_blidx TO blidx'); $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_optidx TO optidx'); $this->addSql('ALTER TABLE phplist_user_user RENAME INDEX phplist_user_user_uuididx TO uuididx'); + $this->addSql('ALTER TABLE phplist_user_user_attribute DROP FOREIGN KEY FK_E24E310878C45AB5'); + $this->addSql('ALTER TABLE phplist_user_user_attribute DROP FOREIGN KEY FK_E24E3108F132696E'); + $this->addSql('ALTER TABLE phplist_user_user_attribute CHANGE value value TEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX phplist_user_user_attribute_userindex TO userindex'); $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX phplist_user_user_attribute_attindex TO attindex'); $this->addSql('ALTER TABLE phplist_user_user_attribute RENAME INDEX phplist_user_user_attribute_attuserid TO attuserid'); + $this->addSql('ALTER TABLE phplist_user_user_history DROP FOREIGN KEY FK_6DBB605CF132696E'); + $this->addSql('ALTER TABLE phplist_user_user_history CHANGE detail detail TEXT DEFAULT NULL, CHANGE systeminfo systeminfo TEXT DEFAULT NULL'); $this->addSql('ALTER TABLE phplist_user_user_history RENAME INDEX phplist_user_user_history_userididx TO userididx'); $this->addSql('ALTER TABLE phplist_user_user_history RENAME INDEX phplist_user_user_history_dateidx TO dateidx'); + $this->addSql('ALTER TABLE phplist_usermessage DROP FOREIGN KEY FK_7F30F469F132696E'); + $this->addSql('ALTER TABLE phplist_usermessage DROP FOREIGN KEY FK_7F30F46931478478'); $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX phplist_usermessage_messageidindex TO messageidindex'); $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX phplist_usermessage_useridindex TO useridindex'); $this->addSql('ALTER TABLE phplist_usermessage RENAME INDEX phplist_usermessage_enteredindex TO enteredindex'); diff --git a/src/Migrations/Version20251029105320MySqlRelations.php b/src/Migrations/Version20251029105320MySqlRelations.php deleted file mode 100644 index 2b540997..00000000 --- a/src/Migrations/Version20251029105320MySqlRelations.php +++ /dev/null @@ -1,192 +0,0 @@ -connection->getDatabasePlatform(); - $this->skipIf( - !$platform instanceof MySQLPlatform, - sprintf( - 'This migration is only applicable for MySQL. Current platform: %s', - get_class($platform) - ) - ); - - // this up() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE phplist_admin CHANGE modified modified DATETIME NOT NULL, CHANGE superuser superuser TINYINT(1) NOT NULL, CHANGE disabled disabled TINYINT(1) NOT NULL, CHANGE privileges privileges LONGTEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690D3B10C48 FOREIGN KEY (adminattributeid) REFERENCES phplist_adminattribute (id)'); - $this->addSql('ALTER TABLE phplist_admin_attribute ADD CONSTRAINT FK_58E07690B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id)'); - $this->addSql('CREATE INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute (adminattributeid)'); - $this->addSql('CREATE INDEX IDX_58E07690B8ED4D93 ON phplist_admin_attribute (adminid)'); - $this->addSql('ALTER TABLE phplist_admin_login CHANGE active active TINYINT(1) NOT NULL'); - $this->addSql('ALTER TABLE phplist_admin_login ADD CONSTRAINT FK_5FCE0842B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id)'); - $this->addSql('CREATE INDEX IDX_5FCE0842B8ED4D93 ON phplist_admin_login (adminid)'); - $this->addSql('ALTER TABLE phplist_admin_password_request CHANGE id_key id_key INT UNSIGNED AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE phplist_admin_password_request ADD CONSTRAINT FK_DC146F3B880E0D76 FOREIGN KEY (`admin`) REFERENCES phplist_admin (id)'); - $this->addSql('CREATE INDEX IDX_DC146F3B880E0D76 ON phplist_admin_password_request (`admin`)'); - $this->addSql('ALTER TABLE phplist_admintoken CHANGE adminid adminid INT DEFAULT NULL, CHANGE value value VARCHAR(255) NOT NULL'); - $this->addSql('ALTER TABLE phplist_admintoken ADD CONSTRAINT FK_CB15D477B8ED4D93 FOREIGN KEY (adminid) REFERENCES phplist_admin (id) ON DELETE CASCADE'); - $this->addSql('CREATE INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken (adminid)'); - $this->addSql('ALTER TABLE phplist_attachment CHANGE description description LONGTEXT DEFAULT NULL'); - $this->addSql('DROP INDEX statusidx ON phplist_bounce'); - $this->addSql('ALTER TABLE phplist_bounce CHANGE header header LONGTEXT DEFAULT NULL, CHANGE data data LONGBLOB DEFAULT NULL, CHANGE status status VARCHAR(20) DEFAULT NULL, CHANGE comment comment LONGTEXT DEFAULT NULL'); - $this->addSql('CREATE INDEX statusidx ON phplist_bounce (status)'); - $this->addSql('ALTER TABLE phplist_bounceregex CHANGE regexhash regexhash VARCHAR(32) DEFAULT NULL, CHANGE comment comment LONGTEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_config CHANGE editable editable TINYINT(1) DEFAULT 1 NOT NULL'); - $this->addSql('ALTER TABLE phplist_eventlog CHANGE entry entry LONGTEXT DEFAULT NULL'); - $this->addSql('DROP INDEX lanorigidx ON phplist_i18n'); - $this->addSql('DROP INDEX lanorigunq ON phplist_i18n'); - $this->addSql('ALTER TABLE phplist_i18n CHANGE original original VARCHAR(255) NOT NULL, CHANGE translation translation LONGTEXT NOT NULL, ADD PRIMARY KEY (lan, original)'); - $this->addSql('CREATE UNIQUE INDEX lanorigunq ON phplist_i18n (lan, original)'); - $this->addSql('ALTER TABLE phplist_linktrack CHANGE latestclick latestclick DATETIME NOT NULL'); - $this->addSql('DROP INDEX urlindex ON phplist_linktrack_forward'); - $this->addSql('ALTER TABLE phplist_linktrack_forward CHANGE url url VARCHAR(255) DEFAULT NULL, CHANGE urlhash urlhash VARCHAR(32) DEFAULT NULL'); - $this->addSql('CREATE INDEX urlindex ON phplist_linktrack_forward (url)'); - $this->addSql('ALTER TABLE phplist_linktrack_userclick CHANGE data data LONGTEXT DEFAULT NULL, ADD PRIMARY KEY (linkid, userid, messageid)'); - $this->addSql('ALTER TABLE phplist_list CHANGE description description VARCHAR(255) NOT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE active active TINYINT(1) NOT NULL, CHANGE category category VARCHAR(255) NOT NULL'); - $this->addSql('ALTER TABLE phplist_list ADD CONSTRAINT FK_A4CE8621CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); - $this->addSql('CREATE INDEX IDX_A4CE8621CF60E67C ON phplist_list (owner)'); - $this->addSql('ALTER TABLE phplist_listmessage CHANGE modified modified DATETIME NOT NULL'); - $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A31478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id)'); - $this->addSql('ALTER TABLE phplist_listmessage ADD CONSTRAINT FK_83B22D7A8E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id)'); - $this->addSql('CREATE INDEX IDX_83B22D7A31478478 ON phplist_listmessage (messageid)'); - $this->addSql('CREATE INDEX IDX_83B22D7A8E44C1EF ON phplist_listmessage (listid)'); - $this->addSql('DROP INDEX userlistenteredidx ON phplist_listuser'); - $this->addSql('ALTER TABLE phplist_listuser CHANGE modified modified DATETIME NOT NULL'); - $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E411F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id)'); - $this->addSql('ALTER TABLE phplist_listuser ADD CONSTRAINT FK_F467E4118E44C1EF FOREIGN KEY (listid) REFERENCES phplist_list (id) ON DELETE CASCADE'); - $this->addSql('CREATE INDEX userlistenteredidx ON phplist_listuser (userid, entered, listid)'); - $this->addSql('ALTER TABLE phplist_message CHANGE subject subject VARCHAR(255) DEFAULT \'(no subject)\' NOT NULL, CHANGE message message LONGTEXT DEFAULT NULL, CHANGE textmessage textmessage LONGTEXT DEFAULT NULL, CHANGE footer footer LONGTEXT DEFAULT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE userselection userselection LONGTEXT DEFAULT NULL, CHANGE htmlformatted htmlformatted TINYINT(1) NOT NULL, CHANGE processed processed TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astext astext TINYINT(1) DEFAULT 0 NOT NULL, CHANGE ashtml ashtml TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astextandhtml astextandhtml TINYINT(1) DEFAULT 0 NOT NULL, CHANGE aspdf aspdf TINYINT(1) DEFAULT 0 NOT NULL, CHANGE astextandpdf astextandpdf TINYINT(1) DEFAULT 0 NOT NULL, CHANGE viewed viewed INT DEFAULT 0 NOT NULL, CHANGE bouncecount bouncecount INT DEFAULT 0 NOT NULL'); - $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCDCF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); - $this->addSql('ALTER TABLE phplist_message ADD CONSTRAINT FK_C5D81FCD97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id) ON DELETE SET NULL'); - $this->addSql('CREATE INDEX IDX_C5D81FCDCF60E67C ON phplist_message (owner)'); - $this->addSql('CREATE INDEX IDX_C5D81FCD97601F83 ON phplist_message (template)'); - $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_sendprocess CHANGE modified modified DATETIME NOT NULL'); - $this->addSql('ALTER TABLE phplist_subscribepage CHANGE active active TINYINT(1) DEFAULT 0 NOT NULL'); - $this->addSql('ALTER TABLE phplist_subscribepage ADD CONSTRAINT FK_5BAC7737CF60E67C FOREIGN KEY (owner) REFERENCES phplist_admin (id)'); - $this->addSql('CREATE INDEX IDX_5BAC7737CF60E67C ON phplist_subscribepage (owner)'); - $this->addSql('ALTER TABLE phplist_subscribepage_data CHANGE data data LONGTEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_templateimage CHANGE template template INT NOT NULL'); - $this->addSql('ALTER TABLE phplist_templateimage ADD CONSTRAINT FK_30A85BA97601F83 FOREIGN KEY (template) REFERENCES phplist_template (id)'); - $this->addSql('DROP INDEX urlindex ON phplist_urlcache'); - $this->addSql('ALTER TABLE phplist_urlcache CHANGE url url VARCHAR(255) NOT NULL'); - $this->addSql('CREATE INDEX urlindex ON phplist_urlcache (url)'); - $this->addSql('DROP INDEX email ON phplist_user_blacklist'); - $this->addSql('ALTER TABLE phplist_user_blacklist ADD PRIMARY KEY (email)'); - $this->addSql('DROP INDEX email ON phplist_user_blacklist_data'); - $this->addSql('ALTER TABLE phplist_user_blacklist_data CHANGE email email VARCHAR(255) NOT NULL, CHANGE data data LONGTEXT DEFAULT NULL, ADD PRIMARY KEY (email)'); - $this->addSql('ALTER TABLE phplist_user_blacklist_data ADD CONSTRAINT FK_6D67150CE7927C74 FOREIGN KEY (email) REFERENCES phplist_user_blacklist (email) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE phplist_user_user CHANGE confirmed confirmed TINYINT(1) NOT NULL, CHANGE blacklisted blacklisted TINYINT(1) NOT NULL, CHANGE optedin optedin TINYINT(1) NOT NULL, CHANGE bouncecount bouncecount INT NOT NULL, CHANGE modified modified DATETIME NOT NULL, CHANGE uuid uuid VARCHAR(36) NOT NULL, CHANGE htmlemail htmlemail TINYINT(1) NOT NULL, CHANGE passwordchanged passwordchanged DATETIME DEFAULT NULL, CHANGE disabled disabled TINYINT(1) NOT NULL, CHANGE extradata extradata LONGTEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_user_user_attribute CHANGE value value LONGTEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E310878C45AB5 FOREIGN KEY (attributeid) REFERENCES phplist_user_attribute (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE phplist_user_user_attribute ADD CONSTRAINT FK_E24E3108F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE phplist_user_user_history CHANGE detail detail LONGTEXT DEFAULT NULL, CHANGE systeminfo systeminfo LONGTEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_user_user_history ADD CONSTRAINT FK_6DBB605CF132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F469F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE'); - $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F46931478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id) ON DELETE CASCADE'); - } - - public function down(Schema $schema): void - { - $platform = $this->connection->getDatabasePlatform(); - $this->skipIf( - !$platform instanceof MySQLPlatform, - sprintf( - 'This migration is only applicable for MySQL. Current platform: %s', - get_class($platform) - ) - ); - - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE phplist_admin CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE disabled disabled TINYINT(1) DEFAULT 0, CHANGE superuser superuser TINYINT(1) DEFAULT 0, CHANGE privileges privileges TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_admin_attribute DROP FOREIGN KEY FK_58E07690D3B10C48'); - $this->addSql('ALTER TABLE phplist_admin_attribute DROP FOREIGN KEY FK_58E07690B8ED4D93'); - $this->addSql('DROP INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute'); - $this->addSql('DROP INDEX IDX_58E07690B8ED4D93 ON phplist_admin_attribute'); - $this->addSql('ALTER TABLE phplist_admin_login DROP FOREIGN KEY FK_5FCE0842B8ED4D93'); - $this->addSql('DROP INDEX IDX_5FCE0842B8ED4D93 ON phplist_admin_login'); - $this->addSql('ALTER TABLE phplist_admin_login CHANGE active active TINYINT(1) DEFAULT 0 NOT NULL'); - $this->addSql('ALTER TABLE phplist_admin_password_request DROP FOREIGN KEY FK_DC146F3B880E0D76'); - $this->addSql('DROP INDEX IDX_DC146F3B880E0D76 ON phplist_admin_password_request'); - $this->addSql('ALTER TABLE phplist_admin_password_request CHANGE id_key id_key INT AUTO_INCREMENT NOT NULL'); - $this->addSql('ALTER TABLE phplist_admintoken DROP FOREIGN KEY FK_CB15D477B8ED4D93'); - $this->addSql('DROP INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken'); - $this->addSql('ALTER TABLE phplist_admintoken CHANGE adminid adminid INT NOT NULL, CHANGE value value VARCHAR(255) DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_attachment CHANGE description description TEXT DEFAULT NULL'); - $this->addSql('DROP INDEX statusidx ON phplist_bounce'); - $this->addSql('ALTER TABLE phplist_bounce CHANGE header header TEXT DEFAULT NULL, CHANGE data data MEDIUMBLOB DEFAULT NULL, CHANGE status status VARCHAR(255) DEFAULT NULL, CHANGE comment comment TEXT DEFAULT NULL'); - $this->addSql('CREATE INDEX statusidx ON phplist_bounce (status(20))'); - $this->addSql('ALTER TABLE phplist_bounceregex CHANGE regexhash regexhash CHAR(32) DEFAULT NULL, CHANGE comment comment TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_config CHANGE editable editable TINYINT(1) DEFAULT 1'); - $this->addSql('ALTER TABLE phplist_eventlog CHANGE entry entry TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_i18n DROP INDEX primary, ADD INDEX lanorigidx (lan, original(200))'); - $this->addSql('DROP INDEX lanorigunq ON phplist_i18n'); - $this->addSql('ALTER TABLE phplist_i18n CHANGE original original TEXT NOT NULL, CHANGE translation translation TEXT NOT NULL'); - $this->addSql('CREATE UNIQUE INDEX lanorigunq ON phplist_i18n (lan, original(200))'); - $this->addSql('ALTER TABLE phplist_linktrack CHANGE latestclick latestclick DATETIME DEFAULT NULL'); - $this->addSql('DROP INDEX urlindex ON phplist_linktrack_forward'); - $this->addSql('ALTER TABLE phplist_linktrack_forward CHANGE url url VARCHAR(2083) DEFAULT NULL, CHANGE urlhash urlhash CHAR(32) DEFAULT NULL'); - $this->addSql('CREATE INDEX urlindex ON phplist_linktrack_forward (url(255))'); - $this->addSql('DROP INDEX `primary` ON phplist_linktrack_userclick'); - $this->addSql('ALTER TABLE phplist_linktrack_userclick CHANGE data data TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_list DROP FOREIGN KEY FK_A4CE8621CF60E67C'); - $this->addSql('DROP INDEX IDX_A4CE8621CF60E67C ON phplist_list'); - $this->addSql('ALTER TABLE phplist_list CHANGE description description TEXT DEFAULT NULL, CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE active active TINYINT(1) DEFAULT NULL, CHANGE category category VARCHAR(255) DEFAULT \'\''); - $this->addSql('ALTER TABLE phplist_listmessage DROP FOREIGN KEY FK_83B22D7A31478478'); - $this->addSql('ALTER TABLE phplist_listmessage DROP FOREIGN KEY FK_83B22D7A8E44C1EF'); - $this->addSql('DROP INDEX IDX_83B22D7A31478478 ON phplist_listmessage'); - $this->addSql('DROP INDEX IDX_83B22D7A8E44C1EF ON phplist_listmessage'); - $this->addSql('ALTER TABLE phplist_listmessage CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); - $this->addSql('ALTER TABLE phplist_listuser DROP FOREIGN KEY FK_F467E411F132696E'); - $this->addSql('ALTER TABLE phplist_listuser DROP FOREIGN KEY FK_F467E4118E44C1EF'); - $this->addSql('DROP INDEX userlistenteredidx ON phplist_listuser'); - $this->addSql('ALTER TABLE phplist_listuser CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); - $this->addSql('CREATE INDEX userlistenteredidx ON phplist_listuser (userid, listid, entered)'); - $this->addSql('ALTER TABLE phplist_message DROP FOREIGN KEY FK_C5D81FCDCF60E67C'); - $this->addSql('ALTER TABLE phplist_message DROP FOREIGN KEY FK_C5D81FCD97601F83'); - $this->addSql('DROP INDEX IDX_C5D81FCDCF60E67C ON phplist_message'); - $this->addSql('DROP INDEX IDX_C5D81FCD97601F83 ON phplist_message'); - $this->addSql('ALTER TABLE phplist_message CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE htmlformatted htmlformatted TINYINT(1) DEFAULT 0, CHANGE astext astext INT DEFAULT 0, CHANGE ashtml ashtml INT DEFAULT 0, CHANGE aspdf aspdf INT DEFAULT 0, CHANGE astextandhtml astextandhtml INT DEFAULT 0, CHANGE astextandpdf astextandpdf INT DEFAULT 0, CHANGE processed processed INT UNSIGNED DEFAULT 0, CHANGE viewed viewed INT DEFAULT 0, CHANGE bouncecount bouncecount INT DEFAULT 0, CHANGE subject subject VARCHAR(255) CHARACTER SET utf8mb4 DEFAULT \'(no subject)\' NOT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE message message LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE textmessage textmessage LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`, CHANGE footer footer TEXT DEFAULT NULL, CHANGE userselection userselection TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_messagedata CHANGE data data LONGTEXT CHARACTER SET utf8mb4 DEFAULT NULL COLLATE `utf8mb4_0900_ai_ci`'); - $this->addSql('ALTER TABLE phplist_sendprocess CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL'); - $this->addSql('ALTER TABLE phplist_subscribepage DROP FOREIGN KEY FK_5BAC7737CF60E67C'); - $this->addSql('DROP INDEX IDX_5BAC7737CF60E67C ON phplist_subscribepage'); - $this->addSql('ALTER TABLE phplist_subscribepage CHANGE active active TINYINT(1) DEFAULT 0'); - $this->addSql('ALTER TABLE phplist_subscribepage_data CHANGE data data TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_templateimage DROP FOREIGN KEY FK_30A85BA97601F83'); - $this->addSql('ALTER TABLE phplist_templateimage CHANGE template template INT DEFAULT 0 NOT NULL'); - $this->addSql('DROP INDEX urlindex ON phplist_urlcache'); - $this->addSql('ALTER TABLE phplist_urlcache CHANGE url url VARCHAR(2083) NOT NULL'); - $this->addSql('CREATE INDEX urlindex ON phplist_urlcache (url(255))'); - $this->addSql('ALTER TABLE phplist_user_blacklist DROP INDEX primary, ADD UNIQUE INDEX email (email)'); - $this->addSql('ALTER TABLE phplist_user_blacklist_data DROP INDEX primary, ADD UNIQUE INDEX email (email)'); - $this->addSql('ALTER TABLE phplist_user_blacklist_data DROP FOREIGN KEY FK_6D67150CE7927C74'); - $this->addSql('ALTER TABLE phplist_user_blacklist_data CHANGE email email VARCHAR(150) NOT NULL, CHANGE data data TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_user_user CHANGE modified modified DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL, CHANGE confirmed confirmed TINYINT(1) DEFAULT 0, CHANGE blacklisted blacklisted TINYINT(1) DEFAULT 0, CHANGE bouncecount bouncecount INT DEFAULT 0, CHANGE htmlemail htmlemail TINYINT(1) DEFAULT 0, CHANGE disabled disabled TINYINT(1) DEFAULT 0, CHANGE extradata extradata TEXT DEFAULT NULL, CHANGE optedin optedin TINYINT(1) DEFAULT 0, CHANGE uuid uuid VARCHAR(36) DEFAULT \'\', CHANGE passwordchanged passwordchanged DATE DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_user_user_attribute DROP FOREIGN KEY FK_E24E310878C45AB5'); - $this->addSql('ALTER TABLE phplist_user_user_attribute DROP FOREIGN KEY FK_E24E3108F132696E'); - $this->addSql('ALTER TABLE phplist_user_user_attribute CHANGE value value TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_user_user_history DROP FOREIGN KEY FK_6DBB605CF132696E'); - $this->addSql('ALTER TABLE phplist_user_user_history CHANGE detail detail TEXT DEFAULT NULL, CHANGE systeminfo systeminfo TEXT DEFAULT NULL'); - $this->addSql('ALTER TABLE phplist_usermessage DROP FOREIGN KEY FK_7F30F469F132696E'); - $this->addSql('ALTER TABLE phplist_usermessage DROP FOREIGN KEY FK_7F30F46931478478'); - } -} diff --git a/src/Migrations/Version20251030081120PostgreSqlPlatform.php b/src/Migrations/Version20251031072945PostGreInit.php similarity index 74% rename from src/Migrations/Version20251030081120PostgreSqlPlatform.php rename to src/Migrations/Version20251031072945PostGreInit.php index ca189fa4..6963ca14 100644 --- a/src/Migrations/Version20251030081120PostgreSqlPlatform.php +++ b/src/Migrations/Version20251031072945PostGreInit.php @@ -5,31 +5,61 @@ namespace PhpList\Core\Migrations; use Doctrine\DBAL\Platforms\PostgreSQLPlatform; -use Doctrine\DBAL\Schema\Schema; +use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\Migrations\AbstractMigration; +use Doctrine\DBAL\Schema\Schema; /** - * Auto-generated Migration: Please modify to your needs! - */ -final class Version20251030081120PostgreSqlPlatform extends AbstractMigration +* ⚠️ Wizard warning: +* Doctrine will `helpfully` remove url(255) prefixes and add collations 5.7 can’t read. +* Review the SQL unless you enjoy debugging key length errors at 2 AM. +* +* Ex: phplist_linktrack_forward phplist_linktrack_forward_urlindex (but there are more) +*/ +final class Version20251031072945PostGreInit extends AbstractMigration { public function getDescription(): string { - return 'PostgreSql platform migration according to current Entity state'; + return ''; } public function up(Schema $schema): void { $platform = $this->connection->getDatabasePlatform(); - $this->skipIf( - !$platform instanceof PostgreSqlPlatform, - sprintf( - 'This migration is only applicable for PostgreSql. Current platform: %s', - get_class($platform) - ) - ); - // this up() migration is auto-generated, please modify it to your needs - $this->addSql('CREATE TABLE phplist_admin (id INT NOT NULL, created TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, loginname VARCHAR(66) NOT NULL, namelc VARCHAR(255) DEFAULT NULL, email VARCHAR(255) NOT NULL, modifiedby VARCHAR(66) DEFAULT NULL, password VARCHAR(255) DEFAULT NULL, passwordchanged DATE DEFAULT NULL, disabled BOOLEAN NOT NULL, superuser BOOLEAN NOT NULL, privileges TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->skipIf(!$platform instanceof PostgreSQLPlatform, sprintf( + 'Unsupported platform for this migration: %s', + get_class($platform) + )); + + $this->addSql('CREATE SEQUENCE phplist_admin_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_admin_login_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_admin_password_request_id_key_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_adminattribute_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_admintoken_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_attachment_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_bounce_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_bounceregex_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_eventlog_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_linktrack_linkid_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_linktrack_forward_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_linktrack_uml_click_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_list_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_listmessage_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_message_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_message_attachment_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_sendprocess_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_subscribepage_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_template_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_templateimage_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_urlcache_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_user_attribute_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_user_message_bounce_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_user_message_forward_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_user_message_view_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_user_user_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_user_user_history_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE SEQUENCE phplist_userstats_id_seq INCREMENT BY 1 MINVALUE 1 START 1'); + $this->addSql('CREATE TABLE phplist_admin (id INT NOT NULL, created TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, loginname VARCHAR(66) NOT NULL, namelc VARCHAR(255) DEFAULT NULL, email VARCHAR(255) NOT NULL, modifiedby VARCHAR(66) DEFAULT NULL, password VARCHAR(255) DEFAULT NULL, passwordchanged DATE DEFAULT NULL, disabled BOOLEAN NOT NULL, superuser BOOLEAN NOT NULL, privileges TEXT DEFAULT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE UNIQUE INDEX phplist_admin_loginnameidx ON phplist_admin (loginname)'); $this->addSql('CREATE TABLE phplist_admin_attribute (adminattributeid INT NOT NULL, adminid INT NOT NULL, value VARCHAR(255) DEFAULT NULL, PRIMARY KEY(adminattributeid, adminid))'); $this->addSql('CREATE INDEX IDX_58E07690D3B10C48 ON phplist_admin_attribute (adminattributeid)'); @@ -42,7 +72,7 @@ public function up(Schema $schema): void $this->addSql('CREATE TABLE phplist_admintoken (id INT NOT NULL, adminid INT DEFAULT NULL, entered INT NOT NULL, expires TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, value VARCHAR(255) NOT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE INDEX IDX_CB15D477B8ED4D93 ON phplist_admintoken (adminid)'); $this->addSql('CREATE TABLE phplist_attachment (id INT NOT NULL, filename VARCHAR(255) DEFAULT NULL, remotefile VARCHAR(255) DEFAULT NULL, mimetype VARCHAR(255) DEFAULT NULL, description TEXT DEFAULT NULL, size INT DEFAULT NULL, PRIMARY KEY(id))'); - $this->addSql('CREATE TABLE phplist_bounce (id INT NOT NULL, date TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, header TEXT DEFAULT NULL, data BYTEA DEFAULT NULL, status VARCHAR(20) DEFAULT NULL, comment TEXT DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE phplist_bounce (id INT NOT NULL, date TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, header TEXT DEFAULT NULL, data BYTEA DEFAULT NULL, status VARCHAR(255) DEFAULT NULL, comment TEXT DEFAULT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE INDEX phplist_bounce_dateindex ON phplist_bounce (date)'); $this->addSql('CREATE INDEX phplist_bounce_statusidx ON phplist_bounce (status)'); $this->addSql('CREATE TABLE phplist_bounceregex (id INT NOT NULL, regex VARCHAR(2083) DEFAULT NULL, regexhash VARCHAR(32) DEFAULT NULL, action VARCHAR(255) DEFAULT NULL, listorder INT DEFAULT 0, admin INT DEFAULT NULL, comment TEXT DEFAULT NULL, status VARCHAR(255) DEFAULT NULL, count INT DEFAULT 0, PRIMARY KEY(id))'); @@ -60,7 +90,7 @@ public function up(Schema $schema): void $this->addSql('CREATE INDEX phplist_linktrack_uidindex ON phplist_linktrack (userid)'); $this->addSql('CREATE INDEX phplist_linktrack_urlindex ON phplist_linktrack (url)'); $this->addSql('CREATE UNIQUE INDEX phplist_linktrack_miduidurlindex ON phplist_linktrack (messageid, userid, url)'); - $this->addSql('CREATE TABLE phplist_linktrack_forward (id INT NOT NULL, url VARCHAR(255) DEFAULT NULL, urlhash VARCHAR(32) DEFAULT NULL, uuid VARCHAR(36) DEFAULT \'\', personalise BOOLEAN DEFAULT false, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE phplist_linktrack_forward (id INT NOT NULL, url VARCHAR(2083) DEFAULT NULL, urlhash VARCHAR(32) DEFAULT NULL, uuid VARCHAR(36) DEFAULT \'\', personalise BOOLEAN DEFAULT false, PRIMARY KEY(id))'); $this->addSql('CREATE INDEX phplist_linktrack_forward_urlindex ON phplist_linktrack_forward (url)'); $this->addSql('CREATE INDEX phplist_linktrack_forward_uuididx ON phplist_linktrack_forward (uuid)'); $this->addSql('CREATE UNIQUE INDEX phplist_linktrack_forward_urlunique ON phplist_linktrack_forward (urlhash)'); @@ -92,7 +122,7 @@ public function up(Schema $schema): void $this->addSql('CREATE INDEX phplist_listuser_userlistenteredidx ON phplist_listuser (userid, entered, listid)'); $this->addSql('CREATE INDEX phplist_listuser_useridx ON phplist_listuser (userid)'); $this->addSql('CREATE INDEX phplist_listuser_listidx ON phplist_listuser (listid)'); - $this->addSql('CREATE TABLE phplist_message (id INT NOT NULL, owner INT DEFAULT NULL, template INT DEFAULT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, uuid VARCHAR(36) DEFAULT \'\', htmlformatted BOOLEAN NOT NULL, sendformat VARCHAR(20) DEFAULT NULL, astext BOOLEAN DEFAULT false NOT NULL, ashtml BOOLEAN DEFAULT false NOT NULL, aspdf BOOLEAN DEFAULT false NOT NULL, astextandhtml BOOLEAN DEFAULT false NOT NULL, astextandpdf BOOLEAN DEFAULT false NOT NULL, repeatinterval INT DEFAULT 0, repeatuntil TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, requeueinterval INT DEFAULT 0, requeueuntil TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, embargo TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, status VARCHAR(255) DEFAULT NULL, processed BOOLEAN DEFAULT false NOT NULL, viewed INT DEFAULT 0 NOT NULL, bouncecount INT DEFAULT 0 NOT NULL, entered TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, sent TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, sendstart TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, subject VARCHAR(255) DEFAULT \'(no subject)\' NOT NULL, message TEXT DEFAULT NULL, textmessage TEXT DEFAULT NULL, footer TEXT DEFAULT NULL, fromfield VARCHAR(255) DEFAULT \'\' NOT NULL, tofield VARCHAR(255) DEFAULT \'\' NOT NULL, replyto VARCHAR(255) DEFAULT \'\' NOT NULL, userselection TEXT DEFAULT NULL, rsstemplate VARCHAR(100) DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE phplist_message (id INT NOT NULL, owner INT DEFAULT NULL, template INT DEFAULT NULL, modified TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, uuid VARCHAR(36) DEFAULT \'\', htmlformatted BOOLEAN NOT NULL, sendformat VARCHAR(20) DEFAULT NULL, astext BOOLEAN NOT NULL, ashtml BOOLEAN NOT NULL, aspdf BOOLEAN NOT NULL, astextandhtml BOOLEAN NOT NULL, astextandpdf BOOLEAN NOT NULL, repeatinterval INT DEFAULT 0, repeatuntil TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, requeueinterval INT DEFAULT 0, requeueuntil TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, embargo TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, status VARCHAR(255) DEFAULT NULL, processed BOOLEAN DEFAULT false NOT NULL, viewed INT DEFAULT 0 NOT NULL, bouncecount INT DEFAULT 0 NOT NULL, entered TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, sent TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, sendstart TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, subject VARCHAR(255) DEFAULT \'(no subject)\' NOT NULL, message TEXT DEFAULT NULL, textmessage TEXT DEFAULT NULL, footer TEXT DEFAULT NULL, fromfield VARCHAR(255) DEFAULT \'\' NOT NULL, tofield VARCHAR(255) DEFAULT \'\' NOT NULL, replyto VARCHAR(255) DEFAULT \'\' NOT NULL, userselection TEXT DEFAULT NULL, rsstemplate VARCHAR(100) DEFAULT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE INDEX IDX_C5D81FCDCF60E67C ON phplist_message (owner)'); $this->addSql('CREATE INDEX IDX_C5D81FCD97601F83 ON phplist_message (template)'); $this->addSql('CREATE INDEX phplist_message_uuididx ON phplist_message (uuid)'); @@ -108,7 +138,7 @@ public function up(Schema $schema): void $this->addSql('CREATE UNIQUE INDEX phplist_template_title ON phplist_template (title)'); $this->addSql('CREATE TABLE phplist_templateimage (id INT NOT NULL, template INT NOT NULL, mimetype VARCHAR(100) DEFAULT NULL, filename VARCHAR(100) DEFAULT NULL, data BYTEA DEFAULT NULL, width INT DEFAULT NULL, height INT DEFAULT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE INDEX phplist_templateimage_templateidx ON phplist_templateimage (template)'); - $this->addSql('CREATE TABLE phplist_urlcache (id INT NOT NULL, url VARCHAR(255) NOT NULL, lastmodified INT DEFAULT NULL, added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, content BYTEA DEFAULT NULL, PRIMARY KEY(id))'); + $this->addSql('CREATE TABLE phplist_urlcache (id INT NOT NULL, url VARCHAR(2083) NOT NULL, lastmodified INT DEFAULT NULL, added TIMESTAMP(0) WITHOUT TIME ZONE DEFAULT NULL, content BYTEA DEFAULT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE INDEX phplist_urlcache_urlindex ON phplist_urlcache (url)'); $this->addSql('CREATE TABLE phplist_user_attribute (id INT NOT NULL, name VARCHAR(255) NOT NULL, type VARCHAR(30) DEFAULT NULL, listorder INT DEFAULT NULL, default_value VARCHAR(255) DEFAULT NULL, required BOOLEAN DEFAULT NULL, tablename VARCHAR(255) DEFAULT NULL, PRIMARY KEY(id))'); $this->addSql('CREATE INDEX phplist_user_attribute_idnameindex ON phplist_user_attribute (id, name)'); @@ -179,19 +209,56 @@ public function up(Schema $schema): void $this->addSql('ALTER TABLE phplist_user_user_history ADD CONSTRAINT FK_6DBB605CF132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F469F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F46931478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + + $sm = $this->connection->createSchemaManager(); + if ($sm->tablesExist(['feed'])) { + $this->addSql('ALTER TABLE feed ALTER id DROP DEFAULT'); + $this->addSql('ALTER TABLE feed ALTER etag DROP DEFAULT'); + $this->addSql('ALTER TABLE feed ALTER lastmodified DROP DEFAULT'); + $this->addSql('ALTER TABLE item ALTER id DROP DEFAULT'); + $this->addSql('ALTER TABLE item_data DROP CONSTRAINT fk_itemdata_item'); + $this->addSql('ALTER TABLE item_data ALTER value SET NOT NULL'); + $this->addSql('ALTER TABLE item_data ADD CONSTRAINT FK_65C3B798207C93D3 FOREIGN KEY (itemid) REFERENCES item (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); + } } public function down(Schema $schema): void { $platform = $this->connection->getDatabasePlatform(); - $this->skipIf( - !$platform instanceof PostgreSqlPlatform, - sprintf( - 'This migration is only applicable for PostgreSql. Current platform: %s', - get_class($platform) - ) - ); - // this down() migration is auto-generated, please modify it to your needs + $this->skipIf(!$platform instanceof PostgreSQLPlatform, sprintf( + 'Unsupported platform for this migration: %s', + get_class($platform) + )); + + $this->addSql('CREATE SCHEMA public'); + $this->addSql('DROP SEQUENCE phplist_admin_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_admin_login_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_admin_password_request_id_key_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_adminattribute_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_admintoken_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_attachment_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_bounce_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_bounceregex_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_eventlog_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_linktrack_linkid_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_linktrack_forward_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_linktrack_uml_click_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_list_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_listmessage_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_message_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_message_attachment_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_sendprocess_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_subscribepage_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_template_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_templateimage_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_urlcache_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_user_attribute_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_user_message_bounce_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_user_message_forward_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_user_message_view_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_user_user_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_user_user_history_id_seq CASCADE'); + $this->addSql('DROP SEQUENCE phplist_userstats_id_seq CASCADE'); $this->addSql('ALTER TABLE phplist_admin_attribute DROP CONSTRAINT FK_58E07690D3B10C48'); $this->addSql('ALTER TABLE phplist_admin_attribute DROP CONSTRAINT FK_58E07690B8ED4D93'); $this->addSql('ALTER TABLE phplist_admin_login DROP CONSTRAINT FK_5FCE0842B8ED4D93'); @@ -253,5 +320,20 @@ public function down(Schema $schema): void $this->addSql('DROP TABLE phplist_user_user_history'); $this->addSql('DROP TABLE phplist_usermessage'); $this->addSql('DROP TABLE phplist_userstats'); + + $sm = $this->connection->createSchemaManager(); + if ($sm->tablesExist(['feed'])) { + $this->addSql('CREATE SEQUENCE feed_id_seq'); + $this->addSql('SELECT setval(\'feed_id_seq\', (SELECT MAX(id) FROM feed))'); + $this->addSql('ALTER TABLE feed ALTER id SET DEFAULT nextval(\'feed_id_seq\')'); + $this->addSql('ALTER TABLE feed ALTER etag SET DEFAULT \'\''); + $this->addSql('ALTER TABLE feed ALTER lastmodified SET DEFAULT \'\''); + $this->addSql('CREATE SEQUENCE item_id_seq'); + $this->addSql('SELECT setval(\'item_id_seq\', (SELECT MAX(id) FROM item))'); + $this->addSql('ALTER TABLE item ALTER id SET DEFAULT nextval(\'item_id_seq\')'); + $this->addSql('ALTER TABLE item_data DROP CONSTRAINT FK_65C3B798207C93D3'); + $this->addSql('ALTER TABLE item_data ALTER value DROP NOT NULL'); + $this->addSql('ALTER TABLE item_data ADD CONSTRAINT fk_itemdata_item FOREIGN KEY (itemid) REFERENCES item (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); + } } } diff --git a/src/Migrations/_template_migration.php.tpl b/src/Migrations/_template_migration.php.tpl index efd94272..72561549 100644 --- a/src/Migrations/_template_migration.php.tpl +++ b/src/Migrations/_template_migration.php.tpl @@ -9,11 +9,18 @@ use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\Migrations\AbstractMigration; use Doctrine\DBAL\Schema\Schema; +/** +* ⚠️ Wizard warning: +* Doctrine will `helpfully` remove url(255) prefixes and add collations 5.7 can’t read. +* Review the SQL unless you enjoy debugging key length errors at 2 AM. +* +* Ex: phplist_linktrack_forward phplist_linktrack_forward_urlindex (but there are more) +*/ final class extends AbstractMigration { public function getDescription(): string { - return ''; + return ''; } public function up(Schema $schema): void From 075c7f3187214499b45d64c9f509fbb381b0fae4 Mon Sep 17 00:00:00 2001 From: Tatevik Date: Fri, 31 Oct 2025 11:58:11 +0400 Subject: [PATCH 22/22] After review 2 --- .../Version20251031072945PostGreInit.php | 28 ------------------- 1 file changed, 28 deletions(-) diff --git a/src/Migrations/Version20251031072945PostGreInit.php b/src/Migrations/Version20251031072945PostGreInit.php index 6963ca14..206ec175 100644 --- a/src/Migrations/Version20251031072945PostGreInit.php +++ b/src/Migrations/Version20251031072945PostGreInit.php @@ -5,7 +5,6 @@ namespace PhpList\Core\Migrations; use Doctrine\DBAL\Platforms\PostgreSQLPlatform; -use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\Migrations\AbstractMigration; use Doctrine\DBAL\Schema\Schema; @@ -209,17 +208,6 @@ public function up(Schema $schema): void $this->addSql('ALTER TABLE phplist_user_user_history ADD CONSTRAINT FK_6DBB605CF132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F469F132696E FOREIGN KEY (userid) REFERENCES phplist_user_user (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); $this->addSql('ALTER TABLE phplist_usermessage ADD CONSTRAINT FK_7F30F46931478478 FOREIGN KEY (messageid) REFERENCES phplist_message (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - - $sm = $this->connection->createSchemaManager(); - if ($sm->tablesExist(['feed'])) { - $this->addSql('ALTER TABLE feed ALTER id DROP DEFAULT'); - $this->addSql('ALTER TABLE feed ALTER etag DROP DEFAULT'); - $this->addSql('ALTER TABLE feed ALTER lastmodified DROP DEFAULT'); - $this->addSql('ALTER TABLE item ALTER id DROP DEFAULT'); - $this->addSql('ALTER TABLE item_data DROP CONSTRAINT fk_itemdata_item'); - $this->addSql('ALTER TABLE item_data ALTER value SET NOT NULL'); - $this->addSql('ALTER TABLE item_data ADD CONSTRAINT FK_65C3B798207C93D3 FOREIGN KEY (itemid) REFERENCES item (id) NOT DEFERRABLE INITIALLY IMMEDIATE'); - } } public function down(Schema $schema): void @@ -230,7 +218,6 @@ public function down(Schema $schema): void get_class($platform) )); - $this->addSql('CREATE SCHEMA public'); $this->addSql('DROP SEQUENCE phplist_admin_id_seq CASCADE'); $this->addSql('DROP SEQUENCE phplist_admin_login_id_seq CASCADE'); $this->addSql('DROP SEQUENCE phplist_admin_password_request_id_key_seq CASCADE'); @@ -320,20 +307,5 @@ public function down(Schema $schema): void $this->addSql('DROP TABLE phplist_user_user_history'); $this->addSql('DROP TABLE phplist_usermessage'); $this->addSql('DROP TABLE phplist_userstats'); - - $sm = $this->connection->createSchemaManager(); - if ($sm->tablesExist(['feed'])) { - $this->addSql('CREATE SEQUENCE feed_id_seq'); - $this->addSql('SELECT setval(\'feed_id_seq\', (SELECT MAX(id) FROM feed))'); - $this->addSql('ALTER TABLE feed ALTER id SET DEFAULT nextval(\'feed_id_seq\')'); - $this->addSql('ALTER TABLE feed ALTER etag SET DEFAULT \'\''); - $this->addSql('ALTER TABLE feed ALTER lastmodified SET DEFAULT \'\''); - $this->addSql('CREATE SEQUENCE item_id_seq'); - $this->addSql('SELECT setval(\'item_id_seq\', (SELECT MAX(id) FROM item))'); - $this->addSql('ALTER TABLE item ALTER id SET DEFAULT nextval(\'item_id_seq\')'); - $this->addSql('ALTER TABLE item_data DROP CONSTRAINT FK_65C3B798207C93D3'); - $this->addSql('ALTER TABLE item_data ALTER value DROP NOT NULL'); - $this->addSql('ALTER TABLE item_data ADD CONSTRAINT fk_itemdata_item FOREIGN KEY (itemid) REFERENCES item (id) ON DELETE CASCADE NOT DEFERRABLE INITIALLY IMMEDIATE'); - } } }