Skip to content

Commit 6c32230

Browse files
Don't record VersionDeleted event if package was deleted
1 parent b2ced91 commit 6c32230

File tree

7 files changed

+76
-31
lines changed

7 files changed

+76
-31
lines changed

src/Command/CleanSpamPackagesCommand.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ protected function execute(InputInterface $input, OutputInterface $output): int
6666
}
6767
$output->write('.');
6868
foreach ($package->getVersions() as $version) {
69-
$versionRepo->remove($version);
69+
$versionRepo->remove($version, false);
7070
}
7171

7272
$this->providerManager->deletePackage($package);

src/Entity/VersionRepository.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
use Doctrine\ORM\QueryBuilder;
2121
use Doctrine\Persistence\ManagerRegistry;
2222
use Predis\Client;
23+
use Symfony\Bundle\SecurityBundle\Security;
2324

2425
/**
2526
* @author Jordi Boggiano <j.boggiano@seld.be>
@@ -34,6 +35,7 @@ public function __construct(
3435
ManagerRegistry $registry,
3536
private Client $redisCache,
3637
private VersionIdCache $versionIdCache,
38+
private readonly Security $security,
3739
) {
3840
parent::__construct($registry, Version::class);
3941
}
@@ -44,7 +46,7 @@ public function getEntityManager(): EntityManagerInterface
4446
return parent::getEntityManager();
4547
}
4648

47-
public function remove(Version $version): void
49+
public function remove(Version $version, bool $createAuditRecord = true): void
4850
{
4951
$em = $this->getEntityManager();
5052
$package = $version->getPackage();
@@ -66,6 +68,12 @@ public function remove(Version $version): void
6668
$em->getConnection()->executeQuery('DELETE FROM php_stat WHERE version=:version AND depth = :depth AND package_id=:packageId', ['version' => $version->getId(), 'depth' => PhpStat::DEPTH_EXACT, 'packageId' => $version->getPackage()->getId()]);
6769

6870
$em->remove($version);
71+
72+
if ($createAuditRecord) {
73+
$user = $this->security->getUser();
74+
$record = AuditRecord::versionDeleted($version, $user instanceof User ? $user : null);
75+
$em->persist($record);
76+
}
6977
}
7078

7179
/**

src/EventListener/VersionListener.php

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@
2121
use Doctrine\ORM\Event\PreUpdateEventArgs;
2222
use Doctrine\Persistence\Event\LifecycleEventArgs;
2323
use Doctrine\Persistence\ManagerRegistry;
24-
use Symfony\Bundle\SecurityBundle\Security;
2524

26-
#[AsEntityListener(event: 'preRemove', entity: Version::class)]
2725
#[AsEntityListener(event: 'preUpdate', entity: Version::class)]
2826
#[AsEntityListener(event: 'postUpdate', entity: Version::class)]
2927
class VersionListener
@@ -35,20 +33,9 @@ class VersionListener
3533

3634
public function __construct(
3735
private ManagerRegistry $doctrine,
38-
private Security $security,
3936
) {
4037
}
4138

42-
/**
43-
* @param LifecycleEventArgs<EntityManager> $event
44-
*/
45-
public function preRemove(Version $version, LifecycleEventArgs $event): void
46-
{
47-
$record = AuditRecord::versionDeleted($version, $this->getUser());
48-
$this->getEM()->persist($record);
49-
// let the record be flushed together with the entity
50-
}
51-
5239
public function preUpdate(Version $version, PreUpdateEventArgs $event): void
5340
{
5441
if (($event->hasChangedField('source') || $event->hasChangedField('dist')) && !$version->isDevelopment()) {
@@ -76,11 +63,4 @@ public function postUpdate(Version $version, LifecycleEventArgs $event): void
7663
$this->buffered = [];
7764
}
7865
}
79-
80-
private function getUser(): ?User
81-
{
82-
$user = $this->security->getUser();
83-
84-
return $user instanceof User ? $user : null;
85-
}
8666
}

src/Model/PackageManager.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public function deletePackage(Package $package): void
6262
{
6363
$versionRepo = $this->doctrine->getRepository(Version::class);
6464
foreach ($package->getVersions() as $version) {
65-
$versionRepo->remove($version);
65+
$versionRepo->remove($version, false);
6666
}
6767

6868
if ($package->getAutoUpdated() === Package::AUTO_GITHUB_HOOK) {

src/Package/Updater.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,6 @@ public function update(IOInterface $io, Config $config, Package $package, VcsRep
128128
$deleteDate = new \DateTimeImmutable('-1day');
129129

130130
$em = $this->getEM();
131-
$rootIdentifier = null;
132131

133132
$driver = $repository->getDriver();
134133
if (!$driver) {

tests/Audit/VersionAuditRecordTest.php

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -92,12 +92,5 @@ public function testVersionChangesGetRecorded(): void
9292

9393
$logs = $container->get(Connection::class)->fetchAllAssociative('SELECT * FROM audit_log ORDER BY id DESC');
9494
self::assertCount(2, $logs);
95-
96-
$em->remove($version);
97-
$em->flush();
98-
99-
$logs = $container->get(Connection::class)->fetchAllAssociative('SELECT * FROM audit_log ORDER BY id DESC');
100-
self::assertCount(3, $logs);
101-
self::assertSame(AuditRecordType::VersionDeleted->value, $logs[0]['type']);
10295
}
10396
}
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
<?php declare(strict_types=1);
2+
3+
/*
4+
* This file is part of Packagist.
5+
*
6+
* (c) Jordi Boggiano <j.boggiano@seld.be>
7+
* Nils Adermann <naderman@naderman.de>
8+
*
9+
* For the full copyright and license information, please view the LICENSE
10+
* file that was distributed with this source code.
11+
*/
12+
13+
namespace App\Tests\Entity;
14+
15+
use App\Audit\AuditRecordType;
16+
use App\Entity\AuditRecord;
17+
use App\Entity\Version;
18+
use App\Entity\VersionRepository;
19+
use App\Tests\IntegrationTestCase;
20+
21+
class VersionRepositoryTest extends IntegrationTestCase
22+
{
23+
private VersionRepository $versionRepository;
24+
25+
protected function setUp(): void
26+
{
27+
parent::setUp();
28+
29+
$this->versionRepository = self::getEM()->getRepository(Version::class);
30+
}
31+
32+
public function testRemoveVersionMarksForRemovalAndCreatesAuditRecord(): void
33+
{
34+
$em = self::getEM();
35+
36+
$package = self::createPackage('vendor/package', 'https://github.com/vendor/package');
37+
38+
$version = new Version();
39+
$version->setPackage($package);
40+
$version->setName($package->getName());
41+
$version->setVersion('1.0.0');
42+
$version->setNormalizedVersion('1.0.0.0');
43+
$version->setDevelopment(false);
44+
$version->setLicense([]);
45+
$version->setAutoload([]);
46+
$package->getVersions()->add($version);
47+
48+
$this->store($package, $version);
49+
50+
$versionId = $version->getId();
51+
$this->versionRepository->remove($version);
52+
53+
$em->flush();
54+
$em->clear();
55+
56+
$this->assertNull($this->versionRepository->find($versionId), 'Version was not deleted');
57+
58+
$auditRecord = $em->getRepository(AuditRecord::class)->findOneBy([
59+
'type' => AuditRecordType::VersionDeleted->value,
60+
'packageId' => $package->getId(),
61+
'actorId' => null,
62+
]);
63+
$this->assertNotNull($auditRecord, 'No audit record for version deletion created');
64+
}
65+
}

0 commit comments

Comments
 (0)