Prechádzať zdrojové kódy

Merge branch 'hotfix/fix_file_management' into develop

Olivier Massot 5 mesiacov pred
rodič
commit
343c0f0595

+ 24 - 10
src/Entity/Core/File.php

@@ -23,6 +23,7 @@ use App\Entity\Organization\OnlineRegistrationSettings;
 use App\Entity\Organization\Organization;
 use App\Entity\Organization\Parameters;
 use App\Entity\Person\Person;
+use App\Enum\Core\FileFolderEnum;
 use App\Enum\Core\FileHostEnum;
 use App\Enum\Core\FileStatusEnum;
 use App\Enum\Core\FileTypeEnum;
@@ -82,12 +83,6 @@ class File
     #[ORM\Column(length: 255, nullable: true)]
     private ?string $slug;
 
-    /**
-     * Chemin d'accès du fichier.
-     */
-    #[ORM\Column(length: 255, nullable: true)]
-    private ?string $path;
-
     /**
      * Nom du fichier.
      */
@@ -168,6 +163,12 @@ class File
     #[ORM\Column(length: 5, enumType: FileHostEnum::class, options: ['default' => FileHostEnum::AP2I])]
     private FileHostEnum $host = FileHostEnum::AP2I;
 
+    /**
+     * Dossier dans lequel le fichier est stocké, conçu en prévision de la gestion documentaire.
+     */
+    #[ORM\Column(length: 20, enumType: FileFolderEnum::class, options: ['default' => FileFolderEnum::UNRATED], nullable: true)]
+    private ?FileFolderEnum $folder = FileFolderEnum::UNRATED;
+
     //    #[ORM\Column]
     //    private ?int $eventReport_id;
 
@@ -312,16 +313,17 @@ class File
         return $this;
     }
 
+    /**
+     * @deprecated
+     */
     public function getPath(): ?string
     {
-        return $this->path;
+        return $this->slug;
     }
 
     public function setPath(?string $path): self
     {
-        $this->path = $path;
-
-        return $this;
+        throw new \Exception('Deprecated : use setSlug instead');
     }
 
     public function getName(): string
@@ -513,6 +515,18 @@ class File
         return $this;
     }
 
+    public function getFolder(): ?FileFolderEnum
+    {
+        return $this->folder;
+    }
+
+    public function setFolder(?FileFolderEnum $folder): self
+    {
+        $this->folder = $folder;
+
+        return $this;
+    }
+
     public function getOrganizationLogos(): Collection
     {
         return $this->organizationLogos;

+ 20 - 0
src/Enum/Core/FileFolderEnum.php

@@ -0,0 +1,20 @@
+<?php
+
+declare(strict_types=1);
+
+namespace App\Enum\Core;
+
+use App\Enum\EnumMethodsTrait;
+
+/**
+ * Type of folder for document management.
+ */
+enum FileFolderEnum: string
+{
+    use EnumMethodsTrait;
+
+    case DOCUMENTS = 'DOCUMENTS';
+    case IMAGES = 'IMAGES';
+    case PREVIEW = 'PREVIEW';
+    case UNRATED = 'UNRATED';
+}

+ 1 - 1
src/Service/Cron/Job/CleanTempFiles.php

@@ -61,7 +61,7 @@ class CleanTempFiles extends BaseCronJob
             if (($total - $i) === 50) {
                 $this->ui->print('  (...)');
             }
-            $this->ui->print('  * '.$file->getPath());
+            $this->ui->print('  * '.$file->getSlug());
         }
     }
 

+ 8 - 3
src/Service/Export/BaseExporter.php

@@ -6,6 +6,7 @@ namespace App\Service\Export;
 
 use App\ApiResources\Export\ExportRequest;
 use App\Entity\Core\File;
+use App\Enum\Core\FileFolderEnum;
 use App\Enum\Core\FileTypeEnum;
 use App\Enum\Core\FileVisibilityEnum;
 use App\Repository\Access\AccessRepository;
@@ -128,8 +129,11 @@ abstract class BaseExporter
     /**
      * Create a pending file record in the database.
      */
