From d3a00fdd90de57372bfa6e8ebb2e63ad8d76f731 Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Wed, 5 Feb 2020 10:37:56 +0100
Subject: [PATCH] FEAT #12346 TIME 1:10 Get versions informations

---
 rest/index.php                                |   3 +-
 .../resource/controllers/ResController.php    | 107 ++++++++++++------
 2 files changed, 77 insertions(+), 33 deletions(-)

diff --git a/rest/index.php b/rest/index.php
index 1a34cd5a549..6d317d4f734 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -342,7 +342,8 @@ $app->post('/resources', \Resource\controllers\ResController::class . ':create')
 $app->get('/resources/{resId}', \Resource\controllers\ResController::class . ':getById');
 $app->put('/resources/{resId}', \Resource\controllers\ResController::class . ':update');
 $app->get('/resources/{resId}/content', \Resource\controllers\ResController::class . ':getFileContent');
-$app->get('/resources/{resId}/contents/{version}', \Resource\controllers\ResController::class . ':getFileContents');
+$app->get('/resources/{resId}/versionsInformations', \Resource\controllers\ResController::class . ':getVersionsInformations');
+$app->get('/resources/{resId}/content/{version}', \Resource\controllers\ResController::class . ':getVersionFileContent');
 $app->get('/resources/{resId}/originalContent', \Resource\controllers\ResController::class . ':getOriginalFileContent');
 $app->get('/resources/{resId}/thumbnail', \Resource\controllers\ResController::class . ':getThumbnailContent');
 $app->get('/resources/{resId}/isAllowed', \Resource\controllers\ResController::class . ':isAllowedForCurrentUser');
diff --git a/src/app/resource/controllers/ResController.php b/src/app/resource/controllers/ResController.php
index 2269ecd37d8..0de9ba3d385 100755
--- a/src/app/resource/controllers/ResController.php
+++ b/src/app/resource/controllers/ResController.php
@@ -433,59 +433,102 @@ class ResController extends ResourceControlController
         }
     }
 
-    public function getFileContents(Request $request, Response $response, array $args)
+    public function getVersionsInformations(Request $request, Response $response, array $args)
     {
         if (!Validator::intVal()->validate($args['resId']) || !ResController::hasRightByResId(['resId' => [$args['resId']], 'userId' => $GLOBALS['id']])) {
             return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']);
         }
 
+        $pdfVersions = [];
+        $signedVersions = [];
+        $noteVersions = [];
         $resource = ResModel::getById(['resId' => $args['resId'], 'select' => ['version', 'filename']]);
         if (empty($resource['filename'])) {
-            return $response->withStatus(400)->withJson(['errors' => 'Document has no file']);
-        } elseif (!Validator::intVal()->validate($args['version']) || $args['version'] > $resource['version'] || $args['version'] < 1) {
-            return $response->withStatus(400)->withJson(['errors' => 'Incorrect version']);
+            return $response->withJson(['PDF' => $pdfVersions, 'SIGN' => $signedVersions, 'NOTE' => $noteVersions]);
         }
 
-        $contents = [];
         $convertedDocuments = AdrModel::getDocuments([
-            'select'    => ['docserver_id', 'path', 'filename', 'fingerprint', 'type'],
-            'where'     => ['res_id = ?', 'type in (?)', 'version = ?'],
-            'data'      => [$args['resId'], ['PDF', 'SIGN', 'NOTE'], $args['version']]
+            'select'    => ['type', 'version'],
+            'where'     => ['res_id = ?', 'type in (?)'],
+            'data'      => [$args['resId'], ['PDF', 'SIGN', 'NOTE']]
         ]);
+        if (empty($convertedDocuments)) {
+            return $response->withJson(['PDF' => $pdfVersions, 'SIGN' => $signedVersions, 'NOTE' => $noteVersions]);
+        }
 
         foreach ($convertedDocuments as $convertedDocument) {
-            $docserver = DocserverModel::getByDocserverId(['docserverId' => $convertedDocument['docserver_id'], 'select' => ['path_template', 'docserver_type_id']]);
-            if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) {
-                continue;
+            if ($convertedDocument['type'] == 'PDF') {
+                $pdfVersions[] = $convertedDocument['version'];
+            } elseif ($convertedDocument['type'] == 'SIGN') {
+                $signedVersions[] = $convertedDocument['version'];
+            } elseif ($convertedDocument['type'] == 'NOTE') {
+                $noteVersions[] = $convertedDocument['version'];
             }
+        }
 
-            $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $convertedDocument['path']) . $convertedDocument['filename'];
-            if (!file_exists($pathToDocument)) {
-                continue;
-            }
+        return $response->withJson(['PDF' => $pdfVersions, 'SIGN' => $signedVersions, 'NOTE' => $noteVersions]);
+    }
 
