-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathUpdatePackageHandler.php
More file actions
65 lines (50 loc) · 2.22 KB
/
UpdatePackageHandler.php
File metadata and controls
65 lines (50 loc) · 2.22 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
<?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
{
use PackageHandlerTrait;
private ?\DateInterval $dynamicUpdateDelay;
public function __construct(
private PackageRepository $packageRepository,
private PackageMetadataResolver $metadataResolver,
#[Autowire(param: 'dirigent.packages.dynamic_update_delay')]
?string $dynamicUpdateDelay,
) {
$this->dynamicUpdateDelay = $dynamicUpdateDelay ? new \DateInterval($dynamicUpdateDelay) : null;
}
public function __invoke(UpdatePackage $message): void
{
$package = $this->getPackage($this->packageRepository, $message->packageId);
if ($message->scheduled && !$package->isUpdateScheduled()) {
// Package was already updated between being scheduled and now,
// so stop the update to prevent excessive requests
return;
}
if ($message->source->isDynamic() && $this->isFreshDynamicUpdate($package)) {
// Package was recently updated
return;
}
$this->metadataResolver->resolve($package);
$package->setUpdateScheduledAt(null);
$this->packageRepository->save($package, true);
}
private function isFreshDynamicUpdate(Package $package): bool
{
// If the package was never updated, it's always stale
if (null === $lastUpdatedAt = $package->getUpdatedAt()) {
return false;
}
// Override update delay from registry
$dynamicUpdateDelay = $package->getMirrorRegistry()?->getDynamicUpdateDelay() ?? $this->dynamicUpdateDelay;
$freshFrom = (new \DateTimeImmutable())->setTimezone(new \DateTimeZone('UTC'));
$freshFrom = $freshFrom->sub($dynamicUpdateDelay ?? new \DateInterval('PT0'));
// Check if the package was updated recently, and therefore fresh
return $freshFrom < $lastUpdatedAt;
}
}