From d9e0c7679e9d2a6bb3ab13e80720a841496d1966 Mon Sep 17 00:00:00 2001 From: Steven Rombauts Date: Wed, 12 Nov 2025 17:30:59 +0100 Subject: [PATCH 1/4] Add display classes for maintainer added/removed records --- src/Audit/Display/AuditLogDisplayFactory.php | 12 ++++++ src/Audit/Display/MaintainerAddedDisplay.php | 37 +++++++++++++++++++ .../Display/MaintainerRemovedDisplay.php | 37 +++++++++++++++++++ .../display/maintainer_added.html.twig | 9 +++++ .../display/maintainer_removed.html.twig | 9 +++++ 5 files changed, 104 insertions(+) create mode 100644 src/Audit/Display/MaintainerAddedDisplay.php create mode 100644 src/Audit/Display/MaintainerRemovedDisplay.php create mode 100644 templates/audit_log/display/maintainer_added.html.twig create mode 100644 templates/audit_log/display/maintainer_removed.html.twig diff --git a/src/Audit/Display/AuditLogDisplayFactory.php b/src/Audit/Display/AuditLogDisplayFactory.php index 6b5adc905..1339682a3 100644 --- a/src/Audit/Display/AuditLogDisplayFactory.php +++ b/src/Audit/Display/AuditLogDisplayFactory.php @@ -34,6 +34,18 @@ public function build(iterable $auditRecords): array public function buildSingle(AuditRecord $record): AuditLogDisplayInterface { return match ($record->type) { + AuditRecordType::MaintainerAdded => new MaintainerAddedDisplay( + $record->datetime, + $record->attributes['name'], + $this->buildActor($record->attributes['maintainer']), + $this->buildActor($record->attributes['actor']), + ), + AuditRecordType::MaintainerRemoved => new MaintainerRemovedDisplay( + $record->datetime, + $record->attributes['name'], + $this->buildActor($record->attributes['maintainer']), + $this->buildActor($record->attributes['actor']), + ), AuditRecordType::PackageCreated => new PackageCreatedDisplay( $record->datetime, $record->attributes['name'], diff --git a/src/Audit/Display/MaintainerAddedDisplay.php b/src/Audit/Display/MaintainerAddedDisplay.php new file mode 100644 index 000000000..5f5c647b4 --- /dev/null +++ b/src/Audit/Display/MaintainerAddedDisplay.php @@ -0,0 +1,37 @@ + + * Nils Adermann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Audit\Display; + +use App\Audit\AuditRecordType; + +readonly class MaintainerAddedDisplay extends AbstractAuditLogDisplay +{ + public function __construct( + \DateTimeImmutable $datetime, + public string $packageName, + public ActorDisplay $maintainer, + ActorDisplay $actor, + ) { + parent::__construct($datetime, $actor); + } + + public function getType(): AuditRecordType + { + return AuditRecordType::MaintainerAdded; + } + + public function getTemplateName(): string + { + return 'audit_log/display/maintainer_added.html.twig'; + } +} diff --git a/src/Audit/Display/MaintainerRemovedDisplay.php b/src/Audit/Display/MaintainerRemovedDisplay.php new file mode 100644 index 000000000..1d9e78df7 --- /dev/null +++ b/src/Audit/Display/MaintainerRemovedDisplay.php @@ -0,0 +1,37 @@ + + * Nils Adermann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Audit\Display; + +use App\Audit\AuditRecordType; + +readonly class MaintainerRemovedDisplay extends AbstractAuditLogDisplay +{ + public function __construct( + \DateTimeImmutable $datetime, + public string $packageName, + public ActorDisplay $maintainer, + ActorDisplay $actor, + ) { + parent::__construct($datetime, $actor); + } + + public function getType(): AuditRecordType + { + return AuditRecordType::MaintainerRemoved; + } + + public function getTemplateName(): string + { + return 'audit_log/display/maintainer_removed.html.twig'; + } +} diff --git a/templates/audit_log/display/maintainer_added.html.twig b/templates/audit_log/display/maintainer_added.html.twig new file mode 100644 index 000000000..de8da3944 --- /dev/null +++ b/templates/audit_log/display/maintainer_added.html.twig @@ -0,0 +1,9 @@ + + {%- if display.packageName is existing_package -%} + {{ display.packageName }} + {%- else -%} + {{ display.packageName }} + {%- endif -%} +
+Maintainer: {{ display.maintainer.username }}
+Added by: {{ display.actor.username }} diff --git a/templates/audit_log/display/maintainer_removed.html.twig b/templates/audit_log/display/maintainer_removed.html.twig new file mode 100644 index 000000000..944a8939f --- /dev/null +++ b/templates/audit_log/display/maintainer_removed.html.twig @@ -0,0 +1,9 @@ + + {%- if display.packageName is existing_package -%} + {{ display.packageName }} + {%- else -%} + {{ display.packageName }} + {%- endif -%} +
+Maintainer: {{ display.maintainer.username }}
+Removed by: {{ display.actor.username }} From ca95f5147508b2f883c698f83d645e9e7bc27b11 Mon Sep 17 00:00:00 2001 From: Steven Rombauts Date: Wed, 12 Nov 2025 17:42:31 +0100 Subject: [PATCH 2/4] Add display class for package transferred records --- src/Audit/Display/AuditLogDisplayFactory.php | 7 +++ .../Display/PackageTransferredDisplay.php | 44 +++++++++++++++++++ .../display/maintainer_added.html.twig | 3 ++ .../display/package_transferred.html.twig | 10 +++++ 4 files changed, 64 insertions(+) create mode 100644 src/Audit/Display/PackageTransferredDisplay.php create mode 100644 templates/audit_log/display/package_transferred.html.twig diff --git a/src/Audit/Display/AuditLogDisplayFactory.php b/src/Audit/Display/AuditLogDisplayFactory.php index 1339682a3..52c591952 100644 --- a/src/Audit/Display/AuditLogDisplayFactory.php +++ b/src/Audit/Display/AuditLogDisplayFactory.php @@ -46,6 +46,13 @@ public function buildSingle(AuditRecord $record): AuditLogDisplayInterface $this->buildActor($record->attributes['maintainer']), $this->buildActor($record->attributes['actor']), ), + AuditRecordType::PackageTransferred => new PackageTransferredDisplay( + $record->datetime, + $record->attributes['name'], + $record->attributes['previous_maintainers'], + $record->attributes['current_maintainers'], + $this->buildActor($record->attributes['actor']), + ), AuditRecordType::PackageCreated => new PackageCreatedDisplay( $record->datetime, $record->attributes['name'], diff --git a/src/Audit/Display/PackageTransferredDisplay.php b/src/Audit/Display/PackageTransferredDisplay.php new file mode 100644 index 000000000..4c5fd96d5 --- /dev/null +++ b/src/Audit/Display/PackageTransferredDisplay.php @@ -0,0 +1,44 @@ + + * Nils Adermann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Audit\Display; + +use App\Audit\AuditRecordType; + +readonly class PackageTransferredDisplay extends AbstractAuditLogDisplay +{ + /** + * @param array $previousMaintainers + * @param array $currentMaintainers + */ + public function __construct( + \DateTimeImmutable $datetime, + public string $packageName, + /** @var array $previousMaintainers */ + public array $previousMaintainers, + /** @var array $currentMaintainers */ + public array $currentMaintainers, + ActorDisplay $actor, + ) { + parent::__construct($datetime, $actor); + } + + public function getType(): AuditRecordType + { + return AuditRecordType::PackageTransferred; + } + + public function getTemplateName(): string + { + return 'audit_log/display/package_transferred.html.twig'; + } +} diff --git a/templates/audit_log/display/maintainer_added.html.twig b/templates/audit_log/display/maintainer_added.html.twig index de8da3944..a05efe74f 100644 --- a/templates/audit_log/display/maintainer_added.html.twig +++ b/templates/audit_log/display/maintainer_added.html.twig @@ -1,9 +1,12 @@ +{% import "macros.html.twig" as packagist %} + {%- if display.packageName is existing_package -%} {{ display.packageName }} {%- else -%} {{ display.packageName }} {%- endif -%} + {{ packagist.packageLink(display.packageName, null) }}
Maintainer: {{ display.maintainer.username }}
Added by: {{ display.actor.username }} diff --git a/templates/audit_log/display/package_transferred.html.twig b/templates/audit_log/display/package_transferred.html.twig new file mode 100644 index 000000000..33ea8481a --- /dev/null +++ b/templates/audit_log/display/package_transferred.html.twig @@ -0,0 +1,10 @@ + + {%- if display.packageName is existing_package -%} + {{ display.packageName }} + {%- else -%} + {{ display.packageName }} + {%- endif -%} +
+Previous maintainers: {% for maintainer in display.previousMaintainers %}{{ maintainer.username }}{% if not loop.last %}, {% endif %}{% endfor %}
+Current maintainers: {% for maintainer in display.currentMaintainers %}{{ maintainer.username }}{% if not loop.last %}, {% endif %}{% endfor %}
+Transferred by: {{ display.actor.username }} \ No newline at end of file From 57e279db4cd38062af0d505ac7525e93f5bbb541 Mon Sep 17 00:00:00 2001 From: Steven Rombauts Date: Fri, 14 Nov 2025 09:46:38 +0100 Subject: [PATCH 3/4] Create a packageLink macro for audit log specifically --- .../display/canonical_url_changed.html.twig | 10 +++------- .../audit_log/display/maintainer_added.html.twig | 11 ++--------- .../audit_log/display/maintainer_removed.html.twig | 10 +++------- .../audit_log/display/package_created.html.twig | 10 +++------- .../audit_log/display/package_deleted.html.twig | 10 +++------- .../audit_log/display/package_transferred.html.twig | 12 ++++-------- .../audit_log/display/version_deleted.html.twig | 10 +++------- .../display/version_reference_changed.html.twig | 10 +++------- templates/audit_log/macros.html.twig | 7 +++++++ 9 files changed, 31 insertions(+), 59 deletions(-) create mode 100644 templates/audit_log/macros.html.twig diff --git a/templates/audit_log/display/canonical_url_changed.html.twig b/templates/audit_log/display/canonical_url_changed.html.twig index dfdc68bd1..d677c7091 100644 --- a/templates/audit_log/display/canonical_url_changed.html.twig +++ b/templates/audit_log/display/canonical_url_changed.html.twig @@ -1,10 +1,6 @@ - - {%- if display.packageName is existing_package -%} - {{ display.packageName }} - {%- else -%} - {{ display.packageName }} - {%- endif -%} -
+{% import 'audit_log/macros.html.twig' as auditLog %} + +{{ auditLog.packageLink(display.packageName) }}
From: {{ display.repositoryFrom }}
To: {{ display.repositoryTo }}
Changed by: {{ display.actor.username }} diff --git a/templates/audit_log/display/maintainer_added.html.twig b/templates/audit_log/display/maintainer_added.html.twig index a05efe74f..93164370e 100644 --- a/templates/audit_log/display/maintainer_added.html.twig +++ b/templates/audit_log/display/maintainer_added.html.twig @@ -1,12 +1,5 @@ -{% import "macros.html.twig" as packagist %} +{% import 'audit_log/macros.html.twig' as auditLog %} - - {%- if display.packageName is existing_package -%} - {{ display.packageName }} - {%- else -%} - {{ display.packageName }} - {%- endif -%} - {{ packagist.packageLink(display.packageName, null) }} -
+{{ auditLog.packageLink(display.packageName) }}
Maintainer: {{ display.maintainer.username }}
Added by: {{ display.actor.username }} diff --git a/templates/audit_log/display/maintainer_removed.html.twig b/templates/audit_log/display/maintainer_removed.html.twig index 944a8939f..e3ac196ae 100644 --- a/templates/audit_log/display/maintainer_removed.html.twig +++ b/templates/audit_log/display/maintainer_removed.html.twig @@ -1,9 +1,5 @@ - - {%- if display.packageName is existing_package -%} - {{ display.packageName }} - {%- else -%} - {{ display.packageName }} - {%- endif -%} -
+{% import 'audit_log/macros.html.twig' as auditLog %} + +{{ auditLog.packageLink(display.packageName) }}
Maintainer: {{ display.maintainer.username }}
Removed by: {{ display.actor.username }} diff --git a/templates/audit_log/display/package_created.html.twig b/templates/audit_log/display/package_created.html.twig index d93ad3bf4..7074c7d94 100644 --- a/templates/audit_log/display/package_created.html.twig +++ b/templates/audit_log/display/package_created.html.twig @@ -1,9 +1,5 @@ - - {%- if display.packageName is existing_package -%} - {{ display.packageName }} - {%- else -%} - {{ display.packageName }} - {%- endif -%} -
+{% import 'audit_log/macros.html.twig' as auditLog %} + +{{ auditLog.packageLink(display.packageName) }}
Repository: {{ display.repository }}
Created by: {{ display.actor.username }} diff --git a/templates/audit_log/display/package_deleted.html.twig b/templates/audit_log/display/package_deleted.html.twig index 6226e08ab..de7935199 100644 --- a/templates/audit_log/display/package_deleted.html.twig +++ b/templates/audit_log/display/package_deleted.html.twig @@ -1,9 +1,5 @@ - - {%- if display.packageName is existing_package -%} - {{ display.packageName }} - {%- else -%} - {{ display.packageName }} - {%- endif -%} -
+{% import 'audit_log/macros.html.twig' as auditLog %} + +{{ auditLog.packageLink(display.packageName) }}
Repository: {{ display.repository }}
Deleted by: {{ display.actor.username }} diff --git a/templates/audit_log/display/package_transferred.html.twig b/templates/audit_log/display/package_transferred.html.twig index 33ea8481a..4bcd108b4 100644 --- a/templates/audit_log/display/package_transferred.html.twig +++ b/templates/audit_log/display/package_transferred.html.twig @@ -1,10 +1,6 @@ - - {%- if display.packageName is existing_package -%} - {{ display.packageName }} - {%- else -%} - {{ display.packageName }} - {%- endif -%} -
+{% import 'audit_log/macros.html.twig' as auditLog %} + +{{ auditLog.packageLink(display.packageName) }}
Previous maintainers: {% for maintainer in display.previousMaintainers %}{{ maintainer.username }}{% if not loop.last %}, {% endif %}{% endfor %}
Current maintainers: {% for maintainer in display.currentMaintainers %}{{ maintainer.username }}{% if not loop.last %}, {% endif %}{% endfor %}
-Transferred by: {{ display.actor.username }} \ No newline at end of file +Transferred by: {{ display.actor.username }} diff --git a/templates/audit_log/display/version_deleted.html.twig b/templates/audit_log/display/version_deleted.html.twig index 099115614..11480ce78 100644 --- a/templates/audit_log/display/version_deleted.html.twig +++ b/templates/audit_log/display/version_deleted.html.twig @@ -1,8 +1,4 @@ - - {%- if display.packageName is existing_package -%} - {{ display.packageName }} - {%- else -%} - {{ display.packageName }} - {%- endif -%} - {{ display.version }}
+{% import 'audit_log/macros.html.twig' as auditLog %} + +{{ auditLog.packageLink(display.packageName) }} {{ display.version }}
Deleted by: {{ display.actor.username }} diff --git a/templates/audit_log/display/version_reference_changed.html.twig b/templates/audit_log/display/version_reference_changed.html.twig index fd3cddca2..b0522be30 100644 --- a/templates/audit_log/display/version_reference_changed.html.twig +++ b/templates/audit_log/display/version_reference_changed.html.twig @@ -1,10 +1,6 @@ - - {%- if display.packageName is existing_package -%} - {{ display.packageName }} - {%- else -%} - {{ display.packageName }} - {%- endif -%} - {{ display.version }}
+{% import 'audit_log/macros.html.twig' as auditLog %} + +{{ auditLog.packageLink(display.packageName) }} {{ display.version }}
{% if display.sourceFrom or display.sourceTo %} Source: {{ display.sourceFrom ?? 'none' }} → {{ display.sourceTo ?? 'none' }}
{% endif %} diff --git a/templates/audit_log/macros.html.twig b/templates/audit_log/macros.html.twig new file mode 100644 index 000000000..855acb325 --- /dev/null +++ b/templates/audit_log/macros.html.twig @@ -0,0 +1,7 @@ +{% macro packageLink(packageName) %} + {%- if packageName is existing_package -%} + {{ packageName }} + {%- else -%} + {{ packageName }} + {%- endif -%} +{% endmacro %} From b9a0fcf72eb2afb060a32fb5f695e213f3975668 Mon Sep 17 00:00:00 2001 From: Steven Rombauts Date: Fri, 14 Nov 2025 17:45:29 +0100 Subject: [PATCH 4/4] Update templates/audit_log/display/package_transferred.html.twig Co-authored-by: Igor Benko --- templates/audit_log/display/package_transferred.html.twig | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/templates/audit_log/display/package_transferred.html.twig b/templates/audit_log/display/package_transferred.html.twig index 4bcd108b4..0e8fa6c0d 100644 --- a/templates/audit_log/display/package_transferred.html.twig +++ b/templates/audit_log/display/package_transferred.html.twig @@ -1,6 +1,6 @@ {% import 'audit_log/macros.html.twig' as auditLog %} {{ auditLog.packageLink(display.packageName) }}
-Previous maintainers: {% for maintainer in display.previousMaintainers %}{{ maintainer.username }}{% if not loop.last %}, {% endif %}{% endfor %}
-Current maintainers: {% for maintainer in display.currentMaintainers %}{{ maintainer.username }}{% if not loop.last %}, {% endif %}{% endfor %}
+Previous maintainers: {{ display.previousMaintainers|column('username')|join(', ') }}
+Current maintainers: {{ display.currentMaintainers|column('username')|join(', ') }}
Transferred by: {{ display.actor.username }}