From 69d90db87b17d9b15bd692b825bcb94ca4c41fe0 Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Tue, 28 Jan 2020 12:07:12 +0100
Subject: [PATCH] FEAT #12346 TIME 0:45 Modify constraint + Thumbnail

---
 migration/20.03/2003.sql                      |  2 +
 sql/structure.sql                             |  2 +-
 src/app/convert/models/AdrModel.php           | 37 +------------------
 .../resource/controllers/ResController.php    | 34 ++++++++---------
 4 files changed, 19 insertions(+), 56 deletions(-)

diff --git a/migration/20.03/2003.sql b/migration/20.03/2003.sql
index 412b01c4a89..b0b80f58006 100644
--- a/migration/20.03/2003.sql
+++ b/migration/20.03/2003.sql
@@ -473,6 +473,8 @@ ALTER TABLE adr_letterbox DROP COLUMN IF EXISTS relation;
 ALTER TABLE adr_letterbox ADD COLUMN relation integer;
 UPDATE adr_letterbox SET relation = 1;
 ALTER TABLE adr_letterbox ALTER COLUMN relation SET NOT NULL;
+ALTER TABLE adr_letterbox DROP CONSTRAINT adr_letterbox_unique_key;
+ALTER TABLE adr_letterbox ADD CONSTRAINT adr_letterbox_unique_key UNIQUE (res_id, type, relation);
 
 ALTER TABLE res_letterbox DROP COLUMN IF EXISTS integrations;
 ALTER TABLE res_letterbox ADD COLUMN integrations jsonb DEFAULT '{}' NOT NULL;
diff --git a/sql/structure.sql b/sql/structure.sql
index 7d0adcee6fa..d95f2d321a8 100755
--- a/sql/structure.sql
+++ b/sql/structure.sql
@@ -985,7 +985,7 @@ CREATE TABLE adr_letterbox
   filename character varying(255) NOT NULL,
   fingerprint character varying(255) DEFAULT NULL,
   CONSTRAINT adr_letterbox_pkey PRIMARY KEY (id),
-  CONSTRAINT adr_letterbox_unique_key UNIQUE (res_id, type)
+  CONSTRAINT adr_letterbox_unique_key UNIQUE (res_id, type, relation)
 )
 WITH (OIDS=FALSE);
 
diff --git a/src/app/convert/models/AdrModel.php b/src/app/convert/models/AdrModel.php
index 436dc743aa2..8c4df7f8514 100755
--- a/src/app/convert/models/AdrModel.php
+++ b/src/app/convert/models/AdrModel.php
@@ -63,28 +63,7 @@ class AdrModel
 
         return $document[0];
     }
-
-    public static function getTypedDocumentAdrByResId(array $aArgs)
-    {
-        ValidatorModel::notEmpty($aArgs, ['resId', 'type']);
-        ValidatorModel::intVal($aArgs, ['resId']);
-        ValidatorModel::stringType($aArgs, ['type']);
-        ValidatorModel::arrayType($aArgs, ['select']);
-
-        $adr = DatabaseModel::select([
-            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
-            'table'     => ['adr_letterbox'],
-            'where'     => ['res_id = ?', 'type = ?'],
-            'data'      => [$aArgs['resId'], $aArgs['type']]
-        ]);
-
-        if (empty($adr[0])) {
-            return [];
-        }
-
-        return $adr[0];
-    }
-
+    
     public static function getTypedAttachAdrByResId(array $aArgs)
     {
         ValidatorModel::notEmpty($aArgs, ['resId', 'type']);
@@ -148,20 +127,6 @@ class AdrModel
         return true;
     }
 
