Parcourir la source

minor update and add doc

Olivier Massot il y a 3 ans
Parent
commit
db20c5a360

+ 32 - 0
doc/exports.md

@@ -0,0 +1,32 @@
+# Fonctionnement des exports
+
+## Requête HTTP
+
+Pour déclencher un export, on effectue une requete POST visant une ApiResource de type ExportRequest
+Toutes les ApiResource implémentant l'interface ExportRequestInterface sont traitées par le DataPersister 
+`App\DataPersister\Export\LicenceCmf\ExportRequestDataPersister`.
+
+## ExportRequestDataPersister
+
+Le ExportRequestDataPersister utilise un pattern iterable, c'est-à-dire qu'il balaie (via la classe `ExporterHandler`)
+tous les services implémentant `ExporterInterface` jusqu'à trouver un service qui supporte 
+l'ExportRequest passée en paramètre.
+
+Une fois le bon service d'export trouvé, il appelle la méthode `export($exportRequest)` de ce service.
+
+## Le service d'export
+
+Les services d'export recoivent en paramètre une ExportRequest.
+
+Ils vont ensuite effectuer les opérations suivantes:
+
+1. Construire un modèle : le service génère un objet `ExportModel` (qui peut être selon les cas objet ou une collection d'objets), qui
+contiendra toutes les données nécessaires au rendu du template.
+2. Générer le HTML : le service passe ensuite le modèle au template Twig associé, et récupère le résultat au format HTML. 
+3. Encoder : l'encodeur adapté est trouvé via la classe `EncoderHandler` qui itère sur les encoders disponibles
+jusqu'à trouver le premier qui supporte le format demandé dans l'ExportRequest, puis appelle la méthode `encode($html)`
+de cet encoder, et enfin récupère le contenu final du fichier
+4. Création du fichier : le service `TemporaryFileStorage` est utilisé pour créer le fichier d'export dans 
+un répertoire temporaire. 
+5. Mise à jour de la DB : Un objet `File` est enfin enregistré en base.
+

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

@@ -13,7 +13,7 @@ use Exception;
 use Twig\Environment;
 
 /**
- * Classe de base des Exporter
+ * Classe de base des services d'export
  */
 class BaseExporter implements ExporterInterface
 {
@@ -40,7 +40,7 @@ class BaseExporter implements ExporterInterface
      * @return File
      * @throws Exception
      */
-    public function export(ExportRequest $exportRequest)
+    public function export(ExportRequest $exportRequest): File
     {
         // Génère le modèle à partir de l'exportRequest
         $model = $this->buildModel($exportRequest);

+ 4 - 1
src/Service/Storage/TemporaryFileStorage.php

@@ -32,7 +32,10 @@ class TemporaryFileStorage extends FileStorage
      */
     public function write(string $filename, string $content): string
     {
-        $filePath = Path::join(Uuid::uuid4(), $filename);
+        // Temp dir name is a concatenation of current time (for convenience and sorting) and a short uuid4
+        $tempDirName = date('Ymd_His') . '_' . substr(Uuid::uuid4()->toString(), 0, 8);
+
+        $filePath = Path::join($tempDirName, $filename);
         $this->filesystem->get('temp')->getAdapter()->write($filePath, $content);
 
         return Path::join('temp', $filePath);

+ 1 - 0
src/Service/Storage/UploadStorage.php

@@ -9,6 +9,7 @@ namespace App\Service\Storage;
  * Pour la durée de la migration vers Symfony 5, la gestion des fichiers est déléguée à l'ancienne API
  *
  */
+// TODO: revoir le fonctionnement de ce storage pour le mettre sur le même format que les autres
 class UploadStorage
 {
     public function __construct(private string $internalFilesUploadUri)