Spaces:
No application file
No application file
File size: 4,725 Bytes
d2897cd |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
<?php
declare(strict_types=1);
namespace Mautic\IntegrationsBundle\Sync\Helper;
use Doctrine\DBAL\Connection;
use Mautic\IntegrationsBundle\Sync\SyncDataExchange\MauticSyncDataExchange;
class SyncDateHelper
{
private ?\DateTimeInterface $syncFromDateTime = null;
private ?\DateTimeInterface $syncToDateTime = null;
private ?\DateTimeImmutable $syncDateTime = null;
/**
* @var \DateTimeInterface[]
*/
private array $lastObjectSyncDates = [];
private ?\DateTimeInterface $internalSyncStartDateTime = null;
public function __construct(
private Connection $connection
) {
}
public function setSyncDateTimes(?\DateTimeInterface $fromDateTime = null, ?\DateTimeInterface $toDateTime = null): void
{
$this->syncFromDateTime = $fromDateTime;
$this->syncToDateTime = $toDateTime;
$this->syncDateTime = new \DateTimeImmutable('now', new \DateTimeZone('UTC'));
$this->lastObjectSyncDates = [];
}
public function getSyncFromDateTime(string $integration, string $object): \DateTimeInterface
{
if ($this->syncFromDateTime) {
// The command requested a specific start date so use it
return $this->syncFromDateTime;
}
$key = $integration.$object;
if (isset($this->lastObjectSyncDates[$key])) {
// Use the same sync date for integrations to paginate properly
return $this->lastObjectSyncDates[$key];
}
if (MauticSyncDataExchange::NAME !== $integration && $lastSync = $this->getLastSyncDateForObject($integration, $object)) {
// Use the latest sync date recorded
$this->lastObjectSyncDates[$key] = $lastSync;
} else {
// Otherwise, just sync the last 24 hours
$this->lastObjectSyncDates[$key] = new \DateTimeImmutable('-24 hours', new \DateTimeZone('UTC'));
}
return $this->lastObjectSyncDates[$key];
}
public function getSyncToDateTime(): ?\DateTimeInterface
{
if ($this->syncToDateTime) {
return $this->syncToDateTime;
}
return $this->syncDateTime;
}
public function getSyncDateTime(): ?\DateTimeInterface
{
return $this->syncDateTime;
}
/**
* @return \DateTimeImmutable|null
*/
public function getLastSyncDateForObject(string $integration, string $object): ?\DateTimeInterface
{
$qb = $this->connection->createQueryBuilder();
$result = $qb
->select('max(m.last_sync_date)')
->from(MAUTIC_TABLE_PREFIX.'sync_object_mapping', 'm')
->where(
$qb->expr()->eq('m.integration', ':integration'),
$qb->expr()->eq('m.integration_object_name', ':object')
)
->setParameter('integration', $integration)
->setParameter('object', $object)
->executeQuery()
->fetchOne();
if (!$result) {
return null;
}
$lastSync = new \DateTimeImmutable($result, new \DateTimeZone('UTC'));
// The last sync is out of the requested sync date/time range
if ($this->syncFromDateTime && $lastSync < $this->syncFromDateTime) {
return null;
}
// The last sync is out of the requested sync date/time range
if ($lastSync > $this->getSyncToDateTime()) {
return null;
}
return $lastSync;
}
public function getInternalSyncStartDateTime(): ?\DateTimeInterface
{
return $this->internalSyncStartDateTime;
}
public function setInternalSyncStartDateTime(): void
{
if ($this->internalSyncStartDateTime) {
return;
}
$this->internalSyncStartDateTime = $this->calculateInternalSyncStartDateTime();
}
private function calculateInternalSyncStartDateTime(): \DateTimeInterface
{
$now = new \DateTimeImmutable('now', new \DateTimeZone('UTC'));
// If there is no syncToDateTime value use "now"
if (!$this->getSyncToDateTime()) {
return $now;
}
// Clone it so that we don't modify the initial object
$syncToDateTime = clone $this->getSyncToDateTime();
// We should compare in UTC timezone
if (method_exists($syncToDateTime, 'setTimezone')) {
$syncToDateTime->setTimezone(new \DateTimeZone('UTC'));
}
// If syncToDate is less than now then use syncToDate, because otherwise we may delete
// changes that aren't supposed to be deleted from the sync_object_field_change_report table
return min($now, $syncToDateTime);
}
}
|