Skip to content

Commit d2d140b

Browse files
IgorBenkoSeldaek
andauthored
Change audit record types to use consistent past-tense pattern (#1598)
Co-authored-by: Jordi Boggiano <[email protected]>
1 parent e635019 commit d2d140b

File tree

5 files changed

+92
-13
lines changed

5 files changed

+92
-13
lines changed

src/Audit/AuditRecordType.php

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,27 +15,28 @@
1515
enum AuditRecordType: string
1616
{
1717
// package ownership
18-
case AddMaintainer = 'add_maintainer'; // TODO
19-
case RemoveMaintainer = 'remove_maintainer'; // TODO
20-
case TransferPackage = 'transfer_package'; // TODO
18+
case MaintainerAdded = 'maintainer_added'; // TODO
19+
case MaintainerRemoved = 'maintainer_removed'; // TODO
20+
case PackageTransferred = 'package_transferred'; // TODO
2121

2222
// package management
2323
case PackageCreated = 'package_created';
2424
case PackageDeleted = 'package_deleted';
25-
case CanonicalUrlChange = 'canonical_url_change';
25+
case CanonicalUrlChanged = 'canonical_url_changed';
2626
case VersionDeleted = 'version_deleted';
27-
case VersionReferenceChange = 'version_reference_change';
27+
28+
case VersionReferenceChanged = 'version_reference_changed';
2829
case PackageAbandoned = 'package_abandoned'; // TODO
2930
case PackageUnabandoned = 'package_unabandoned'; // TODO
3031

3132
// user management
3233
case UserCreated = 'user_created'; // TODO
3334
case UserDeleted = 'user_deleted'; // TODO
34-
case PasswordResetRequest = 'password_reset_request'; // TODO
35+
case PasswordResetRequested = 'password_reset_requested'; // TODO
3536
case PasswordReset = 'password_reset'; // TODO
36-
case PasswordChange = 'password_change'; // TODO
37-
case EmailChange = 'email_change'; // TODO
38-
case UsernameChange = 'username_change'; // TODO
37+
case PasswordChanged = 'password_changed'; // TODO
38+
case EmailChanged = 'email_changed'; // TODO
39+
case UsernameChanged = 'username_changed'; // TODO
3940
case GitHubLinkedWithUser = 'github_linked_with_user'; // TODO
4041
case GitHubDisconnectedFromUser = 'github_disconnected_from_user'; // TODO
4142
case TwoFaActivated = 'two_fa_activated'; // TODO
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
<?php declare(strict_types=1);
2+
3+
/*
4+
* This file is part of Packagist.
5+
*
6+
* (c) Jordi Boggiano <[email protected]>
7+
* Nils Adermann <[email protected]>
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\Command;
14+
15+
use App\Util\DoctrineTrait;
16+
use Doctrine\Persistence\ManagerRegistry;
17+
use Symfony\Component\Console\Command\Command;
18+
use Symfony\Component\Console\Input\InputInterface;
19+
use Symfony\Component\Console\Output\OutputInterface;
20+
21+
class MigrateAuditRecordTypesCommand extends Command
22+
{
23+
use DoctrineTrait;
24+
25+
private const array TYPE_MAPPING = [
26+
'canonical_url_change' => 'canonical_url_changed',
27+
'version_reference_change' => 'version_reference_changed',
28+
];
29+
30+
public function __construct(
31+
private readonly ManagerRegistry $doctrine,
32+
) {
33+
parent::__construct();
34+
}
35+
36+
protected function configure(): void
37+
{
38+
$this
39+
->setName('packagist:migrate-audit-record-types')
40+
->setDescription('Migrate audit record type values to new naming convention')
41+
->setDefinition([
42+
])
43+
;
44+
}
45+
46+
protected function execute(InputInterface $input, OutputInterface $output): int
47+
{
48+
$connection = $this->getEM()->getConnection();
49+
50+
$totalUpdated = 0;
51+
52+
foreach (self::TYPE_MAPPING as $oldType => $newType) {
53+
$output->writeln("Migrating '$oldType' to '$newType'...");
54+
55+
try {
56+
$updatedRows = $connection->executeStatement(
57+
'UPDATE audit_log SET type = ? WHERE type = ?',
58+
[$newType, $oldType]
59+
);
60+
61+
$totalUpdated += $updatedRows;
62+
63+
if ($updatedRows === 0) {
64+
$output->writeln(" No records found for type '$oldType'");
65+
} else {
66+
$output->writeln(" Updated $updatedRows records");
67+
}
68+
} catch (\Exception $e) {
69+
$output->writeln("<error>Failed to update records for type '$oldType': {$e->getMessage()}</error>");
70+
return Command::FAILURE;
71+
}
72+
}
73+
74+
$output->writeln("<info>Migration completed successfully. Total records updated: {$totalUpdated}</info>");
75+
76+
return Command::SUCCESS;
77+
}
78+
}

src/Entity/AuditRecord.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ public static function packageDeleted(Package $package, ?User $actor): self
6262

6363
public static function canonicalUrlChange(Package $package, ?User $actor, string $oldRepository): self
6464
{
65-
return new self(AuditRecordType::CanonicalUrlChange, ['name' => $package->getName(), 'repository_from' => $oldRepository, 'repository_to' => $package->getRepository(), 'actor' => self::getUserData($actor)], $actor?->getId(), $package->getVendor(), $package->getId());
65+
return new self(AuditRecordType::CanonicalUrlChanged, ['name' => $package->getName(), 'repository_from' => $oldRepository, 'repository_to' => $package->getRepository(), 'actor' => self::getUserData($actor)], $actor?->getId(), $package->getVendor(), $package->getId());
6666
}
6767

6868
public static function versionDeleted(Version $version, ?User $actor): self
@@ -77,7 +77,7 @@ public static function versionReferenceChange(Version $version, ?string $oldSour
7777
$package = $version->getPackage();
7878

7979
return new self(
80-
AuditRecordType::VersionReferenceChange,
80+
AuditRecordType::VersionReferenceChanged,
8181
['name' => $package->getName(), 'version' => $version->getVersion(), 'source_from' => $oldSourceReference, 'source_to' => $version->getSource()['reference'] ?? null, 'dist_from' => $oldDistReference, 'dist_to' => $version->getDist()['reference'] ?? null],
8282
vendor: $package->getVendor(),
8383
packageId: $package->getId()

tests/Audit/PackageAuditRecordTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ public function testPackageChangesGetRecorded(): void
5656

5757
$logs = $container->get(Connection::class)->fetchAllAssociative('SELECT * FROM audit_log ORDER BY id DESC');
5858
self::assertCount(2, $logs);
59-
self::assertSame(AuditRecordType::CanonicalUrlChange->value, $logs[0]['type']);
59+
self::assertSame(AuditRecordType::CanonicalUrlChanged->value, $logs[0]['type']);
6060
self::assertSame('{"name": "composer/composer", "actor": "unknown", "repository_to": "https://github.com/composer/packagist", "repository_from": "https://github.com/composer/composer"}', $logs[0]['attributes']);
6161

6262
$em->remove($package);

tests/Audit/VersionAuditRecordTest.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ public function testVersionChangesGetRecorded(): void
6565

6666
$logs = $container->get(Connection::class)->fetchAllAssociative('SELECT * FROM audit_log ORDER BY id DESC');
6767
self::assertCount(2, $logs); // package creation + version reference change
68-
self::assertSame(AuditRecordType::VersionReferenceChange->value, $logs[0]['type']);
68+
self::assertSame(AuditRecordType::VersionReferenceChanged->value, $logs[0]['type']);
6969
self::assertSame('{"name": "composer/composer", "dist_to": "new-dist-ref", "version": "1.0.0", "dist_from": "old-dist-ref", "source_to": "new-source-ref", "source_from": null}', $logs[0]['attributes']);
7070

7171
// verify that unrelated changes do not create new audit logs

0 commit comments

Comments
 (0)