Skip to content

Commit

Permalink
fix migrations of dates with wrong timezone (#3729)
Browse files Browse the repository at this point in the history
  • Loading branch information
vitek-rostislav authored Jan 13, 2025
2 parents 3b85113 + 2cc25e8 commit e60d485
Showing 1 changed file with 92 additions and 22 deletions.
114 changes: 92 additions & 22 deletions app/src/Migrations/Version20240111153621.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
use DateTime;
use DateTimeZone;
use Doctrine\DBAL\Schema\Schema;
use Shopsys\FrameworkBundle\Component\Domain\Domain;
use Shopsys\FrameworkBundle\Migrations\MultidomainMigrationTrait;
use Shopsys\MigrationBundle\Component\Doctrine\Migrations\AbstractMigration;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
Expand All @@ -21,31 +20,102 @@ class Version20240111153621 extends AbstractMigration implements ContainerAwareI
*/
public function up(Schema $schema): void
{
$firstDomainTimeZone = $this->getDomain()->getDomainConfigById(Domain::FIRST_DOMAIN_ID)->getDateTimeZone();
$utcTimeZone = new DateTimeZone('UTC');
$dateTime = new DateTime('now', $utcTimeZone);
$timeOffsetInHours = timezone_offset_get($firstDomainTimeZone, $dateTime) / 3600;
$this->convertAdvertDates();
$this->convertNotificationBarDates();
$this->convertSliderItemDates();
}

$this->sql(
sprintf('UPDATE adverts SET datetime_visible_from = datetime_visible_from - INTERVAL \'%d hour\' WHERE datetime_visible_from IS NOT NULL;', $timeOffsetInHours),
);
$this->sql(
sprintf('UPDATE adverts SET datetime_visible_to = datetime_visible_to - INTERVAL \'%d hour\' WHERE datetime_visible_to IS NOT NULL;', $timeOffsetInHours),
);
/**
* @param string|null $dateTimeString
* @return \DateTime|null
*/
private function convertDateTime(?string $dateTimeString): ?DateTime
{
if ($dateTimeString === null) {
return null;
}

$this->sql(
sprintf('UPDATE notification_bars SET validity_from = validity_from - INTERVAL \'%d hour\' WHERE validity_from IS NOT NULL;', $timeOffsetInHours),
);
$this->sql(
sprintf('UPDATE notification_bars SET validity_to = validity_to - INTERVAL \'%d hour\' WHERE validity_to IS NOT NULL;', $timeOffsetInHours),
$dateTime = new DateTime(
$dateTimeString,
new DateTimeZone('Europe/Prague'),
);
$dateTime->setTimezone(new DateTimeZone('UTC'));

$this->sql(
sprintf('UPDATE slider_items SET datetime_visible_from = datetime_visible_from - INTERVAL \'%d hour\' WHERE datetime_visible_from IS NOT NULL;', $timeOffsetInHours),
);
$this->sql(
sprintf('UPDATE slider_items SET datetime_visible_to = datetime_visible_to - INTERVAL \'%d hour\' WHERE datetime_visible_to IS NOT NULL;', $timeOffsetInHours),
);
return $dateTime;
}

private function convertAdvertDates(): void
{
$adverts = $this->sql('SELECT id, datetime_visible_from, datetime_visible_to FROM adverts')->fetchAllAssociative();

foreach ($adverts as $advert) {
$visibleFrom = $this->convertDateTime($advert['datetime_visible_from']);
$visibleTo = $this->convertDateTime($advert['datetime_visible_to']);

$this->sql(
'UPDATE adverts SET datetime_visible_from = :visibleFrom, datetime_visible_to = :visibleTo WHERE id = :id',
[
'visibleFrom' => $visibleFrom,
'visibleTo' => $visibleTo,
'id' => $advert['id'],
],
[
'visibleFrom' => 'datetime',
'visibleTo' => 'datetime',
'id' => 'integer',
],
);
}
}

private function convertNotificationBarDates(): void
{
$notificationBars = $this->sql('SELECT id, validity_from, validity_to FROM notification_bars')
->fetchAllAssociative();

foreach ($notificationBars as $notificationBar) {
$validityFrom = $this->convertDateTime($notificationBar['validity_from']);
$validityTo = $this->convertDateTime($notificationBar['validity_to']);

$this->sql(
'UPDATE notification_bars SET validity_from = :validityFrom, validity_to = :validityTo WHERE id = :id',
[
'validityFrom' => $validityFrom,
'validityTo' => $validityTo,
'id' => $notificationBar['id'],
],
[
'validityFrom' => 'datetime',
'validityTo' => 'datetime',
'id' => 'integer',
],
);
}
}

private function convertSliderItemDates(): void
{
$sliderItems = $this->sql('SELECT id, datetime_visible_from, datetime_visible_to FROM slider_items')
->fetchAllAssociative();

foreach ($sliderItems as $sliderItem) {
$visibleFrom = $this->convertDateTime($sliderItem['datetime_visible_from']);
$visibleTo = $this->convertDateTime($sliderItem['datetime_visible_to']);

$this->sql(
'UPDATE slider_items SET datetime_visible_from = :visibleFrom, datetime_visible_to = :visibleTo WHERE id = :id',
[
'visibleFrom' => $visibleFrom,
'visibleTo' => $visibleTo,
'id' => $sliderItem['id'],
],
[
'visibleFrom' => 'datetime',
'visibleTo' => 'datetime',
'id' => 'integer',
],
);
}
}

/**
Expand Down

0 comments on commit e60d485

Please sign in to comment.