Skip to content

Commit 7be3828

Browse files
committed
Create separate message handler to update package links
1 parent f70d460 commit 7be3828

5 files changed

Lines changed: 106 additions & 35 deletions

File tree

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace CodedMonkey\Dirigent\Doctrine\EventListener;
4+
5+
use CodedMonkey\Dirigent\Doctrine\Entity\Package;
6+
use CodedMonkey\Dirigent\Doctrine\Repository\PackageRepository;
7+
use Doctrine\Bundle\DoctrineBundle\Attribute\AsEntityListener;
8+
use Doctrine\ORM\Event\PreRemoveEventArgs;
9+
use Doctrine\ORM\Events;
10+
11+
#[AsEntityListener(Events::preRemove, entity: Package::class)]
12+
class PackageListener
13+
{
14+
public function preRemove(Package $package, PreRemoveEventArgs $event): void
15+
{
16+
/** @var PackageRepository $repository */
17+
$repository = $event->getObjectManager()->getRepository(Package::class);
18+
19+
// Delete existing package links
20+
$repository->deletePackageLinks($package);
21+
}
22+
}

src/Doctrine/Repository/PackageRepository.php

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
namespace CodedMonkey\Dirigent\Doctrine\Repository;
44

55
use CodedMonkey\Dirigent\Doctrine\Entity\Package;
6+
use CodedMonkey\Dirigent\Doctrine\Entity\Version;
67
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
8+
use Doctrine\DBAL\Connection;
79
use Doctrine\Persistence\ManagerRegistry;
810
use Symfony\Component\DependencyInjection\Attribute\Autowire;
911

@@ -40,8 +42,6 @@ public function save(Package $entity, bool $flush = false): void
4042

4143
public function remove(Package $entity, bool $flush = false): void
4244
{
43-
$this->deletePackageLinks($entity->getId());
44-
4545
$this->getEntityManager()->remove($entity);
4646

4747
if ($flush) {
@@ -85,55 +85,64 @@ public function getStalePackageIds(): array
8585
);
8686
}
8787

