diff --git a/app/Audit/AuditLogFormatterFactory.php b/app/Audit/AuditLogFormatterFactory.php index 624949c24..99998287f 100644 --- a/app/Audit/AuditLogFormatterFactory.php +++ b/app/Audit/AuditLogFormatterFactory.php @@ -42,6 +42,10 @@ public function __construct() public function make(AuditContext $ctx, $subject, string $event_type): ?IAuditLogFormatter { + if ($this->isAuditDisabledForSubject($subject)) { + return null; + } + $formatter = null; switch ($event_type) { case IAuditStrategy::EVENT_COLLECTION_UPDATE: @@ -190,4 +194,18 @@ private function routeMatches(string $route, string $actual_route): bool { return strcmp($actual_route, $route) === 0; } + + private function isAuditDisabledForSubject(mixed $subject): bool + { + if (!is_object($subject)) { + return false; + } + + $entities = $this->config['entities'] ?? []; + $entity_config = $entities[get_class($subject)] ?? null; + + return is_array($entity_config) + && array_key_exists('enabled', $entity_config) + && $entity_config['enabled'] === false; + } } diff --git a/config/audit_log.php b/config/audit_log.php index 057bda8ee..d3cae2ce4 100644 --- a/config/audit_log.php +++ b/config/audit_log.php @@ -97,7 +97,7 @@ 'strategy' => \App\Audit\ConcreteFormatters\PresentationFormatters\PresentationActionTypeAuditLogFormatter::class, ], \models\summit\SummitEventAttendanceMetric::class => [ - 'enabled' => true, + 'enabled' => false, 'strategy' => \App\Audit\ConcreteFormatters\SummitEventAttendanceMetricAuditLogFormatter::class, ], \models\summit\SummitMediaUploadType::class => [ @@ -149,7 +149,7 @@ 'strategy' => \App\Audit\ConcreteFormatters\SummitVenueRoomAuditLogFormatter::class, ], \models\summit\SummitMetric::class => [ - 'enabled' => true, + 'enabled' => false, 'strategy' => \App\Audit\ConcreteFormatters\SummitMetricAuditLogFormatter::class, ], \models\summit\SummitSponsorship::class => [ diff --git a/tests/OpenTelemetry/AuditLogFormatterFactoryTest.php b/tests/OpenTelemetry/AuditLogFormatterFactoryTest.php index 2569bdfb4..dcc05062a 100644 --- a/tests/OpenTelemetry/AuditLogFormatterFactoryTest.php +++ b/tests/OpenTelemetry/AuditLogFormatterFactoryTest.php @@ -16,6 +16,8 @@ use App\Audit\AuditContext; use App\Audit\AuditLogFormatterFactory; +use App\Audit\AbstractAuditLogFormatter; +use App\Audit\Interfaces\IAuditStrategy; use PHPUnit\Framework\TestCase; /** @@ -154,4 +156,72 @@ public function testMatchesStrategyReturnsFalseWhenRouteDoesNotMatch(): void $result = $method->invoke($this->factory, $strategy, $ctx); $this->assertFalse($result, 'matchesStrategy should return false when routes do not match'); } + + public function testIsAuditDisabledForSubjectReturnsTrueWhenEntityIsDisabled(): void + { + $this->setFactoryConfig([ + 'entities' => [ + FakeAuditEntity::class => [ + 'enabled' => false, + 'strategy' => FakeAuditFormatter::class, + ], + ], + ]); + + $method = (new \ReflectionClass($this->factory))->getMethod('isAuditDisabledForSubject'); + $method->setAccessible(true); + + $this->assertTrue($method->invoke($this->factory, new FakeAuditEntity())); + } + + public function testIsAuditDisabledForSubjectReturnsFalseWhenEntityIsEnabled(): void + { + $this->setFactoryConfig([ + 'entities' => [ + FakeAuditEntity::class => [ + 'enabled' => true, + 'strategy' => FakeAuditFormatter::class, + ], + ], + ]); + + $method = (new \ReflectionClass($this->factory))->getMethod('isAuditDisabledForSubject'); + $method->setAccessible(true); + + $this->assertFalse($method->invoke($this->factory, new FakeAuditEntity())); + } + + public function testMakeReturnsNullWhenEntityIsDisabled(): void + { + $this->setFactoryConfig([ + 'entities' => [ + FakeAuditEntity::class => [ + 'enabled' => false, + 'strategy' => FakeAuditFormatter::class, + ], + ], + ]); + + $ctx = new AuditContext(); + $formatter = $this->factory->make($ctx, new FakeAuditEntity(), IAuditStrategy::EVENT_ENTITY_CREATION); + + $this->assertNull($formatter); + } + + private function setFactoryConfig(array $config): void + { + $prop = (new \ReflectionClass($this->factory))->getProperty('config'); + $prop->setAccessible(true); + $prop->setValue($this->factory, $config); + } +} + +class FakeAuditEntity {} + +class FakeAuditFormatter extends AbstractAuditLogFormatter +{ + public function format(mixed $subject, array $change_set): ?string + { + return 'ok'; + } }