-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathUpdatePackageHandler.php
More file actions
66 lines (51 loc) · 2.09 KB
/
UpdatePackageHandler.php
File metadata and controls
66 lines (51 loc) · 2.09 KB
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
<?php
namespace CodedMonkey\Dirigent\Message;
use CodedMonkey\Dirigent\Doctrine\Entity\Package;
use CodedMonkey\Dirigent\Doctrine\Repository\PackageRepository;
use CodedMonkey\Dirigent\Package\PackageMetadataResolver;
use Symfony\Component\DependencyInjection\Attribute\Autowire;
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
#[AsMessageHandler]
readonly class UpdatePackageHandler
{
private \DateInterval $updateDelay;
public function __construct(
private PackageRepository $packageRepository,
private PackageMetadataResolver $metadataResolver,
#[Autowire(param: 'dirigent.packages.dynamic_updates')]
private bool $dynamicUpdatesEnabled,
#[Autowire(param: 'dirigent.packages.dynamic_update_delay')]
string $updateDelay,
) {
$this->updateDelay = new \DateInterval($updateDelay);
}
public function __invoke(UpdatePackage $message): void
{
if (!$message->scheduled && !$message->forceRefresh && !$this->dynamicUpdatesEnabled) {
// Dynamic updates are disabled
return;
}
$package = $this->packageRepository->find($message->packageId);
if ($message->scheduled && null === $package->getUpdateScheduledAt()) {
// Package was already updated between being scheduled and now
return;
}
if (!$message->forceRefresh && $this->isFresh($package)) {
// Package was recently updated
return;
}
$this->metadataResolver->resolve($package);
$package->setUpdateScheduledAt(null);
$this->packageRepository->save($package, true);
}
private function isFresh(Package $package): bool
{
if (null === $lastUpdatedAt = $package->getUpdatedAt()) {
return false;
}
$updateDelay = $package->getMirrorRegistry()?->getDynamicUpdateDelay() ?? $this->updateDelay;
$now = (new \DateTimeImmutable())->setTimezone(new \DateTimeZone('UTC'));
$before = $now->sub($updateDelay);
return $before->getTimestamp() < $lastUpdatedAt->getTimestamp();
}
}