From e98217fb257071ae2fb5487ff94c2ebff627b935 Mon Sep 17 00:00:00 2001 From: alexmerlin Date: Tue, 4 Nov 2025 14:19:37 +0200 Subject: [PATCH 1/2] Issue #391: Implemented Doctrine table prefixes Signed-off-by: alexmerlin --- bin/doctrine | 17 ++-- config/autoload/local.php.dist | 19 ++-- config/cli-config.php | 16 +-- log/.gitignore | 0 src/Core/src/App/src/ConfigProvider.php | 11 ++- .../src/Event/TablePrefixEventListener.php | 54 +++++++++++ .../Factory/TablePrefixDelegatorFactory.php | 34 +++++++ .../src/Migration/Version20251104121246.php | 97 +++++++++++++++++++ 8 files changed, 223 insertions(+), 25 deletions(-) mode change 100644 => 100755 log/.gitignore create mode 100644 src/Core/src/App/src/Event/TablePrefixEventListener.php create mode 100644 src/Core/src/App/src/Factory/TablePrefixDelegatorFactory.php create mode 100644 src/Core/src/App/src/Migration/Version20251104121246.php diff --git a/bin/doctrine b/bin/doctrine index a27a1bc8..56d0bbc6 100644 --- a/bin/doctrine +++ b/bin/doctrine @@ -3,22 +3,25 @@ declare(strict_types=1); +use Core\App\Event\TablePrefixEventListener; use Doctrine\ORM\EntityManager; +use Doctrine\ORM\Events; use Doctrine\ORM\Tools\Console\ConsoleRunner; use Doctrine\ORM\Tools\Console\EntityManagerProvider\SingleManagerProvider; +use Dot\DataFixtures\Command\ExecuteFixturesCommand; +use Dot\DataFixtures\Command\ListFixturesCommand; require_once 'vendor/autoload.php'; -$container = require getcwd() . '/config/container.php' ; +$container = require 'config/container.php'; $entityManager = $container->get(EntityManager::class); +$entityManager->getEventManager() + ->addEventListener(Events::loadClassMetadata, $container->get(TablePrefixEventListener::class)); $commands = [ - $container->get(Dot\DataFixtures\Command\ExecuteFixturesCommand::class), - $container->get(Dot\DataFixtures\Command\ListFixturesCommand::class), + $container->get(ExecuteFixturesCommand::class), + $container->get(ListFixturesCommand::class), ]; -ConsoleRunner::run( - new SingleManagerProvider($entityManager), - $commands -); +ConsoleRunner::run(new SingleManagerProvider($entityManager), $commands); diff --git a/config/autoload/local.php.dist b/config/autoload/local.php.dist index d08c545a..d9e05ffd 100644 --- a/config/autoload/local.php.dist +++ b/config/autoload/local.php.dist @@ -13,16 +13,17 @@ $baseUrl = 'http://localhost:8080'; $databases = [ 'default' => [ - 'host' => 'localhost', - 'dbname' => 'dotkernel', - 'user' => '', - 'password' => '', - 'port' => 3306, - 'driver' => 'pdo_mysql', - 'charset' => 'utf8mb4', - 'collate' => 'utf8mb4_general_ci', + 'host' => 'localhost', + 'dbname' => 'dotkernel', + 'user' => '', + 'password' => '', + 'port' => 3306, + 'driver' => 'pdo_mysql', + 'charset' => 'utf8mb4', + 'collate' => 'utf8mb4_general_ci', + 'table_prefix' => '', ], - // you can add more database connections into this array + // you can add more database connections to this array ]; return [ diff --git a/config/cli-config.php b/config/cli-config.php index 202c2fd9..2a5bcc2a 100644 --- a/config/cli-config.php +++ b/config/cli-config.php @@ -2,18 +2,20 @@ declare(strict_types=1); +use Core\App\Event\TablePrefixEventListener; use Doctrine\Migrations\Configuration\EntityManager\ExistingEntityManager; use Doctrine\Migrations\Configuration\Migration\ConfigurationArray; use Doctrine\Migrations\DependencyFactory; use Doctrine\ORM\EntityManager; +use Doctrine\ORM\Events; -$container = require __DIR__ . '/container.php'; +$container = require 'config/container.php'; + +$entityManager = $container->get(EntityManager::class); +$entityManager->getEventManager() + ->addEventListener(Events::loadClassMetadata, $container->get(TablePrefixEventListener::class)); return DependencyFactory::fromEntityManager( - new ConfigurationArray( - $container->get('config')['doctrine']['migrations'] - ), - new ExistingEntityManager( - $container->get(EntityManager::class) - ) + new ConfigurationArray($container->get('config')['doctrine']['migrations']), + new ExistingEntityManager($entityManager) ); diff --git a/log/.gitignore b/log/.gitignore old mode 100644 new mode 100755 diff --git a/src/Core/src/App/src/ConfigProvider.php b/src/Core/src/App/src/ConfigProvider.php index 7b1e445b..918ac03b 100644 --- a/src/Core/src/App/src/ConfigProvider.php +++ b/src/Core/src/App/src/ConfigProvider.php @@ -7,7 +7,9 @@ use Core\App\Command\RouteListCommand; use Core\App\DBAL\Types\SuccessFailureEnumType; use Core\App\DBAL\Types\YesNoEnumType; +use Core\App\Event\TablePrefixEventListener; use Core\App\Factory\EntityListenerResolverFactory; +use Core\App\Factory\TablePrefixDelegatorFactory; use Core\App\Resolver\EntityListenerResolver; use Core\App\Service\MailService; use Doctrine\ORM\EntityManager; @@ -23,6 +25,7 @@ use Dot\Mail\Factory\MailOptionsAbstractFactory; use Dot\Mail\Factory\MailServiceAbstractFactory; use Dot\Mail\Service\MailService as DotMailService; +use Mezzio\Application; use Ramsey\Uuid\Doctrine\UuidBinaryOrderedTimeType; use Ramsey\Uuid\Doctrine\UuidBinaryType; use Ramsey\Uuid\Doctrine\UuidType; @@ -117,15 +120,19 @@ public function __invoke(): array private function getDependencies(): array { return [ - 'factories' => [ + 'delegators' => [ + Application::class => [TablePrefixDelegatorFactory::class], + ], + 'factories' => [ 'doctrine.entity_manager.orm_default' => EntityManagerFactory::class, 'dot-mail.options.default' => MailOptionsAbstractFactory::class, 'dot-mail.service.default' => MailServiceAbstractFactory::class, EntityListenerResolver::class => EntityListenerResolverFactory::class, MailService::class => AttributedServiceFactory::class, RouteListCommand::class => AttributedServiceFactory::class, + TablePrefixEventListener::class => AttributedServiceFactory::class, ], - 'aliases' => [ + 'aliases' => [ DotMailService::class => 'dot-mail.service.default', EntityManager::class => 'doctrine.entity_manager.orm_default', EntityManagerInterface::class => 'doctrine.entity_manager.orm_default', diff --git a/src/Core/src/App/src/Event/TablePrefixEventListener.php b/src/Core/src/App/src/Event/TablePrefixEventListener.php new file mode 100644 index 00000000..68b5d2a2 --- /dev/null +++ b/src/Core/src/App/src/Event/TablePrefixEventListener.php @@ -0,0 +1,54 @@ + $config + */ + #[Inject( + 'config.doctrine.connection.orm_default.params', + )] + public function __construct(array $config) + { + if (array_key_exists('table_prefix', $config) && is_string($config['table_prefix'])) { + $this->prefix = $config['table_prefix']; + } + } + + public function loadClassMetadata(LoadClassMetadataEventArgs $eventArgs): void + { + if ($this->prefix === '') { + return; + } + + $classMetadata = $eventArgs->getClassMetadata(); + if ( + ! $classMetadata->isInheritanceTypeSingleTable() + || $classMetadata->getName() === $classMetadata->rootEntityName + ) { + $classMetadata->setPrimaryTable([ + 'name' => $this->prefix . $classMetadata->getTableName(), + ]); + } + + foreach ($classMetadata->getAssociationMappings() as $fieldName => $mapping) { + if ($mapping['type'] === ClassMetadata::MANY_TO_MANY && $mapping['isOwningSide']) { + $classMetadata->associationMappings[$fieldName]['joinTable']['name'] = + $this->prefix . $mapping['joinTable']['name']; + } + } + } +} diff --git a/src/Core/src/App/src/Factory/TablePrefixDelegatorFactory.php b/src/Core/src/App/src/Factory/TablePrefixDelegatorFactory.php new file mode 100644 index 00000000..057fef98 --- /dev/null +++ b/src/Core/src/App/src/Factory/TablePrefixDelegatorFactory.php @@ -0,0 +1,34 @@ +has('doctrine.entity_manager.orm_default')) { + /** @var EntityManagerInterface $entityManager */ + $entityManager = $container->get('doctrine.entity_manager.orm_default'); + $entityManager->getEventManager()->addEventListener( + Events::loadClassMetadata, + $container->get(TablePrefixEventListener::class) + ); + } + + return $callback(); + } +} diff --git a/src/Core/src/App/src/Migration/Version20251104121246.php b/src/Core/src/App/src/Migration/Version20251104121246.php new file mode 100644 index 00000000..ea8afee3 --- /dev/null +++ b/src/Core/src/App/src/Migration/Version20251104121246.php @@ -0,0 +1,97 @@ +addSql('CREATE TABLE dk_admin (identity VARCHAR(191) NOT NULL, firstName VARCHAR(191) DEFAULT NULL, lastName VARCHAR(191) DEFAULT NULL, password VARCHAR(191) NOT NULL, status ENUM(\'active\', \'inactive\') DEFAULT \'active\' NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_BC6297E6A95E9C4 (identity), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_admin_roles (userUuid BINARY(16) NOT NULL, roleUuid BINARY(16) NOT NULL, INDEX IDX_9E8CBDA4D73087E9 (userUuid), INDEX IDX_9E8CBDA488446210 (roleUuid), PRIMARY KEY (userUuid, roleUuid)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_admin_login (identity VARCHAR(191) DEFAULT NULL, adminIp VARCHAR(191) DEFAULT NULL, country VARCHAR(191) DEFAULT NULL, continent VARCHAR(191) DEFAULT NULL, organization VARCHAR(191) DEFAULT NULL, deviceType VARCHAR(191) DEFAULT NULL, deviceBrand VARCHAR(191) DEFAULT NULL, deviceModel VARCHAR(40) DEFAULT NULL, isMobile ENUM(\'yes\', \'no\') DEFAULT NULL, osName VARCHAR(191) DEFAULT NULL, osVersion VARCHAR(191) DEFAULT NULL, osPlatform VARCHAR(191) DEFAULT NULL, clientType VARCHAR(191) DEFAULT NULL, clientName VARCHAR(191) DEFAULT NULL, clientEngine VARCHAR(191) DEFAULT NULL, clientVersion VARCHAR(191) DEFAULT NULL, loginStatus ENUM(\'success\', \'fail\') DEFAULT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_admin_role (name ENUM(\'admin\', \'superuser\') DEFAULT \'admin\' NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_E74277525E237E06 (name), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_oauth_access_tokens (id INT UNSIGNED AUTO_INCREMENT NOT NULL, user_id VARCHAR(25) DEFAULT NULL, token VARCHAR(100) NOT NULL, revoked TINYINT(1) DEFAULT 0 NOT NULL, expires_at DATETIME NOT NULL, client_id INT UNSIGNED DEFAULT NULL, INDEX IDX_3277905919EB6921 (client_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_oauth_access_token_scopes (access_token_id INT UNSIGNED NOT NULL, scope_id INT UNSIGNED NOT NULL, INDEX IDX_2749672C2CCB2688 (access_token_id), INDEX IDX_2749672C682B5931 (scope_id), PRIMARY KEY (access_token_id, scope_id)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_oauth_auth_codes (id INT UNSIGNED AUTO_INCREMENT NOT NULL, revoked TINYINT(1) DEFAULT 0 NOT NULL, expiresDatetime DATETIME DEFAULT NULL, client_id INT UNSIGNED DEFAULT NULL, INDEX IDX_99975E0519EB6921 (client_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_oauth_auth_code_scopes (auth_code_id INT UNSIGNED NOT NULL, scope_id INT UNSIGNED NOT NULL, INDEX IDX_9720AA369FEDEE4 (auth_code_id), INDEX IDX_9720AA3682B5931 (scope_id), PRIMARY KEY (auth_code_id, scope_id)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_oauth_clients (id INT UNSIGNED AUTO_INCREMENT NOT NULL, name VARCHAR(40) NOT NULL, secret VARCHAR(100) DEFAULT NULL, redirect VARCHAR(191) NOT NULL, revoked TINYINT(1) DEFAULT 0 NOT NULL, isConfidential TINYINT(1) DEFAULT 0 NOT NULL, user_id BINARY(16) DEFAULT NULL, INDEX IDX_F024D1A0A76ED395 (user_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_oauth_refresh_tokens (id INT UNSIGNED AUTO_INCREMENT NOT NULL, revoked TINYINT(1) DEFAULT 0 NOT NULL, expires_at DATETIME NOT NULL, access_token_id INT UNSIGNED DEFAULT NULL, INDEX IDX_4BA657022CCB2688 (access_token_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_oauth_scopes (id INT UNSIGNED AUTO_INCREMENT NOT NULL, scope VARCHAR(191) NOT NULL, PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_settings (identifier ENUM(\'table_admin_list_selected_columns\', \'table_admin_list_logins_selected_columns\', \'table_user_list_selected_columns\') NOT NULL, value LONGTEXT NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, admin_uuid BINARY(16) DEFAULT NULL, INDEX IDX_8F015ADAF166D246 (admin_uuid), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_user (identity VARCHAR(191) NOT NULL, password VARCHAR(191) NOT NULL, status ENUM(\'active\', \'pending\', \'deleted\') DEFAULT \'pending\' NOT NULL, hash VARCHAR(191) NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_9632195E6A95E9C4 (identity), UNIQUE INDEX UNIQ_9632195ED1B862B8 (hash), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_user_roles (userUuid BINARY(16) NOT NULL, roleUuid BINARY(16) NOT NULL, INDEX IDX_C4CEAA47D73087E9 (userUuid), INDEX IDX_C4CEAA4788446210 (roleUuid), PRIMARY KEY (userUuid, roleUuid)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_user_avatar (name VARCHAR(191) NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, userUuid BINARY(16) DEFAULT NULL, UNIQUE INDEX UNIQ_FBBD018BD73087E9 (userUuid), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_user_detail (firstName VARCHAR(191) DEFAULT NULL, lastName VARCHAR(191) DEFAULT NULL, email VARCHAR(191) NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, userUuid BINARY(16) DEFAULT NULL, UNIQUE INDEX UNIQ_C3CC0C37D73087E9 (userUuid), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_user_reset_password (expires DATETIME NOT NULL, hash VARCHAR(191) NOT NULL, status ENUM(\'completed\', \'requested\') DEFAULT \'requested\' NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, userUuid BINARY(16) DEFAULT NULL, UNIQUE INDEX UNIQ_2A282199D1B862B8 (hash), INDEX IDX_2A282199D73087E9 (userUuid), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('CREATE TABLE dk_user_role (name ENUM(\'guest\', \'user\') DEFAULT \'user\' NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_A08A8FAC5E237E06 (name), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); + $this->addSql('ALTER TABLE dk_admin_roles ADD CONSTRAINT FK_9E8CBDA4D73087E9 FOREIGN KEY (userUuid) REFERENCES dk_admin (uuid)'); + $this->addSql('ALTER TABLE dk_admin_roles ADD CONSTRAINT FK_9E8CBDA488446210 FOREIGN KEY (roleUuid) REFERENCES dk_admin_role (uuid)'); + $this->addSql('ALTER TABLE dk_oauth_access_tokens ADD CONSTRAINT FK_3277905919EB6921 FOREIGN KEY (client_id) REFERENCES dk_oauth_clients (id)'); + $this->addSql('ALTER TABLE dk_oauth_access_token_scopes ADD CONSTRAINT FK_2749672C2CCB2688 FOREIGN KEY (access_token_id) REFERENCES dk_oauth_access_tokens (id)'); + $this->addSql('ALTER TABLE dk_oauth_access_token_scopes ADD CONSTRAINT FK_2749672C682B5931 FOREIGN KEY (scope_id) REFERENCES dk_oauth_scopes (id)'); + $this->addSql('ALTER TABLE dk_oauth_auth_codes ADD CONSTRAINT FK_99975E0519EB6921 FOREIGN KEY (client_id) REFERENCES dk_oauth_clients (id)'); + $this->addSql('ALTER TABLE dk_oauth_auth_code_scopes ADD CONSTRAINT FK_9720AA369FEDEE4 FOREIGN KEY (auth_code_id) REFERENCES dk_oauth_auth_codes (id)'); + $this->addSql('ALTER TABLE dk_oauth_auth_code_scopes ADD CONSTRAINT FK_9720AA3682B5931 FOREIGN KEY (scope_id) REFERENCES dk_oauth_scopes (id)'); + $this->addSql('ALTER TABLE dk_oauth_clients ADD CONSTRAINT FK_F024D1A0A76ED395 FOREIGN KEY (user_id) REFERENCES dk_user (uuid)'); + $this->addSql('ALTER TABLE dk_oauth_refresh_tokens ADD CONSTRAINT FK_4BA657022CCB2688 FOREIGN KEY (access_token_id) REFERENCES dk_oauth_access_tokens (id)'); + $this->addSql('ALTER TABLE dk_settings ADD CONSTRAINT FK_8F015ADAF166D246 FOREIGN KEY (admin_uuid) REFERENCES dk_admin (uuid)'); + $this->addSql('ALTER TABLE dk_user_roles ADD CONSTRAINT FK_C4CEAA47D73087E9 FOREIGN KEY (userUuid) REFERENCES dk_user (uuid)'); + $this->addSql('ALTER TABLE dk_user_roles ADD CONSTRAINT FK_C4CEAA4788446210 FOREIGN KEY (roleUuid) REFERENCES dk_user_role (uuid)'); + $this->addSql('ALTER TABLE dk_user_avatar ADD CONSTRAINT FK_FBBD018BD73087E9 FOREIGN KEY (userUuid) REFERENCES dk_user (uuid)'); + $this->addSql('ALTER TABLE dk_user_detail ADD CONSTRAINT FK_C3CC0C37D73087E9 FOREIGN KEY (userUuid) REFERENCES dk_user (uuid)'); + $this->addSql('ALTER TABLE dk_user_reset_password ADD CONSTRAINT FK_2A282199D73087E9 FOREIGN KEY (userUuid) REFERENCES dk_user (uuid)'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE dk_admin_roles DROP FOREIGN KEY FK_9E8CBDA4D73087E9'); + $this->addSql('ALTER TABLE dk_admin_roles DROP FOREIGN KEY FK_9E8CBDA488446210'); + $this->addSql('ALTER TABLE dk_oauth_access_tokens DROP FOREIGN KEY FK_3277905919EB6921'); + $this->addSql('ALTER TABLE dk_oauth_access_token_scopes DROP FOREIGN KEY FK_2749672C2CCB2688'); + $this->addSql('ALTER TABLE dk_oauth_access_token_scopes DROP FOREIGN KEY FK_2749672C682B5931'); + $this->addSql('ALTER TABLE dk_oauth_auth_codes DROP FOREIGN KEY FK_99975E0519EB6921'); + $this->addSql('ALTER TABLE dk_oauth_auth_code_scopes DROP FOREIGN KEY FK_9720AA369FEDEE4'); + $this->addSql('ALTER TABLE dk_oauth_auth_code_scopes DROP FOREIGN KEY FK_9720AA3682B5931'); + $this->addSql('ALTER TABLE dk_oauth_clients DROP FOREIGN KEY FK_F024D1A0A76ED395'); + $this->addSql('ALTER TABLE dk_oauth_refresh_tokens DROP FOREIGN KEY FK_4BA657022CCB2688'); + $this->addSql('ALTER TABLE dk_settings DROP FOREIGN KEY FK_8F015ADAF166D246'); + $this->addSql('ALTER TABLE dk_user_roles DROP FOREIGN KEY FK_C4CEAA47D73087E9'); + $this->addSql('ALTER TABLE dk_user_roles DROP FOREIGN KEY FK_C4CEAA4788446210'); + $this->addSql('ALTER TABLE dk_user_avatar DROP FOREIGN KEY FK_FBBD018BD73087E9'); + $this->addSql('ALTER TABLE dk_user_detail DROP FOREIGN KEY FK_C3CC0C37D73087E9'); + $this->addSql('ALTER TABLE dk_user_reset_password DROP FOREIGN KEY FK_2A282199D73087E9'); + $this->addSql('DROP TABLE dk_admin'); + $this->addSql('DROP TABLE dk_admin_roles'); + $this->addSql('DROP TABLE dk_admin_login'); + $this->addSql('DROP TABLE dk_admin_role'); + $this->addSql('DROP TABLE dk_oauth_access_tokens'); + $this->addSql('DROP TABLE dk_oauth_access_token_scopes'); + $this->addSql('DROP TABLE dk_oauth_auth_codes'); + $this->addSql('DROP TABLE dk_oauth_auth_code_scopes'); + $this->addSql('DROP TABLE dk_oauth_clients'); + $this->addSql('DROP TABLE dk_oauth_refresh_tokens'); + $this->addSql('DROP TABLE dk_oauth_scopes'); + $this->addSql('DROP TABLE dk_settings'); + $this->addSql('DROP TABLE dk_user'); + $this->addSql('DROP TABLE dk_user_roles'); + $this->addSql('DROP TABLE dk_user_avatar'); + $this->addSql('DROP TABLE dk_user_detail'); + $this->addSql('DROP TABLE dk_user_reset_password'); + $this->addSql('DROP TABLE dk_user_role'); + } +} From f0edc163ac30d566635bf8c24ad63c3b63a46ed8 Mon Sep 17 00:00:00 2001 From: alexmerlin Date: Tue, 4 Nov 2025 14:22:19 +0200 Subject: [PATCH 2/2] Issue #391: Implemented Doctrine table prefixes Signed-off-by: alexmerlin --- .../src/Migration/Version20251104121246.php | 97 ------------------- 1 file changed, 97 deletions(-) delete mode 100644 src/Core/src/App/src/Migration/Version20251104121246.php diff --git a/src/Core/src/App/src/Migration/Version20251104121246.php b/src/Core/src/App/src/Migration/Version20251104121246.php deleted file mode 100644 index ea8afee3..00000000 --- a/src/Core/src/App/src/Migration/Version20251104121246.php +++ /dev/null @@ -1,97 +0,0 @@ -addSql('CREATE TABLE dk_admin (identity VARCHAR(191) NOT NULL, firstName VARCHAR(191) DEFAULT NULL, lastName VARCHAR(191) DEFAULT NULL, password VARCHAR(191) NOT NULL, status ENUM(\'active\', \'inactive\') DEFAULT \'active\' NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_BC6297E6A95E9C4 (identity), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_admin_roles (userUuid BINARY(16) NOT NULL, roleUuid BINARY(16) NOT NULL, INDEX IDX_9E8CBDA4D73087E9 (userUuid), INDEX IDX_9E8CBDA488446210 (roleUuid), PRIMARY KEY (userUuid, roleUuid)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_admin_login (identity VARCHAR(191) DEFAULT NULL, adminIp VARCHAR(191) DEFAULT NULL, country VARCHAR(191) DEFAULT NULL, continent VARCHAR(191) DEFAULT NULL, organization VARCHAR(191) DEFAULT NULL, deviceType VARCHAR(191) DEFAULT NULL, deviceBrand VARCHAR(191) DEFAULT NULL, deviceModel VARCHAR(40) DEFAULT NULL, isMobile ENUM(\'yes\', \'no\') DEFAULT NULL, osName VARCHAR(191) DEFAULT NULL, osVersion VARCHAR(191) DEFAULT NULL, osPlatform VARCHAR(191) DEFAULT NULL, clientType VARCHAR(191) DEFAULT NULL, clientName VARCHAR(191) DEFAULT NULL, clientEngine VARCHAR(191) DEFAULT NULL, clientVersion VARCHAR(191) DEFAULT NULL, loginStatus ENUM(\'success\', \'fail\') DEFAULT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_admin_role (name ENUM(\'admin\', \'superuser\') DEFAULT \'admin\' NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_E74277525E237E06 (name), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_oauth_access_tokens (id INT UNSIGNED AUTO_INCREMENT NOT NULL, user_id VARCHAR(25) DEFAULT NULL, token VARCHAR(100) NOT NULL, revoked TINYINT(1) DEFAULT 0 NOT NULL, expires_at DATETIME NOT NULL, client_id INT UNSIGNED DEFAULT NULL, INDEX IDX_3277905919EB6921 (client_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_oauth_access_token_scopes (access_token_id INT UNSIGNED NOT NULL, scope_id INT UNSIGNED NOT NULL, INDEX IDX_2749672C2CCB2688 (access_token_id), INDEX IDX_2749672C682B5931 (scope_id), PRIMARY KEY (access_token_id, scope_id)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_oauth_auth_codes (id INT UNSIGNED AUTO_INCREMENT NOT NULL, revoked TINYINT(1) DEFAULT 0 NOT NULL, expiresDatetime DATETIME DEFAULT NULL, client_id INT UNSIGNED DEFAULT NULL, INDEX IDX_99975E0519EB6921 (client_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_oauth_auth_code_scopes (auth_code_id INT UNSIGNED NOT NULL, scope_id INT UNSIGNED NOT NULL, INDEX IDX_9720AA369FEDEE4 (auth_code_id), INDEX IDX_9720AA3682B5931 (scope_id), PRIMARY KEY (auth_code_id, scope_id)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_oauth_clients (id INT UNSIGNED AUTO_INCREMENT NOT NULL, name VARCHAR(40) NOT NULL, secret VARCHAR(100) DEFAULT NULL, redirect VARCHAR(191) NOT NULL, revoked TINYINT(1) DEFAULT 0 NOT NULL, isConfidential TINYINT(1) DEFAULT 0 NOT NULL, user_id BINARY(16) DEFAULT NULL, INDEX IDX_F024D1A0A76ED395 (user_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_oauth_refresh_tokens (id INT UNSIGNED AUTO_INCREMENT NOT NULL, revoked TINYINT(1) DEFAULT 0 NOT NULL, expires_at DATETIME NOT NULL, access_token_id INT UNSIGNED DEFAULT NULL, INDEX IDX_4BA657022CCB2688 (access_token_id), PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_oauth_scopes (id INT UNSIGNED AUTO_INCREMENT NOT NULL, scope VARCHAR(191) NOT NULL, PRIMARY KEY (id)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_settings (identifier ENUM(\'table_admin_list_selected_columns\', \'table_admin_list_logins_selected_columns\', \'table_user_list_selected_columns\') NOT NULL, value LONGTEXT NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, admin_uuid BINARY(16) DEFAULT NULL, INDEX IDX_8F015ADAF166D246 (admin_uuid), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_user (identity VARCHAR(191) NOT NULL, password VARCHAR(191) NOT NULL, status ENUM(\'active\', \'pending\', \'deleted\') DEFAULT \'pending\' NOT NULL, hash VARCHAR(191) NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_9632195E6A95E9C4 (identity), UNIQUE INDEX UNIQ_9632195ED1B862B8 (hash), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_user_roles (userUuid BINARY(16) NOT NULL, roleUuid BINARY(16) NOT NULL, INDEX IDX_C4CEAA47D73087E9 (userUuid), INDEX IDX_C4CEAA4788446210 (roleUuid), PRIMARY KEY (userUuid, roleUuid)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_user_avatar (name VARCHAR(191) NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, userUuid BINARY(16) DEFAULT NULL, UNIQUE INDEX UNIQ_FBBD018BD73087E9 (userUuid), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_user_detail (firstName VARCHAR(191) DEFAULT NULL, lastName VARCHAR(191) DEFAULT NULL, email VARCHAR(191) NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, userUuid BINARY(16) DEFAULT NULL, UNIQUE INDEX UNIQ_C3CC0C37D73087E9 (userUuid), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_user_reset_password (expires DATETIME NOT NULL, hash VARCHAR(191) NOT NULL, status ENUM(\'completed\', \'requested\') DEFAULT \'requested\' NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, userUuid BINARY(16) DEFAULT NULL, UNIQUE INDEX UNIQ_2A282199D1B862B8 (hash), INDEX IDX_2A282199D73087E9 (userUuid), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('CREATE TABLE dk_user_role (name ENUM(\'guest\', \'user\') DEFAULT \'user\' NOT NULL, uuid BINARY(16) NOT NULL, created DATETIME NOT NULL, updated DATETIME DEFAULT NULL, UNIQUE INDEX UNIQ_A08A8FAC5E237E06 (name), PRIMARY KEY (uuid)) DEFAULT CHARACTER SET utf8mb4'); - $this->addSql('ALTER TABLE dk_admin_roles ADD CONSTRAINT FK_9E8CBDA4D73087E9 FOREIGN KEY (userUuid) REFERENCES dk_admin (uuid)'); - $this->addSql('ALTER TABLE dk_admin_roles ADD CONSTRAINT FK_9E8CBDA488446210 FOREIGN KEY (roleUuid) REFERENCES dk_admin_role (uuid)'); - $this->addSql('ALTER TABLE dk_oauth_access_tokens ADD CONSTRAINT FK_3277905919EB6921 FOREIGN KEY (client_id) REFERENCES dk_oauth_clients (id)'); - $this->addSql('ALTER TABLE dk_oauth_access_token_scopes ADD CONSTRAINT FK_2749672C2CCB2688 FOREIGN KEY (access_token_id) REFERENCES dk_oauth_access_tokens (id)'); - $this->addSql('ALTER TABLE dk_oauth_access_token_scopes ADD CONSTRAINT FK_2749672C682B5931 FOREIGN KEY (scope_id) REFERENCES dk_oauth_scopes (id)'); - $this->addSql('ALTER TABLE dk_oauth_auth_codes ADD CONSTRAINT FK_99975E0519EB6921 FOREIGN KEY (client_id) REFERENCES dk_oauth_clients (id)'); - $this->addSql('ALTER TABLE dk_oauth_auth_code_scopes ADD CONSTRAINT FK_9720AA369FEDEE4 FOREIGN KEY (auth_code_id) REFERENCES dk_oauth_auth_codes (id)'); - $this->addSql('ALTER TABLE dk_oauth_auth_code_scopes ADD CONSTRAINT FK_9720AA3682B5931 FOREIGN KEY (scope_id) REFERENCES dk_oauth_scopes (id)'); - $this->addSql('ALTER TABLE dk_oauth_clients ADD CONSTRAINT FK_F024D1A0A76ED395 FOREIGN KEY (user_id) REFERENCES dk_user (uuid)'); - $this->addSql('ALTER TABLE dk_oauth_refresh_tokens ADD CONSTRAINT FK_4BA657022CCB2688 FOREIGN KEY (access_token_id) REFERENCES dk_oauth_access_tokens (id)'); - $this->addSql('ALTER TABLE dk_settings ADD CONSTRAINT FK_8F015ADAF166D246 FOREIGN KEY (admin_uuid) REFERENCES dk_admin (uuid)'); - $this->addSql('ALTER TABLE dk_user_roles ADD CONSTRAINT FK_C4CEAA47D73087E9 FOREIGN KEY (userUuid) REFERENCES dk_user (uuid)'); - $this->addSql('ALTER TABLE dk_user_roles ADD CONSTRAINT FK_C4CEAA4788446210 FOREIGN KEY (roleUuid) REFERENCES dk_user_role (uuid)'); - $this->addSql('ALTER TABLE dk_user_avatar ADD CONSTRAINT FK_FBBD018BD73087E9 FOREIGN KEY (userUuid) REFERENCES dk_user (uuid)'); - $this->addSql('ALTER TABLE dk_user_detail ADD CONSTRAINT FK_C3CC0C37D73087E9 FOREIGN KEY (userUuid) REFERENCES dk_user (uuid)'); - $this->addSql('ALTER TABLE dk_user_reset_password ADD CONSTRAINT FK_2A282199D73087E9 FOREIGN KEY (userUuid) REFERENCES dk_user (uuid)'); - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE dk_admin_roles DROP FOREIGN KEY FK_9E8CBDA4D73087E9'); - $this->addSql('ALTER TABLE dk_admin_roles DROP FOREIGN KEY FK_9E8CBDA488446210'); - $this->addSql('ALTER TABLE dk_oauth_access_tokens DROP FOREIGN KEY FK_3277905919EB6921'); - $this->addSql('ALTER TABLE dk_oauth_access_token_scopes DROP FOREIGN KEY FK_2749672C2CCB2688'); - $this->addSql('ALTER TABLE dk_oauth_access_token_scopes DROP FOREIGN KEY FK_2749672C682B5931'); - $this->addSql('ALTER TABLE dk_oauth_auth_codes DROP FOREIGN KEY FK_99975E0519EB6921'); - $this->addSql('ALTER TABLE dk_oauth_auth_code_scopes DROP FOREIGN KEY FK_9720AA369FEDEE4'); - $this->addSql('ALTER TABLE dk_oauth_auth_code_scopes DROP FOREIGN KEY FK_9720AA3682B5931'); - $this->addSql('ALTER TABLE dk_oauth_clients DROP FOREIGN KEY FK_F024D1A0A76ED395'); - $this->addSql('ALTER TABLE dk_oauth_refresh_tokens DROP FOREIGN KEY FK_4BA657022CCB2688'); - $this->addSql('ALTER TABLE dk_settings DROP FOREIGN KEY FK_8F015ADAF166D246'); - $this->addSql('ALTER TABLE dk_user_roles DROP FOREIGN KEY FK_C4CEAA47D73087E9'); - $this->addSql('ALTER TABLE dk_user_roles DROP FOREIGN KEY FK_C4CEAA4788446210'); - $this->addSql('ALTER TABLE dk_user_avatar DROP FOREIGN KEY FK_FBBD018BD73087E9'); - $this->addSql('ALTER TABLE dk_user_detail DROP FOREIGN KEY FK_C3CC0C37D73087E9'); - $this->addSql('ALTER TABLE dk_user_reset_password DROP FOREIGN KEY FK_2A282199D73087E9'); - $this->addSql('DROP TABLE dk_admin'); - $this->addSql('DROP TABLE dk_admin_roles'); - $this->addSql('DROP TABLE dk_admin_login'); - $this->addSql('DROP TABLE dk_admin_role'); - $this->addSql('DROP TABLE dk_oauth_access_tokens'); - $this->addSql('DROP TABLE dk_oauth_access_token_scopes'); - $this->addSql('DROP TABLE dk_oauth_auth_codes'); - $this->addSql('DROP TABLE dk_oauth_auth_code_scopes'); - $this->addSql('DROP TABLE dk_oauth_clients'); - $this->addSql('DROP TABLE dk_oauth_refresh_tokens'); - $this->addSql('DROP TABLE dk_oauth_scopes'); - $this->addSql('DROP TABLE dk_settings'); - $this->addSql('DROP TABLE dk_user'); - $this->addSql('DROP TABLE dk_user_roles'); - $this->addSql('DROP TABLE dk_user_avatar'); - $this->addSql('DROP TABLE dk_user_detail'); - $this->addSql('DROP TABLE dk_user_reset_password'); - $this->addSql('DROP TABLE dk_user_role'); - } -}