-    public function prepareFile(ExportRequest $exportRequest, bool $flushFile = true): File
-    {
+    public function prepareFile(
+        ExportRequest $exportRequest,
+        bool $flushFile = true,
+        ?FileFolderEnum $folder = FileFolderEnum::DOCUMENTS,
+    ): File {
         $requesterId = $exportRequest->getRequesterId();
         $requester = $this->accessRepository->find($requesterId);
         if ($requester === null) {
@@ -149,7 +153,8 @@ abstract class BaseExporter
             true,
             FileVisibilityEnum::NOBODY,
             $this->fileUtils->getMimeTypeFromExt($exportRequest->getFormat()->value),
-            $flushFile
+            $flushFile,
+            $folder
         );
     }
 

+ 2 - 1
src/Service/Export/ExporterInterface.php

@@ -6,6 +6,7 @@ namespace App\Service\Export;
 
 use App\ApiResources\Export\ExportRequest;
 use App\Entity\Core\File;
+use App\Enum\Core\FileFolderEnum;
 use App\Service\Export\Model\ExportModelInterface;
 
 /**
@@ -27,7 +28,7 @@ interface ExporterInterface
     /**
      * Create a pending file record in the database.
      */
-    public function prepareFile(ExportRequest $exportRequest, bool $flushFile = true): File;
+    public function prepareFile(ExportRequest $exportRequest, bool $flushFile = true, ?FileFolderEnum $folder = FileFolderEnum::DOCUMENTS): File;
 
     /**
      * Construit le modèle de données qui servira au render du template.

+ 6 - 2
src/Service/File/FileManager.php

@@ -11,6 +11,7 @@ use App\Entity\Access\Access;
 use App\Entity\Core\File;
 use App\Entity\Organization\Organization;
 use App\Entity\Person\Person;
+use App\Enum\Core\FileFolderEnum;
 use App\Enum\Core\FileTypeEnum;
 use App\Enum\Core\FileVisibilityEnum;
 use App\Repository\Core\FileRepository;
@@ -82,6 +83,7 @@ class FileManager
      * @param bool                       $isTemporary Is it a temporary file that can be deleted after some time
      * @param string|null                $mimeType    Mimetype of the file, if not provided, the method will try to guess it from its file name's extension
      * @param bool                       $flushFile   Should the newly created file be flushed after having been persisted?
+     * @param FileFolderEnum|null        $folder      The folder where the file is stored, designed for document management
      */
     public function prepareFile(
         Organization|Access|Person $owner,
@@ -92,10 +94,11 @@ class FileManager
         FileVisibilityEnum $visibility = FileVisibilityEnum::NOBODY,
         ?string $mimeType = null,
         bool $flushFile = true,
+        ?FileFolderEnum $folder = FileFolderEnum::UNRATED,
     ): File {
         return $this
             ->localStorage
-            ->prepareFile($owner, $filename, $type, $createdBy, $isTemporary, $visibility, $mimeType, $flushFile);
+            ->prepareFile($owner, $filename, $type, $createdBy, $isTemporary, $visibility, $mimeType, $flushFile, $folder);
     }
 
     /**
@@ -123,10 +126,11 @@ class FileManager
         FileVisibilityEnum $visibility = FileVisibilityEnum::NOBODY,
         ?string $mimeType = null,
         ?string $config = null,
+        ?FileFolderEnum $folder = FileFolderEnum::UNRATED,
     ): File {
         return $this
             ->localStorage
-            ->makeFile($owner, $filename, $type, $content, $author, $isTemporary, $visibility, $mimeType);
+            ->makeFile($owner, $filename, $type, $content, $author, $isTemporary, $visibility, $mimeType, $config, $folder);
     }
 
     /**

+ 7 - 1
src/Service/File/Storage/LocalStorage.php

@@ -8,6 +8,7 @@ use App\Entity\Access\Access;
 use App\Entity\Core\File;
 use App\Entity\Organization\Organization;
 use App\Entity\Person\Person;
+use App\Enum\Core\FileFolderEnum;
 use App\Enum\Core\FileHostEnum;
 use App\Enum\Core\FileSizeEnum;
 use App\Enum\Core\FileStatusEnum;
@@ -148,6 +149,7 @@ class LocalStorage implements FileStorageInterface
      * @param bool                       $isTemporary Is it a temporary file that can be deleted after some time
      * @param string|null                $mimeType    Mimetype of the file, if not provided, the method will try to guess it from its file name's extension
      * @param bool                       $flushFile   Should the newly created file be flushed after having been persisted?
+     * @param FileFolderEnum|null        $folder      The folder where the file is stored, designed for document management
      */
     public function prepareFile(
         Organization|Access|Person $owner,
@@ -158,6 +160,7 @@ class LocalStorage implements FileStorageInterface
         FileVisibilityEnum $visibility = FileVisibilityEnum::NOBODY,
         ?string $mimeType = null,
         bool $flushFile = true,
+        ?FileFolderEnum $folder = FileFolderEnum::UNRATED,
     ): File {
         [$organization, $person] = $this->getOrganizationAndPersonFromOwner($owner);
 
@@ -172,6 +175,7 @@ class LocalStorage implements FileStorageInterface
             ->setMimeType($mimeType ?? $this->fileUtils->guessMimeTypeFromFilename($filename))
             ->setCreateDate(new \DateTime())
             ->setCreatedBy($createdBy->getId())
+            ->setFolder($folder)
             ->setStatus(FileStatusEnum::PENDING);
 
         $this->entityManager->persist($file);
@@ -260,6 +264,7 @@ class LocalStorage implements FileStorageInterface
         FileVisibilityEnum $visibility = FileVisibilityEnum::NOBODY,
         ?string $mimeType = null,
         ?string $config = null,
+        ?FileFolderEnum $folder = FileFolderEnum::UNRATED,
     ): File {
         $file = $this->prepareFile(
             $owner,
@@ -269,7 +274,8 @@ class LocalStorage implements FileStorageInterface
             $isTemporary,
             $visibility,
             $mimeType,
-            false
+            false,
+            $folder,
         );
 
         if (!empty($config)) {

+ 3 - 3
tests/Unit/Service/Cron/Job/CleanTempFilesTest.php

@@ -76,13 +76,13 @@ class CleanTempFilesTest extends TestCase
         $cleanTempFiles = $this->getMockFor('preview');
 
         $file1 = $this->getMockBuilder(File::class)->getMock();
-        $file1->method('getPath')->willReturn('/foo');
+        $file1->method('getSlug')->willReturn('/foo');
 
         $file2 = $this->getMockBuilder(File::class)->getMock();
-        $file2->method('getPath')->willReturn('/bar');
+        $file2->method('getSlug')->willReturn('/bar');
 
         $file3 = $this->getMockBuilder(File::class)->getMock();
-        $file3->method('getPath')->willReturn('/foo/bar');
+        $file3->method('getSlug')->willReturn('/foo/bar');
 
         $cleanTempFiles->method('listFilesToDelete')->with($maxDate)->willReturn([$file1, $file2, $file3]);
 

+ 10 - 1
tests/Unit/Service/Export/BaseExporterTest.php

@@ -6,6 +6,7 @@ use App\ApiResources\Export\ExportRequest;
 use App\Entity\Access\Access;
 use App\Entity\Core\File;
 use App\Entity\Organization\Organization;
+use App\Enum\Core\FileFolderEnum;
 use App\Enum\Core\FileTypeEnum;
 use App\Enum\Core\FileVisibilityEnum;
 use App\Enum\Export\ExportFormatEnum;
@@ -261,7 +262,15 @@ class BaseExporterTest extends TestCase
         $this->fileManager->expects(self::once())
             ->method('prepareFile')
             ->with(
-                $access, 'Foo.pdf', FileTypeEnum::UNKNOWN, $access, true, FileVisibilityEnum::NOBODY, 'application/pdf', false
+                $access,
+                'Foo.pdf',
+                FileTypeEnum::UNKNOWN,
+                $access,
+                true,
+                FileVisibilityEnum::NOBODY,
+                'application/pdf',
+                false,
+                FileFolderEnum::DOCUMENTS
             )->willReturn($file);
 
         $result = $exporter->prepareFile($exportRequest, false);

+ 3 - 2
tests/Unit/Service/File/FileManagerTest.php

@@ -8,6 +8,7 @@ use ApiPlatform\Metadata\UrlGeneratorInterface;
 use App\Entity\Access\Access;
 use App\Entity\Core\File;
 use App\Entity\Organization\Organization;
+use App\Enum\Core\FileFolderEnum;
 use App\Enum\Core\FileTypeEnum;
 use App\Enum\Core\FileVisibilityEnum;
 use App\Repository\Core\FileRepository;
@@ -120,7 +121,7 @@ class FileManagerTest extends TestCase
         $this->localStorage
             ->expects(self::once())
             ->method('prepareFile')
-            ->with($owner, $filename, $fileType, $createdBy, $isTemporary, $visibility, $mimeType, $flushFile);
+            ->with($owner, $filename, $fileType, $createdBy, $isTemporary, $visibility, $mimeType, $flushFile, FileFolderEnum::UNRATED);
 
         $file = $fileManager->prepareFile($owner, $filename, $fileType, $createdBy, $isTemporary, $visibility, $mimeType, $flushFile);
     }
@@ -157,7 +158,7 @@ class FileManagerTest extends TestCase
         $this->localStorage
             ->expects(self::once())
             ->method('makeFile')
-            ->with($owner, $filename, $fileType, $content, $author, $isTemporary, $visibility, $mimeType);
+            ->with($owner, $filename, $fileType, $content, $author, $isTemporary, $visibility, $mimeType, null, FileFolderEnum::UNRATED);
 
         $file = $fileManager->makeFile($owner, $filename, $fileType, $content, $author, $isTemporary, $visibility, $mimeType);
     }

+ 11 - 5
tests/Unit/Service/File/Storage/LocalStorageTest.php

@@ -6,6 +6,7 @@ use App\Entity\Access\Access;
 use App\Entity\Core\File;
 use App\Entity\Organization\Organization;
 use App\Entity\Person\Person;
+use App\Enum\Core\FileFolderEnum;
 use App\Enum\Core\FileHostEnum;
 use App\Enum\Core\FileSizeEnum;
 use App\Enum\Core\FileStatusEnum;
@@ -391,7 +392,9 @@ class LocalStorageTest extends TestCase
             $author,
             true,
             FileVisibilityEnum::ONLY_ORGANIZATION,
-            'application/pdf'
+            'application/pdf',
+            true,
+            FileFolderEnum::UNRATED
         );
 
         $this->assertEquals($owner, $file->getOrganization());