-            $docserverType = DocserverTypeModel::getById(['id' => $docserver['docserver_type_id'], 'select' => ['fingerprint_mode']]);
-            $fingerprint = StoreController::getFingerPrint(['filePath' => $pathToDocument, 'mode' => $docserverType['fingerprint_mode']]);
-            if (!empty($document['fingerprint']) && $document['fingerprint'] != $fingerprint) {
-                return $response->withStatus(400)->withJson(['errors' => 'Fingerprints do not match']);
-            }
+    public function getVersionFileContent(Request $request, Response $response, array $args)
+    {
+        if (!Validator::intVal()->validate($args['resId']) || !ResController::hasRightByResId(['resId' => [$args['resId']], 'userId' => $GLOBALS['id']])) {
+            return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']);
+        }
 
-            $fileContent = WatermarkController::watermarkResource(['resId' => $args['resId'], 'path' => $pathToDocument]);
-            if (empty($fileContent)) {
-                $fileContent = file_get_contents($pathToDocument);
-            }
-            if ($fileContent === false) {
-                continue;
-            }
+        $resource = ResModel::getById(['resId' => $args['resId'], 'select' => ['version', 'filename']]);
+        if (empty($resource['filename'])) {
+            return $response->withStatus(400)->withJson(['errors' => 'Document has no file']);
+        } elseif (!Validator::intVal()->validate($args['version']) || $args['version'] > $resource['version'] || $args['version'] < 1) {
+            return $response->withStatus(400)->withJson(['errors' => 'Incorrect version']);
+        }
 
-            if ($convertedDocument['type'] == 'NOTE' && !PrivilegeController::hasPrivilege(['privilegeId' => 'view_documents_with_notes', 'userId' => $GLOBALS['id']])) {
-                continue;
-            }
+        $queryParams = $request->getQueryParams();
+
+        $type = 'PDF';
+        if (!empty($queryParams['type']) && in_array($queryParams['type'], ['PDF', 'SIGN', 'NOTE'])) {
+            $type = $queryParams['type'];
+        }
+
+        if ($type == 'NOTE' && !PrivilegeController::hasPrivilege(['privilegeId' => 'view_documents_with_notes', 'userId' => $GLOBALS['id']])) {
+            return $response->withStatus(403)->withJson(['errors' => 'Document out of perimeter']);
+        }
+
+        $convertedDocument = AdrModel::getDocuments([
+            'select'    => ['docserver_id', 'path', 'filename', 'fingerprint'],
+            'where'     => ['res_id = ?', 'type = ?', 'version = ?'],
+            'data'      => [$args['resId'], $type, $args['version']]
+        ]);
 
-            $contents[$convertedDocument['type']] = base64_encode($fileContent);
+        if (empty($convertedDocument[0])) {
+            return $response->withStatus(400)->withJson(['errors' => 'Type has no file']);
+        }
+        $convertedDocument = $convertedDocument[0];
+
+        $docserver = DocserverModel::getByDocserverId(['docserverId' => $convertedDocument['docserver_id'], 'select' => ['path_template', 'docserver_type_id']]);
+        if (empty($docserver['path_template']) || !file_exists($docserver['path_template'])) {
+            return $response->withStatus(400)->withJson(['errors' => 'Docserver does not exist']);
+        }
+
+        $pathToDocument = $docserver['path_template'] . str_replace('#', DIRECTORY_SEPARATOR, $convertedDocument['path']) . $convertedDocument['filename'];
+        if (!file_exists($pathToDocument)) {
+            return $response->withStatus(404)->withJson(['errors' => 'Document not found on docserver']);
+        }
+
+        $docserverType = DocserverTypeModel::getById(['id' => $docserver['docserver_type_id'], 'select' => ['fingerprint_mode']]);
+        $fingerprint = StoreController::getFingerPrint(['filePath' => $pathToDocument, 'mode' => $docserverType['fingerprint_mode']]);
+        if (!empty($document['fingerprint']) && $document['fingerprint'] != $fingerprint) {
+            return $response->withStatus(400)->withJson(['errors' => 'Fingerprints do not match']);
+        }
+
+        $fileContent = WatermarkController::watermarkResource(['resId' => $args['resId'], 'path' => $pathToDocument]);
+        if (empty($fileContent)) {
+            $fileContent = file_get_contents($pathToDocument);
+        }
+        if ($fileContent === false) {
+            return $response->withStatus(404)->withJson(['errors' => 'Document not found on docserver']);
         }
 
-        return $response->withJson(['contents' => $contents]);
+        return $response->withJson(['encodedDocument' => base64_encode($fileContent)]);
     }
 
     public function getOriginalFileContent(Request $request, Response $response, array $aArgs)
-- 
GitLab