diff --git a/src/Bundle/ChillDocStoreBundle/Service/StoredObjectManager.php b/src/Bundle/ChillDocStoreBundle/Service/StoredObjectManager.php index b10f67619..2266bb0e2 100644 --- a/src/Bundle/ChillDocStoreBundle/Service/StoredObjectManager.php +++ b/src/Bundle/ChillDocStoreBundle/Service/StoredObjectManager.php @@ -37,6 +37,14 @@ final class StoredObjectManager implements StoredObjectManagerInterface { $version = $document instanceof StoredObject ? $document->getCurrentVersion() : $document; + if (null !== $createdAt = $version->getCreatedAt()) { + // as a createdAt datetime is set, return the date and time from database + return $createdAt; + } + + // if no createdAt version exists in the database, we fetch the date and time from the + // file. This situation happens for files created before July 2024. + if ($this->hasCache($version)) { $response = $this->getResponseFromCache($version); } else { diff --git a/src/Bundle/ChillDocStoreBundle/Tests/Service/StoredObjectManagerTest.php b/src/Bundle/ChillDocStoreBundle/Tests/Service/StoredObjectManagerTest.php index c11a06f9b..3725f910f 100644 --- a/src/Bundle/ChillDocStoreBundle/Tests/Service/StoredObjectManagerTest.php +++ b/src/Bundle/ChillDocStoreBundle/Tests/Service/StoredObjectManagerTest.php @@ -233,6 +233,64 @@ final class StoredObjectManagerTest extends TestCase $manager->write($storedObject, 'ok'); } + public function testGetLastModifiedWithDateTimeInEntity(): void + { + $version = ($storedObject = new StoredObject())->registerVersion(); + $version->setCreatedAt(new \DateTimeImmutable('2024-07-09 15:09:47', new \DateTimeZone('+00:00'))); + $client = $this->createMock(HttpClientInterface::class); + $client->expects(self::never())->method('request')->withAnyParameters(); + + $tempUrlGenerator = $this->createMock(TempUrlGeneratorInterface::class); + $tempUrlGenerator + ->expects($this->never()) + ->method('generate') + ->with($this->identicalTo('HEAD'), $this->isType('string')) + ->willReturnCallback(function (string $method, string $objectName) { + return new SignedUrl( + $method, + 'https://example.com/'.$objectName, + new \DateTimeImmutable('1 hours'), + $objectName + ); + }); + + $manager = new StoredObjectManager($client, $tempUrlGenerator); + + $actual = $manager->getLastModified($storedObject); + + self::assertEquals(new \DateTimeImmutable('2024-07-09 15:09:47 GMT'), $actual); + } + + public function testGetLastModifiedWithDateTimeFromResponse(): void + { + $storedObject = (new StoredObject())->registerVersion()->getStoredObject(); + + $client = new MockHttpClient( + new MockResponse('', ['http_code' => 200, 'response_headers' => [ + 'last-modified' => 'Tue, 09 Jul 2024 15:09:47 GMT', + ]]) + ); + + $tempUrlGenerator = $this->createMock(TempUrlGeneratorInterface::class); + $tempUrlGenerator + ->expects($this->atLeastOnce()) + ->method('generate') + ->with($this->identicalTo('HEAD'), $this->isType('string')) + ->willReturnCallback(function (string $method, string $objectName) { + return new SignedUrl( + $method, + 'https://example.com/'.$objectName, + new \DateTimeImmutable('1 hours') + ); + }); + + $manager = new StoredObjectManager($client, $tempUrlGenerator); + + $actual = $manager->getLastModified($storedObject); + + self::assertEquals(new \DateTimeImmutable('2024-07-09 15:09:47 GMT'), $actual); + } + private function getHttpClient(string $encodedContent): HttpClientInterface { $callback = static function ($method, $url, $options) use ($encodedContent) { @@ -283,7 +341,8 @@ final class StoredObjectManagerTest extends TestCase return new SignedUrl( $method, 'https://example.com/'.$objectName, - new \DateTimeImmutable('1 hours') + new \DateTimeImmutable('1 hours'), + $objectName ); });