瀏覽代碼

minor fixes and restore tests

Olivier Massot 3 年之前
父節點
當前提交
9210dff6ff

+ 8 - 4
src/DataProvider/DownloadRequestDataProvider.php

@@ -6,9 +6,9 @@ namespace App\DataProvider;
 use ApiPlatform\Core\DataProvider\ItemDataProviderInterface;
 use ApiPlatform\Core\DataProvider\RestrictedDataProviderInterface;
 use App\ApiResources\DownloadRequest;
+use App\Enum\Core\FileStatusEnum;
 use App\Repository\Core\FileRepository;
 use App\Service\Storage\FileStorage;
-use Symfony\Component\HttpFoundation\BinaryFileResponse;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpFoundation\HeaderUtils;
 
@@ -31,18 +31,22 @@ final class DownloadRequestDataProvider implements ItemDataProviderInterface, Re
     public function getItem(string $resourceClass, $id, string $operationName = null, array $context = []): Response
     {
         $file = $this->fileRepository->find($id);
-//
-//        return new BinaryFileResponse($this->storage->getPath($file));
+        if (empty($file)) {
+            throw new \RuntimeException("File " . $id . " does not exist; abort.");
+        }
+        if ($file->getStatus() !== FileStatusEnum::READY()->getValue()) {
+            throw new \RuntimeException("File " . $id . " has " . $file->getStatus() . " status; abort.");
+        }
 
         $content = $this->storage->read($file);
 
+        // @see https://symfony.com/doc/current/components/http_foundation.html#serving-files
         $response = new Response($content);
 
         $disposition = HeaderUtils::makeDisposition(
             HeaderUtils::DISPOSITION_ATTACHMENT,
             $file->getName()
         );
-
         $response->headers->set('Content-Disposition', $disposition);
 
         return $response;

+ 2 - 2
src/Service/Export/LicenceCmfExporter.php

@@ -61,7 +61,7 @@ class LicenceCmfExporter extends BaseExporter
         $logo = $organization->getLogo();
         if ($logo) {
             $licenceCmf->setLogoUri(
-                $this->storage->getDownloadUri($logo)
+                $this->storage->getDownloadIri($logo)
             );
         }
 
@@ -79,7 +79,7 @@ class LicenceCmfExporter extends BaseExporter
         $qrCode = $cmf->getParameters()?->getQrCode();
         if ($qrCode) {
             $licenceCmf->setQrCodeUri(
-                $this->storage->getDownloadUri($qrCode)
+                $this->storage->getDownloadIri($qrCode)
             );
         }
 

+ 15 - 10
src/Service/Storage/FileStorage.php

@@ -3,6 +3,8 @@ declare(strict_types=1);
 
 namespace App\Service\Storage;
 
+use ApiPlatform\Core\Api\IriConverterInterface;
+use App\ApiResources\DownloadRequest;
 use App\Entity\Access\Access;
 use App\Entity\Core\File;
 use App\Entity\Organization\Organization;
@@ -35,7 +37,8 @@ class FileStorage
     public function __construct(
         protected FilesystemMap $filesystemMap,
         protected EntityManagerInterface $entityManager,
-        protected AccessRepository $accessRepository
+        protected AccessRepository $accessRepository,
+        protected IriConverterInterface $iriConverter
     )
     {
         $this->filesystem = $filesystemMap->get(static::FS_KEY);
@@ -51,16 +54,18 @@ class FileStorage
         return $this->filesystem->has($file->getSlug());
     }
 
-    public function getDownloadUri(File $file): string
-    {
-        // TODO: trouver solution plus propre
-        return $_SERVER['REQUEST_SCHEME'] . '://' . Path::join($_SERVER['HTTP_HOST'], 'api', 'download', $file->getID());
-    }
-
-    public function getPath(File $file): string
+    /**
+     * Get the IRI to download this file (eg: /api/download/1)
+     *
+     * @param File $file
+     * @return string
+     */
+    public function getDownloadIri(File $file): string
     {
-        // TODO: trouver solution plus propre
-        return Path::join(Path::getProjectDir(), 'var', 'files', 'storage', $file->getSlug());
+        return $this->iriConverter->getItemIriFromResourceClass(
+            DownloadRequest::class,
+            ['fileId' => $file->getId()]
+        );
     }
 
     /**

+ 1 - 1
tests/Service/Export/LicenceCmfExporterTest.php

@@ -113,7 +113,7 @@ class LicenceCmfExporterTest extends TestCase
         $this->parent->expects(self::once())->method('getName')->willReturn('my_network');
         $this->organization->method('getLogo')->willReturn($this->logo);
         $this->logo->method('getId')->willReturn(1);
-        $this->storage->method('getUri')->willReturn('http:://foo.bar/1');
+        $this->storage->method('getDownloadIri')->willReturn('http:://foo.bar/1');
         $this->president->method('getId')->willReturn(1);
         $this->president->method('getGender')->willReturn('M');
         $this->president->method('getGivenName')->willReturn('Joe');

+ 24 - 21
tests/Service/Storage/FileStorageTest.php

@@ -1,5 +1,6 @@
 <?php /** @noinspection DuplicatedCode */
 
+use ApiPlatform\Core\Api\IriConverterInterface;
 use App\Entity\Access\Access;
 use App\Entity\Core\File;
 use App\Entity\Organization\Organization;
@@ -33,12 +34,14 @@ class FileStorageTest extends TestCase
     private EntityManagerInterface $entityManager;
     private AccessRepository $accessRepository;
     private Filesystem $filesystem;
+    private IriConverterInterface $iriConverter;
 
     public function setUp(): void
     {
         $this->filesystemMap = $this->getMockBuilder(FilesystemMap::class)->disableOriginalConstructor()->getMock();
         $this->entityManager = $this->getMockBuilder(EntityManagerInterface::class)->disableOriginalConstructor()->getMock();
         $this->accessRepository = $this->getMockBuilder(AccessRepository::class)->disableOriginalConstructor()->getMock();
+        $this->iriConverter = $this->getMockBuilder(IriConverterInterface::class)->disableOriginalConstructor()->getMock();
 
         $this->filesystem = $this->getMockBuilder(Filesystem::class)->disableOriginalConstructor()->getMock();
         $this->filesystemMap->method('get')->with(TestableFileStorage::FS_KEY)->willReturn($this->filesystem);
@@ -46,7 +49,7 @@ class FileStorageTest extends TestCase
 
     public function testExists(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['exists'])
             ->getMock();
 
@@ -60,7 +63,7 @@ class FileStorageTest extends TestCase
 
     public function testExistsInexistant(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['exists'])
             ->getMock();
 
@@ -75,7 +78,7 @@ class FileStorageTest extends TestCase
     public function testListByOwner(): void
     {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['listByOwner'])
             ->getMock();
 
@@ -94,7 +97,7 @@ class FileStorageTest extends TestCase
     public function testRead(): void
     {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['read'])
             ->getMock();
 
@@ -112,7 +115,7 @@ class FileStorageTest extends TestCase
     public function testPrepareFile(): void
     {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['prepareFile'])
             ->getMock();
 
@@ -150,7 +153,7 @@ class FileStorageTest extends TestCase
     public function testPrepareFileDefaultValues(): void
     {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['prepareFile'])
             ->getMock();
 
@@ -176,7 +179,7 @@ class FileStorageTest extends TestCase
     public function testPrepareFileNoFlush(): void
     {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['prepareFile'])
             ->getMock();
 
@@ -202,7 +205,7 @@ class FileStorageTest extends TestCase
 
     public function testWriteFileNewFile(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['writeFile'])
             ->getMock();
 
@@ -253,7 +256,7 @@ class FileStorageTest extends TestCase
 
     public function testWriteFileExistingFile(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['writeFile'])
             ->getMock();
 
@@ -303,7 +306,7 @@ class FileStorageTest extends TestCase
     public function testWriteFileExistingButMissingFile(): void
     {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['writeFile'])
             ->getMock();
 
@@ -333,7 +336,7 @@ class FileStorageTest extends TestCase
 
     public function testWriteFileWithAccessOwner(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['writeFile'])
             ->getMock();
 
@@ -374,7 +377,7 @@ class FileStorageTest extends TestCase
     public function testWriteFileWithNoName(): void
     {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['writeFile'])
             ->getMock();
 
@@ -391,7 +394,7 @@ class FileStorageTest extends TestCase
 
     public function testMakeFile(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['makeFile'])
             ->getMock();
 
@@ -424,7 +427,7 @@ class FileStorageTest extends TestCase
 
     public function testDelete(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['delete'])
             ->getMock();
 
@@ -447,7 +450,7 @@ class FileStorageTest extends TestCase
 
     public function testDeleteFailed(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['delete'])
             ->getMock();
 
@@ -471,7 +474,7 @@ class FileStorageTest extends TestCase
 
     public function testGetPrefixAccess(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['getPrefix'])
             ->getMock();
 
@@ -489,7 +492,7 @@ class FileStorageTest extends TestCase
 
     public function testGetPrefixOrganization(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['getPrefix'])
             ->getMock();
 
@@ -503,7 +506,7 @@ class FileStorageTest extends TestCase
 
     public function testGetPrefixPerson(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['getPrefix'])
             ->getMock();
 
@@ -517,7 +520,7 @@ class FileStorageTest extends TestCase
 
     public function testGetPrefixTemp(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['getPrefix'])
             ->getMock();
 
@@ -531,7 +534,7 @@ class FileStorageTest extends TestCase
 
     public function testGetPrefixWithType(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['getPrefix'])
             ->getMock();
 
@@ -568,7 +571,7 @@ class FileStorageTest extends TestCase
 
     public function testGetOrganizationAndPersonFromOwner(): void {
         $fileStorage = $this->getMockBuilder(TestableFileStorage::class)
-            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository])
+            ->setConstructorArgs([$this->filesystemMap, $this->entityManager, $this->accessRepository, $this->iriConverter])
             ->setMethodsExcept(['getOrganizationAndPersonFromOwner'])
             ->getMock();