-    public static function deleteDocumentAdr(array $args)
-    {
-        ValidatorModel::notEmpty($args, ['where', 'data']);
-        ValidatorModel::arrayType($args, ['where', 'data']);
-
-        DatabaseModel::delete([
-            'table' => 'adr_letterbox',
-            'where' => $args['where'],
-            'data'  => $args['data']
-        ]);
-
-        return true;
-    }
-
     public static function deleteAttachmentAdr(array $args)
     {
         ValidatorModel::notEmpty($args, ['where', 'data']);
diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php
index d3c7cdc3a96..28886df5bd1 100755
--- a/src/app/resource/controllers/ResController.php
+++ b/src/app/resource/controllers/ResController.php
@@ -577,41 +577,37 @@ class ResController
         return $response->withHeader('Content-Type', $mimeType);
     }
 
-    public function getThumbnailContent(Request $request, Response $response, array $aArgs)
+    public function getThumbnailContent(Request $request, Response $response, array $args)
     {
-        if (!Validator::intVal()->validate($aArgs['resId'])) {
+        if (!Validator::intVal()->validate($args['resId'])) {
             return $response->withStatus(403)->withJson(['errors' => 'resId param is not an integer']);
         }
 
         $pathToThumbnail = 'apps/maarch_entreprise/img/noThumbnail.png';
 
-        $document = ResModel::getById(['select' => ['filename'], 'resId' => $aArgs['resId']]);
+        $document = ResModel::getById(['select' => ['filename'], 'resId' => $args['resId']]);
         if (empty($document)) {
             return $response->withStatus(400)->withJson(['errors' => 'Document does not exist']);
         }
 
-        if (!empty($document['filename']) && ResController::hasRightByResId(['resId' => [$aArgs['resId']], 'userId' => $GLOBALS['id']])) {
-            $tnlAdr = AdrModel::getTypedDocumentAdrByResId([
-                'select'    => ['docserver_id', 'path', 'filename'],
-                'resId'     => $aArgs['resId'],
-                'type'      => 'TNL'
-            ]);
-            if (empty($tnlAdr)) {
-                ConvertThumbnailController::convert(['collId' => 'letterbox_coll', 'resId' => $aArgs['resId']]);
-                $tnlAdr = AdrModel::getTypedDocumentAdrByResId([
-                    'select'    => ['docserver_id', 'path', 'filename'],
-                    'resId'     => $aArgs['resId'],
-                    'type'      => 'TNL'
-                ]);
+        if (!empty($document['filename']) && ResController::hasRightByResId(['resId' => [$args['resId']], 'userId' => $GLOBALS['id']])) {
+            $relation = AdrModel::getDocuments(['select' => ['MAX(relation)'], 'where' => ['res_id = ?'], 'data' => [$args['resId']]]);
+            $relation = $relation[0]['max'];
+
+            $tnlAdr = AdrModel::getDocuments(['select' => ['docserver_id', 'path', 'filename'], 'where' => ['res_id = ?', 'type = ?', 'relation = ?'], 'data' => [$args['resId'], 'TNL', $relation]]);
+
+            if (empty($tnlAdr[0])) {
+                ConvertThumbnailController::convert(['collId' => 'letterbox_coll', 'resId' => $args['resId']]);
+                $tnlAdr = AdrModel::getDocuments(['select' => ['docserver_id', 'path', 'filename'], 'where' => ['res_id = ?', 'type = ?', 'relation = ?'], 'data' => [$args['resId'], 'TNL', $relation]]);
             }
 
-            if (!empty($tnlAdr)) {
-                $docserver = DocserverModel::getByDocserverId(['docserverId' => $tnlAdr['docserver_id'], 'select' => ['path_template']]);
+            if (!empty($tnlAdr[0])) {
+                $docserver = DocserverModel::getByDocserverId(['docserverId' => $tnlAdr[0]['docserver_id'], 'select' => ['path_template']]);
                 if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) {
                     return $response->withStatus(400)->withJson(['errors' => 'Docserver does not exist']);
                 }
 
-                $pathToThumbnail = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $tnlAdr['path']) . $tnlAdr['filename'];
+                $pathToThumbnail = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $tnlAdr[0]['path']) . $tnlAdr[0]['filename'];
             }
         }
 
-- 
GitLab