@@ -421,7 +424,7 @@ class LocalStorageTest extends TestCase
 
         $this->fileUtils->method('guessMimeTypeFromFilename')->with('file.txt')->willReturn('text/plain');
 
-        $file = $fileStorage->prepareFile($owner, 'file.txt', FileTypeEnum::NONE, $author);
+        $file = $fileStorage->prepareFile($owner, 'file.txt', FileTypeEnum::NONE, $author, false, FileVisibilityEnum::NOBODY, null, true, FileFolderEnum::UNRATED);
 
         $this->assertEquals(null, $file->getOrganization());
         $this->assertEquals($owner, $file->getPerson());
@@ -457,7 +460,8 @@ class LocalStorageTest extends TestCase
             false,
             FileVisibilityEnum::NOBODY,
             'text/plain',
-            false
+            false,
+            FileFolderEnum::UNRATED
         );
     }
 
@@ -666,7 +670,7 @@ class LocalStorageTest extends TestCase
         $fileStorage
             ->expects(self::once())
             ->method('prepareFile')
-            ->with($organization, 'foo.txt', FileTypeEnum::NONE, $author, true, FileVisibilityEnum::ONLY_ORGANIZATION, 'mime/type')
+            ->with($organization, 'foo.txt', FileTypeEnum::NONE, $author, true, FileVisibilityEnum::ONLY_ORGANIZATION, 'mime/type', false, FileFolderEnum::UNRATED)
             ->willReturn($file);
 
         $fileStorage
@@ -683,7 +687,9 @@ class LocalStorageTest extends TestCase
             $author,
             true,
             FileVisibilityEnum::ONLY_ORGANIZATION,
-            'mime/type');
+            'mime/type',
+            null,
+            FileFolderEnum::UNRATED);
     }
 
     /**