88-
public function updatePackageLinks(int $packageId, int $versionId): void
88+
public function updatePackageLinks(Package $package, Version $version): void
8989
{
9090
$connection = $this->getEntityManager()->getConnection();
91-
$connection->beginTransaction();
92-
93-
try {
94-
$this->deletePackageLinks($packageId);
91+
$connection->transactional(function(Connection $connection) use ($package, $version) {
92+
$this->deletePackageLinks($package);
93+
$queryParameters = ['id' => $package->getId(), 'version' => $version->getId()];
9594

96-
$connection->executeStatement(<<<'SQL'
95+
$connection->executeStatement(
96+
<<<'SQL'
9797
INSERT INTO package_provide_link (linked_package_name, implementation, package_id)
9898
SELECT linked_package_name, FALSE, :id
9999
FROM version_provide_link
100100
WHERE version_id = :version AND linked_package_name NOT LIKE '%-implementation'
101101
SQL,
102-
['id' => $packageId, 'version' => $versionId],
102+
$queryParameters,
103103
);
104-
$connection->executeStatement(<<<'SQL'
104+
$connection->executeStatement(
105+
<<<'SQL'
105106
INSERT INTO package_provide_link (linked_package_name, implementation, package_id)
106107
SELECT SUBSTRING(linked_package_name, 1, LENGTH(linked_package_name) - 15), TRUE, :id
107108
FROM version_provide_link
108109
WHERE version_id = :version AND linked_package_name LIKE '%-implementation'
109110
SQL,
110-
['id' => $packageId, 'version' => $versionId],
111+
$queryParameters,
111112
);
112113
$connection->executeStatement(
113-
'INSERT INTO package_require_link (linked_package_name, dev_dependency, package_id) SELECT linked_package_name, FALSE, :id FROM version_require_link WHERE version_id = :version',
114-
['id' => $packageId, 'version' => $versionId],
114+
<<<'SQL'
115+
INSERT INTO package_require_link (linked_package_name, dev_dependency, package_id)
116+
SELECT linked_package_name, FALSE, :id FROM version_require_link WHERE version_id = :version
117+
SQL,
118+
$queryParameters,
115119
);
116120
$connection->executeStatement(
117-
'INSERT INTO package_require_link (linked_package_name, dev_dependency, package_id) SELECT linked_package_name, TRUE, :id FROM version_dev_require_link WHERE version_id = :version',
118-
['id' => $packageId, 'version' => $versionId],
121+
<<<'SQL'
122+
INSERT INTO package_require_link (linked_package_name, dev_dependency, package_id)
123+
SELECT linked_package_name, TRUE, :id FROM version_dev_require_link WHERE version_id = :version
124+
SQL,
125+
$queryParameters,
119126
);
120127
$connection->executeStatement(
121-
'INSERT INTO package_suggest_link (linked_package_name, package_id) SELECT linked_package_name, :id FROM version_suggest_link WHERE version_id = :version',
122-
['id' => $packageId, 'version' => $versionId],
128+
<<<'SQL'
129+
INSERT INTO package_suggest_link (linked_package_name, package_id)
130+
SELECT linked_package_name, :id FROM version_suggest_link WHERE version_id = :version
131+
SQL,
132+
$queryParameters,
123133
);
124-
} catch (\Throwable $exception) {
125-
$connection->rollBack();
126-
throw $exception;
127-
}
128-
129-
$connection->commit();
134+
});
130135
}
131136

132-
public function deletePackageLinks(int $packageId): void
137+
public function deletePackageLinks(Package $package): void
133138
{
134139
$connection = $this->getEntityManager()->getConnection();
135-
$connection->executeStatement('DELETE FROM package_provide_link WHERE package_id = :id', ['id' => $packageId]);
136-
$connection->executeStatement('DELETE FROM package_require_link WHERE package_id = :id', ['id' => $packageId]);
137-
$connection->executeStatement('DELETE FROM package_suggest_link WHERE package_id = :id', ['id' => $packageId]);
140+
$connection->transactional(function(Connection $connection) use ($package) {
141+
$queryParameters = ['id' => $package->getId()];
142+
143+
$connection->executeStatement('DELETE FROM package_provide_link WHERE package_id = :id', $queryParameters);
144+
$connection->executeStatement('DELETE FROM package_require_link WHERE package_id = :id', $queryParameters);
145+
$connection->executeStatement('DELETE FROM package_suggest_link WHERE package_id = :id', $queryParameters);
146+
});
138147
}
139148
}

src/Message/UpdatePackageLinks.php

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace CodedMonkey\Dirigent\Message;
4+
5+
readonly class UpdatePackageLinks
6+
{
7+
public function __construct(
8+
public int $packageId,
9+
public string $versionName,
10+
) {
11+
}
12+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
<?php
2+
3+
namespace CodedMonkey\Dirigent\Message;
4+
5+
use CodedMonkey\Dirigent\Doctrine\Repository\PackageRepository;
6+
use CodedMonkey\Dirigent\Doctrine\Repository\VersionRepository;
7+
use Symfony\Component\Messenger\Attribute\AsMessageHandler;
8+
9+
#[AsMessageHandler]
10+
readonly class UpdatePackageLinksHandler
11+
{
12+
public function __construct(
13+
private PackageRepository $packageRepository,
14+
private VersionRepository $versionRepository,
15+
) {
16+
}
17+
18+
public function __invoke(UpdatePackageLinks $message): void
19+
{
20+
$package = $this->packageRepository->find($message->packageId);
21+
$version = $this->versionRepository->findOneByNormalizedVersion($package, $message->versionName);
22+
23+
$this->packageRepository->updatePackageLinks($package, $version);
24+
}
25+
}

src/Package/PackageMetadataResolver.php

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,16 @@
2020
use CodedMonkey\Dirigent\Doctrine\Repository\RegistryRepository;
2121
use CodedMonkey\Dirigent\Doctrine\Repository\VersionRepository;
2222
use CodedMonkey\Dirigent\Message\DumpPackageProvider;
23+
use CodedMonkey\Dirigent\Message\UpdatePackageLinks;
2324
use Composer\Package\AliasPackage;
2425
use Composer\Package\CompletePackageInterface;
2526
use Composer\Pcre\Preg;
2627
use Composer\Repository\Vcs\VcsDriverInterface;
2728
use Doctrine\ORM\EntityManagerInterface;
29+
use Symfony\Component\Messenger\Envelope;
2830
use Symfony\Component\Messenger\MessageBusInterface;
31+
use Symfony\Component\Messenger\Stamp\DispatchAfterCurrentBusStamp;
32+
use Symfony\Component\Messenger\Stamp\TransportNamesStamp;
2933

3034
readonly class PackageMetadataResolver
3135
{
@@ -57,7 +61,6 @@ public function __construct(
5761
private MessageBusInterface $messenger,
5862
private EntityManagerInterface $entityManager,
5963
private RegistryRepository $registryRepository,
60-
private PackageRepository $packageRepository,
6164
private VersionRepository $versionRepository,
6265
) {
6366
}
@@ -164,8 +167,7 @@ private function resolveVcsRepository(Package $package): void
164167
private function updatePackage(Package $package, array $composerPackages, ?VcsDriverInterface $driver = null): void
165168
{
166169
$existingVersions = $this->versionRepository->getVersionMetadataForUpdate($package);
167-
$processedVersions = [];
168-
/** @var ?string $primaryVersionName Version name to use as package link source */
170+
/** @var ?string $primaryVersionName Version name to use as the package link source */
169171
$primaryVersionName = null;
170172

171173
foreach ($composerPackages as $composerPackage) {
@@ -191,14 +193,15 @@ private function updatePackage(Package $package, array $composerPackages, ?VcsDr
191193
$primaryVersionName = $versionName;
192194
}
193195

194-
$processedVersions[$versionName] = $version;
195196
unset($existingVersions[$versionName]);
196197
}
197198

198199
if ($primaryVersionName) {
199-
$primaryVersion = $processedVersions[$primaryVersionName];
200-
201-
$this->packageRepository->updatePackageLinks($package->getId(), $primaryVersion->getId());
200+
$message = new Envelope(new UpdatePackageLinks($package->getId(), $primaryVersionName), [
201+
new DispatchAfterCurrentBusStamp(),
202+
new TransportNamesStamp('async'),
203+
]);
204+
$this->messenger->dispatch($message);
202205
}
203206

204207
// Remove outdated versions
@@ -382,7 +385,7 @@ private function updateVersion(Package $package, Version $version, CompletePacka
382385
$version->setReadme(null);
383386
}
384387

385-
$this->versionRepository->save($version, true);
388+
$em->persist($version);
386389
}
387390

388391
private function sanitize(?string $str): ?string

0 commit comments

Comments
 (0)