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