diff --git a/.changelog/current/2333-time-zone-in-recipe-stubs.md b/.changelog/current/2333-time-zone-in-recipe-stubs.md new file mode 100644 index 000000000..adc8aa104 --- /dev/null +++ b/.changelog/current/2333-time-zone-in-recipe-stubs.md @@ -0,0 +1,3 @@ +# Fixed + +- Use server time zone for presentation of recipe information diff --git a/lib/Helper/Filter/JSON/TimezoneFixFilter.php b/lib/Helper/Filter/JSON/TimezoneFixFilter.php new file mode 100644 index 000000000..751457c43 --- /dev/null +++ b/lib/Helper/Filter/JSON/TimezoneFixFilter.php @@ -0,0 +1,55 @@ +logger = $logger; + } + + public function apply(array &$json): bool { + $changed = false; + foreach(['dateCreated', 'dateModified'] as $key) { + if(isset($json[$key]) && $json[$key]) { + $json[$key] = $this->handleTimestamp($json[$key], $changed); + } + } + return $changed; + } + + private function handleTimestamp(string $value, bool &$changed): string { + $pattern = '/^([0-9]{4}-[0-9]{2}-[0-9]{2})T([0-9]{1,2}:[0-9]{2}:[0-9]{2}(?:[.,][0-9]+)?)(\+[0-9]{2}:?[0-9]{2})/'; + $match = preg_match($pattern, $value, $matches); + + if($match == 1) { + return $value; + } + + try { + $defaultTimezone = date_default_timezone_get(); + } catch (\Exception $ex) { + $this->logger->error('Cannot get the default timezone of server.'); + return $value; + } + $serverTimeZone = new DateTimeZone($defaultTimezone); + $now = new DateTime('now', $serverTimeZone); + $offsetSec = $serverTimeZone->getOffset($now); + $offsetHour = $offsetSec / 3600; + + $changed = true; + return sprintf('%s%+05d', $value, $offsetHour * 100); + } + +} diff --git a/lib/Helper/Filter/Output/RecipeStubFilter.php b/lib/Helper/Filter/Output/RecipeStubFilter.php index 26a458f4f..b92ec7970 100644 --- a/lib/Helper/Filter/Output/RecipeStubFilter.php +++ b/lib/Helper/Filter/Output/RecipeStubFilter.php @@ -6,6 +6,7 @@ use OCA\Cookbook\Helper\Filter\JSON\RecipeIdCopyFilter; use OCA\Cookbook\Helper\Filter\JSON\RecipeIdTypeFilter; use OCA\Cookbook\Helper\Filter\JSON\TimestampFixFilter; +use OCA\Cookbook\Helper\Filter\JSON\TimezoneFixFilter; class RecipeStubFilter { /** @var AbstractJSONFilter[] */ @@ -14,12 +15,14 @@ class RecipeStubFilter { public function __construct( RecipeIdTypeFilter $recipeIdTypeFilter, RecipeIdCopyFilter $recipeIdCopyFilter, - TimestampFixFilter $timestampFixFilter + TimestampFixFilter $timestampFixFilter, + TimezoneFixFilter $timezoneFixFilter ) { $this->filters = [ $recipeIdCopyFilter, $recipeIdTypeFilter, $timestampFixFilter, + $timezoneFixFilter, ]; } diff --git a/tests/Unit/Helper/Filter/JSON/TimezoneFixFilterTest.php b/tests/Unit/Helper/Filter/JSON/TimezoneFixFilterTest.php new file mode 100644 index 000000000..e1daf47a5 --- /dev/null +++ b/tests/Unit/Helper/Filter/JSON/TimezoneFixFilterTest.php @@ -0,0 +1,54 @@ +createStub(LoggerInterface::class); + $this->dut = new TimezoneFixFilter($logger); + } + + public function db() { + $defaultTimezone = date_default_timezone_get(); + $tz = new DateTimeZone($defaultTimezone); + $now = new DateTime('now', $tz); + $offset = $tz->getOffset($now); + $hours = sprintf('%+03d00', $offset / 3600); + + yield ["2024-05-20T10:12:00$hours", "2024-05-20T10:12:00$hours", false]; + yield ["2024-05-20T10:12:00", "2024-05-20T10:12:00$hours", true]; + yield ["2024-05-20T10:12:00.20$hours", "2024-05-20T10:12:00.20$hours", false]; + yield ["2024-05-20T10:12:00.20", "2024-05-20T10:12:00.20$hours", true]; + yield ["2024-05-20T1:12:00$hours", "2024-05-20T1:12:00$hours", false]; + yield ["2024-05-20T1:12:00", "2024-05-20T1:12:00$hours", true]; + } + + /** @dataProvider db */ + public function testFilter($inputDate, $expectedDate, $changed) { + $input = $this->getStub($inputDate); + $expected = $this->getStub($expectedDate); + + $ret = $this->dut->apply($input); + + $this->assertEquals($expected, $input); + $this->assertEquals($changed, $ret); + } + + private function getStub($date) { + return [ + 'name' => 'Test Recipe', + 'id' => 123, + 'dateCreated' => $date, + 'dateModified' => $date, + ]; + } +}