From 1195767eb3f6641802ea63810a7600f2193b8156 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Mon, 11 Dec 2023 16:53:38 +0100 Subject: [PATCH] Add Twig AsyncUploadExtension and its associated test Created AsyncUploadExtension under Chill\DocStoreBundle\AsyncUpload\Templating to provide Twig filter functions for generating URLs for asynchronous file uploads. To ensure correctness, AsyncUploadExtensionTest was implemented in Bundle\ChillDocStoreBundle\Tests\AsyncUpload\Templating. Service definitions were also updated in services.yaml. --- .../Templating/AsyncUploadExtension.php | 69 +++++++++++++++++ .../Templating/AsyncUploadExtensionTest.php | 77 +++++++++++++++++++ .../ChillDocStoreBundle/config/services.yaml | 5 +- 3 files changed, 149 insertions(+), 2 deletions(-) create mode 100644 src/Bundle/ChillDocStoreBundle/AsyncUpload/Templating/AsyncUploadExtension.php create mode 100644 src/Bundle/ChillDocStoreBundle/Tests/AsyncUpload/Templating/AsyncUploadExtensionTest.php diff --git a/src/Bundle/ChillDocStoreBundle/AsyncUpload/Templating/AsyncUploadExtension.php b/src/Bundle/ChillDocStoreBundle/AsyncUpload/Templating/AsyncUploadExtension.php new file mode 100644 index 000000000..0464b37b9 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/AsyncUpload/Templating/AsyncUploadExtension.php @@ -0,0 +1,69 @@ +computeSignedUrl(...)), + new TwigFilter('generate_url', $this->computeGenerateUrl(...)), + ]; + } + + public function computeSignedUrl(StoredObject|string $file, string $method = 'GET', int $expiresDelay = null): string + { + if ($file instanceof StoredObject) { + $object_name = $file->getFilename(); + } else { + $object_name = $file; + } + + return $this->tempUrlGenerator->generate($method, $object_name, $expiresDelay)->url; + } + + public function computeGenerateUrl(StoredObject|string $file, string $method = 'GET', int $expiresDelay = null): string + { + if ($file instanceof StoredObject) { + $object_name = $file->getFilename(); + } else { + $object_name = $file; + } + + $args = [ + 'method' => $method, + 'object_name' => $object_name, + ]; + + if (null !== $expiresDelay) { + $args['expires_delay'] = $expiresDelay; + } + + return $this->routingUrlGenerator->generate('async_upload.generate_url', $args); + } +} diff --git a/src/Bundle/ChillDocStoreBundle/Tests/AsyncUpload/Templating/AsyncUploadExtensionTest.php b/src/Bundle/ChillDocStoreBundle/Tests/AsyncUpload/Templating/AsyncUploadExtensionTest.php new file mode 100644 index 000000000..78ed1a1d9 --- /dev/null +++ b/src/Bundle/ChillDocStoreBundle/Tests/AsyncUpload/Templating/AsyncUploadExtensionTest.php @@ -0,0 +1,77 @@ +prophesize(TempUrlGeneratorInterface::class); + $generator->generate(Argument::in(['GET', 'POST']), Argument::type('string'), Argument::any()) + ->will(fn (array $args): SignedUrl => new SignedUrl($args[0], 'https://object.store.example/container/'.$args[1], new \DateTimeImmutable('1 hours'))); + + $urlGenerator = $this->prophesize(UrlGeneratorInterface::class); + $urlGenerator->generate('async_upload.generate_url', Argument::type('array')) + ->willReturn('url'); + + $this->asyncUploadExtension = new AsyncUploadExtension( + $generator->reveal(), + $urlGenerator->reveal() + ); + } + + /** + * @dataProvider dataProviderStoredObject + */ + public function testComputeSignedUrl(StoredObject|string $storedObject): void + { + $actual = $this->asyncUploadExtension->computeSignedUrl($storedObject); + + self::assertStringContainsString('https://object.store.example/container', $actual); + self::assertStringContainsString(is_string($storedObject) ? $storedObject : $storedObject->getFilename(), $actual); + } + + /** + * @dataProvider dataProviderStoredObject + */ + public function testComputeGenerateUrl(StoredObject|string $storedObject): void + { + $actual = $this->asyncUploadExtension->computeGenerateUrl($storedObject); + + self::assertEquals('url', $actual); + } + + public function dataProviderStoredObject(): iterable + { + yield [(new StoredObject())->setFilename('blabla')]; + + yield ['blabla']; + } +} diff --git a/src/Bundle/ChillDocStoreBundle/config/services.yaml b/src/Bundle/ChillDocStoreBundle/config/services.yaml index 061b0f9c8..c510064f1 100644 --- a/src/Bundle/ChillDocStoreBundle/config/services.yaml +++ b/src/Bundle/ChillDocStoreBundle/config/services.yaml @@ -55,9 +55,10 @@ services: resource: '../GenericDoc/Renderer/' Chill\DocStoreBundle\AsyncUpload\Driver\: - autowire: true - autoconfigure: true resource: '../AsyncUpload/Driver/' + Chill\DocStoreBundle\AsyncUpload\Templating\: + resource: '../AsyncUpload/Templating/' + Chill\DocStoreBundle\AsyncUpload\TempUrlGeneratorInterface: alias: Chill\DocStoreBundle\AsyncUpload\Driver\OpenstackObjectStore\TempUrlOpenstackGenerator