From 6d951abcd7326f5714655e063b15f6f2a21a67b2 Mon Sep 17 00:00:00 2001 From: Myles Kingsnorth <38158908+MylesKingsnorth01@users.noreply.github.com> Date: Mon, 19 Aug 2019 14:32:49 +0100 Subject: [PATCH] Allow timezone to be configured in package configuration (#74) --- README.md | 11 +++++++++++ src/DoctrineAuditBundle/AuditConfiguration.php | 16 ++++++++++++++++ src/DoctrineAuditBundle/AuditManager.php | 2 +- .../DependencyInjection/Configuration.php | 4 ++++ .../AuditConfigurationTest.php | 17 +++++++++++++++++ tests/DoctrineAuditBundle/BaseTest.php | 1 + tests/DoctrineAuditBundle/CoreTest.php | 1 + .../DHDoctrineAuditExtensionTest.php | 1 + .../Helper/AuditHelperTest.php | 4 ++++ 9 files changed, 56 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5bd85191..7a796d75 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,17 @@ dh_doctrine_audit: table_suffix: '_audit' ``` +### Timezone + +You can configure the timezone the audit `created_at` is generated in. This by default is 'UTC'. + +```yaml +// app/config/config.yml (symfony < 3.4) +// config/packages/dh_doctrine_audit.yaml (symfony >= 3.4) +dh_doctrine_audit: + timezone: 'Europe/London' +``` + ### Creating audit tables Open a command console, enter your project directory and execute the diff --git a/src/DoctrineAuditBundle/AuditConfiguration.php b/src/DoctrineAuditBundle/AuditConfiguration.php index dc96893b..6fc8a0aa 100644 --- a/src/DoctrineAuditBundle/AuditConfiguration.php +++ b/src/DoctrineAuditBundle/AuditConfiguration.php @@ -19,6 +19,11 @@ class AuditConfiguration */ private $tableSuffix; + /** + * @var string + */ + private $timezone; + /** * @var array */ @@ -57,6 +62,7 @@ public function __construct(array $config, UserProviderInterface $userProvider, $this->tablePrefix = $config['table_prefix']; $this->tableSuffix = $config['table_suffix']; + $this->timezone = $config['timezone']; $this->ignoredColumns = $config['ignored_columns']; if (isset($config['entities']) && !empty($config['entities'])) { @@ -226,6 +232,16 @@ public function getTableSuffix(): string return $this->tableSuffix; } + /** + * Get the value of timezone + * + * @return string + */ + public function getTimezone(): string + { + return $this->timezone; + } + /** * Get the value of excludedColumns. * diff --git a/src/DoctrineAuditBundle/AuditManager.php b/src/DoctrineAuditBundle/AuditManager.php index 7ea507b4..d28675d9 100644 --- a/src/DoctrineAuditBundle/AuditManager.php +++ b/src/DoctrineAuditBundle/AuditManager.php @@ -226,7 +226,7 @@ private function audit(EntityManager $em, array $data): void $statement = $em->getConnection()->prepare($query); - $dt = new \DateTime('now', new \DateTimeZone('UTC')); + $dt = new \DateTime('now', new \DateTimeZone($this->getConfiguration()->getTimezone())); $statement->bindValue('type', $data['action']); $statement->bindValue('object_id', (string) $data['id']); $statement->bindValue('diffs', json_encode($data['diff'])); diff --git a/src/DoctrineAuditBundle/DependencyInjection/Configuration.php b/src/DoctrineAuditBundle/DependencyInjection/Configuration.php index b7fd3eb7..88c0b8e4 100644 --- a/src/DoctrineAuditBundle/DependencyInjection/Configuration.php +++ b/src/DoctrineAuditBundle/DependencyInjection/Configuration.php @@ -33,6 +33,10 @@ public function getConfigTreeBuilder() ->prototype('scalar')->end() ->end() + ->scalarNode('timezone') + ->defaultValue('UTC') + ->end() + ->arrayNode('entities') ->canBeUnset() ->prototype('array') diff --git a/tests/DoctrineAuditBundle/AuditConfigurationTest.php b/tests/DoctrineAuditBundle/AuditConfigurationTest.php index f441b43a..90fa8c7f 100644 --- a/tests/DoctrineAuditBundle/AuditConfigurationTest.php +++ b/tests/DoctrineAuditBundle/AuditConfigurationTest.php @@ -363,6 +363,22 @@ public function testDisableAuditFor(): void $this->assertFalse($configuration->isAudited(Post::class), 'entity "'.Post::class.'" is not audited.'); } + public function testDefaultTimezone(): void + { + $configuration = $this->getAuditConfiguration(); + + $this->assertSame('UTC', $configuration->getTimezone(), 'timezone is UTC by default.'); + } + + public function testCustomTimezone(): void + { + $configuration = $this->getAuditConfiguration([ + 'timezone' => 'Europe/London', + ]); + + $this->assertSame('Europe/London', $configuration->getTimezone(), 'custom timezone is "Europe/London".'); + } + protected function getAuditConfiguration(array $options = []): AuditConfiguration { $container = new ContainerBuilder(); @@ -371,6 +387,7 @@ protected function getAuditConfiguration(array $options = []): AuditConfiguratio array_merge([ 'table_prefix' => '', 'table_suffix' => '_audit', + 'timezone' => 'UTC', 'ignored_columns' => [], 'entities' => [], 'enabled' => true, diff --git a/tests/DoctrineAuditBundle/BaseTest.php b/tests/DoctrineAuditBundle/BaseTest.php index 3595517e..2a462d3f 100644 --- a/tests/DoctrineAuditBundle/BaseTest.php +++ b/tests/DoctrineAuditBundle/BaseTest.php @@ -125,6 +125,7 @@ protected function createAuditConfiguration(array $options = []): AuditConfigura array_merge([ 'table_prefix' => '', 'table_suffix' => '_audit', + 'timezone' => 'UTC', 'ignored_columns' => [], 'entities' => [], ], $options), diff --git a/tests/DoctrineAuditBundle/CoreTest.php b/tests/DoctrineAuditBundle/CoreTest.php index b2f909f9..d8216f82 100644 --- a/tests/DoctrineAuditBundle/CoreTest.php +++ b/tests/DoctrineAuditBundle/CoreTest.php @@ -254,6 +254,7 @@ protected function createAuditConfiguration(array $options = []): AuditConfigura array_merge([ 'table_prefix' => '', 'table_suffix' => '_audit', + 'timezone' => 'UTC', 'ignored_columns' => [], 'entities' => [], ], $options), diff --git a/tests/DoctrineAuditBundle/DependencyInjection/DHDoctrineAuditExtensionTest.php b/tests/DoctrineAuditBundle/DependencyInjection/DHDoctrineAuditExtensionTest.php index 176325ff..885b54c2 100644 --- a/tests/DoctrineAuditBundle/DependencyInjection/DHDoctrineAuditExtensionTest.php +++ b/tests/DoctrineAuditBundle/DependencyInjection/DHDoctrineAuditExtensionTest.php @@ -69,6 +69,7 @@ public function testItSetsDefaultParameters(): void $this->assertContainerBuilderHasParameter('dh_doctrine_audit.configuration', [ 'table_prefix' => '', 'table_suffix' => '_audit', + 'timezone' => 'UTC', 'ignored_columns' => [], 'entities' => [], ]); diff --git a/tests/DoctrineAuditBundle/Helper/AuditHelperTest.php b/tests/DoctrineAuditBundle/Helper/AuditHelperTest.php index ec8348f6..24159379 100644 --- a/tests/DoctrineAuditBundle/Helper/AuditHelperTest.php +++ b/tests/DoctrineAuditBundle/Helper/AuditHelperTest.php @@ -199,6 +199,7 @@ public function testDiffHonorsGloballyIgnoredColumns(): void [ 'table_prefix' => '', 'table_suffix' => '_audit', + 'timezone' => 'UTC', 'ignored_columns' => [ 'created_at', 'updated_at', @@ -258,6 +259,7 @@ public function testDiffHonorsLocallyIgnoredColumns(): void [ 'table_prefix' => '', 'table_suffix' => '_audit', + 'timezone' => 'UTC', 'ignored_columns' => [], 'entities' => [ Post::class => [ @@ -378,6 +380,7 @@ public function testBlameWhenNoRequest(): void [ 'table_prefix' => '', 'table_suffix' => '_audit', + 'timezone' => 'UTC', 'ignored_columns' => [], 'entities' => [], ], @@ -404,6 +407,7 @@ public function testBlameWhenNoUser(): void [ 'table_prefix' => '', 'table_suffix' => '_audit', + 'timezone' => 'UTC', 'ignored_columns' => [], 'entities' => [], ],