diff --git a/CHANGELOG.md b/CHANGELOG.md index 7d2459b1..d28ef51f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,7 +4,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com), and this project adheres to [Semantic Versioning](https://semver.org). -## [Unreleased] +## 2.0.1 - 2020-01-10 #### Added @@ -26,6 +26,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com), and this * [#607](https://github.com/shlinkio/shlink/issues/607) Added missing info on UPGRADE.md doc. * [#610](https://github.com/shlinkio/shlink/issues/610) Fixed use of hardcoded quotes on a database migration which makes it fail on postgres. +* [#605](https://github.com/shlinkio/shlink/issues/605) Fixed crashes occurring when migrating from old Shlink versions with nullable DB columns that are assigned to non-nullable entity typed props. ## 2.0.0 - 2020-01-08 diff --git a/data/migrations/Version20200110182849.php b/data/migrations/Version20200110182849.php new file mode 100644 index 00000000..16b858f9 --- /dev/null +++ b/data/migrations/Version20200110182849.php @@ -0,0 +1,53 @@ + [ + 'referer', + 'user_agent', + ], + 'visit_locations' => [ + 'timezone', + 'country_code', + 'country_name', + 'region_name', + 'city_name', + ], + ]; + + public function up(Schema $schema): void + { + each( + self::COLUMN_DEFAULTS_MAP, + fn (array $columns, string $tableName) => + each($columns, partial_left([$this, 'setDefaultValueForColumnInTable'], $tableName)), + ); + } + + public function setDefaultValueForColumnInTable(string $tableName, string $columnName): void + { + $qb = $this->connection->createQueryBuilder(); + $qb->update($tableName) + ->set($columnName, ':emptyValue') + ->setParameter('emptyValue', self::DEFAULT_EMPTY_VALUE) + ->where($qb->expr()->isNull($columnName)) + ->execute(); + } + + public function down(Schema $schema): void + { + // No need (and no way) to undo this migration + } +} diff --git a/module/Core/src/Entity/ShortUrl.php b/module/Core/src/Entity/ShortUrl.php index a48a93fa..2e14bb3f 100644 --- a/module/Core/src/Entity/ShortUrl.php +++ b/module/Core/src/Entity/ShortUrl.php @@ -29,9 +29,9 @@ class ShortUrl extends AbstractEntity private Collection $visits; /** @var Collection|Tag[] */ private Collection $tags; - private ?Chronos $validSince; - private ?Chronos $validUntil; - private ?int $maxVisits; + private ?Chronos $validSince = null; + private ?Chronos $validUntil = null; + private ?int $maxVisits = null; private ?Domain $domain; private bool $customSlugWasProvided; diff --git a/module/Core/src/Entity/Visit.php b/module/Core/src/Entity/Visit.php index 8ada8176..d278ed6a 100644 --- a/module/Core/src/Entity/Visit.php +++ b/module/Core/src/Entity/Visit.php @@ -15,10 +15,10 @@ use Shlinkio\Shlink\Core\Visit\Model\VisitLocationInterface; class Visit extends AbstractEntity implements JsonSerializable { - private string $referer = ''; + private string $referer; private Chronos $date; private ?string $remoteAddr = null; - private string $userAgent = ''; + private string $userAgent; private ShortUrl $shortUrl; private ?VisitLocation $visitLocation = null;