From 8f954151cad041154a883ee0178c324ebfaa3c25 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Tue, 20 Feb 2024 22:57:33 +0100 Subject: [PATCH 1/2] Change long URL columns to TEXT type --- ...inkio.Shlink.Core.Domain.Entity.Domain.php | 6 ++--- ...ink.Core.ShortUrl.Entity.DeviceLongUrl.php | 3 +-- ...o.Shlink.Core.ShortUrl.Entity.ShortUrl.php | 3 +-- .../Core/migrations/Version20240220214031.php | 27 +++++++++++++++++++ 4 files changed, 32 insertions(+), 7 deletions(-) create mode 100644 module/Core/migrations/Version20240220214031.php diff --git a/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.Domain.Entity.Domain.php b/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.Domain.Entity.Domain.php index 68427b42..e02d1f7e 100644 --- a/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.Domain.Entity.Domain.php +++ b/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.Domain.Entity.Domain.php @@ -25,17 +25,17 @@ return static function (ClassMetadata $metadata, array $emConfig): void { ->unique() ->build(); - fieldWithUtf8Charset($builder->createField('baseUrlRedirect', Types::STRING), $emConfig) + fieldWithUtf8Charset($builder->createField('baseUrlRedirect', Types::TEXT), $emConfig) ->columnName('base_url_redirect') ->nullable() ->build(); - fieldWithUtf8Charset($builder->createField('regular404Redirect', Types::STRING), $emConfig) + fieldWithUtf8Charset($builder->createField('regular404Redirect', Types::TEXT), $emConfig) ->columnName('regular_not_found_redirect') ->nullable() ->build(); - fieldWithUtf8Charset($builder->createField('invalidShortUrlRedirect', Types::STRING), $emConfig) + fieldWithUtf8Charset($builder->createField('invalidShortUrlRedirect', Types::TEXT), $emConfig) ->columnName('invalid_short_url_redirect') ->nullable() ->build(); diff --git a/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.ShortUrl.Entity.DeviceLongUrl.php b/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.ShortUrl.Entity.DeviceLongUrl.php index 8de69c18..3620ea54 100644 --- a/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.ShortUrl.Entity.DeviceLongUrl.php +++ b/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.ShortUrl.Entity.DeviceLongUrl.php @@ -30,9 +30,8 @@ return static function (ClassMetadata $metadata, array $emConfig): void { ->length(255) ->build(); - fieldWithUtf8Charset($builder->createField('longUrl', Types::STRING), $emConfig) + fieldWithUtf8Charset($builder->createField('longUrl', Types::TEXT), $emConfig) ->columnName('long_url') - ->length(2048) ->build(); $builder->createManyToOne('shortUrl', ShortUrl\Entity\ShortUrl::class) diff --git a/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.ShortUrl.Entity.ShortUrl.php b/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.ShortUrl.Entity.ShortUrl.php index 746ac3fd..f33530ec 100644 --- a/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.ShortUrl.Entity.ShortUrl.php +++ b/module/Core/config/entities-mappings/Shlinkio.Shlink.Core.ShortUrl.Entity.ShortUrl.php @@ -23,9 +23,8 @@ return static function (ClassMetadata $metadata, array $emConfig): void { ->option('unsigned', true) ->build(); - fieldWithUtf8Charset($builder->createField('longUrl', Types::STRING), $emConfig) + fieldWithUtf8Charset($builder->createField('longUrl', Types::TEXT), $emConfig) ->columnName('original_url') // Rename to long_url some day? ¯\_(ツ)_/¯ - ->length(2048) ->build(); fieldWithUtf8Charset($builder->createField('shortCode', Types::STRING), $emConfig, 'bin') diff --git a/module/Core/migrations/Version20240220214031.php b/module/Core/migrations/Version20240220214031.php new file mode 100644 index 00000000..0cf56094 --- /dev/null +++ b/module/Core/migrations/Version20240220214031.php @@ -0,0 +1,27 @@ +connection->getDatabasePlatform() instanceof MySQLPlatform); + } +} From d1a6e60b01649c975b3505f19ab628aa8d846263 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Thu, 22 Feb 2024 09:35:14 +0100 Subject: [PATCH 2/2] Add migration to update long URLs columns to text type --- CHANGELOG.md | 3 +- .../Core/migrations/Version20240220214031.php | 31 ++++++++++++++++++- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9f51f641..f1cf0b8d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,7 +25,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com), and this * [#1786](https://github.com/shlinkio/shlink/issues/1786) Run API tests with RoadRunner by default. * [#2008](https://github.com/shlinkio/shlink/issues/2008) Update to Doctrine ORM 3.0. * [#2010](https://github.com/shlinkio/shlink/issues/2010) Update to Symfony 7.0 components. -* [#2016](https://github.com/shlinkio/shlink/issues/2016) Simplify and improve how code coverage is generated in API and CLI tests". +* [#2016](https://github.com/shlinkio/shlink/issues/2016) Simplify and improve how code coverage is generated in API and CLI tests. +* [#1674](https://github.com/shlinkio/shlink/issues/1674) Database columns persisting long URLs have now `TEXT` type, which allows for much longer values. ### Deprecated * *Nothing* diff --git a/module/Core/migrations/Version20240220214031.php b/module/Core/migrations/Version20240220214031.php index 0cf56094..b8dc12fd 100644 --- a/module/Core/migrations/Version20240220214031.php +++ b/module/Core/migrations/Version20240220214031.php @@ -6,18 +6,47 @@ namespace ShlinkMigrations; use Doctrine\DBAL\Platforms\MySQLPlatform; use Doctrine\DBAL\Schema\Schema; +use Doctrine\DBAL\Types\Type; +use Doctrine\DBAL\Types\Types; use Doctrine\Migrations\AbstractMigration; +use function in_array; + final class Version20240220214031 extends AbstractMigration { + private const DOMAINS_COLUMNS = ['base_url_redirect', 'regular_not_found_redirect', 'invalid_short_url_redirect']; + private const TEXT_COLUMNS = [ + 'domains' => self::DOMAINS_COLUMNS, + 'device_long_urls' => ['long_url'], + 'short_urls' => ['original_url'], + ]; + public function up(Schema $schema): void { + $textType = Type::getType(Types::TEXT); + foreach (self::TEXT_COLUMNS as $table => $columns) { + $t = $schema->getTable($table); + + foreach ($columns as $column) { + $c = $t->getColumn($column); + + if ($c->getType() === $textType) { + continue; + } + + if (in_array($column, self::DOMAINS_COLUMNS, true)) { + // Domain columns had an incorrect length + $t->modifyColumn($column, ['length' => 2048]); + } + $c->setType($textType); + } + } } public function down(Schema $schema): void { - + // Can't revert from TEXT to STRING, as it's bigger } public function isTransactional(): bool