From 505e59e5a779b40bc23fee8ea6a28a36bc52eae5 Mon Sep 17 00:00:00 2001 From: "florian.azizian" <florian.azizian@maarch.org> Date: Mon, 26 Oct 2020 12:53:46 +0100 Subject: [PATCH] FEAT #15049 TIME 2:30 getAcknowledgement from webservice --- bin/exportSeda/checkAllReplies.php | 6 +- .../controllers/ExportSEDATrait.php | 93 ++++++++++++++++++- src/core/models/CurlModel.php | 19 ++-- 3 files changed, 105 insertions(+), 13 deletions(-) diff --git a/bin/exportSeda/checkAllReplies.php b/bin/exportSeda/checkAllReplies.php index 2372ff2db70..642bc4942db 100755 --- a/bin/exportSeda/checkAllReplies.php +++ b/bin/exportSeda/checkAllReplies.php @@ -158,11 +158,11 @@ foreach ($pendingResources as $resId) { // TODO GET XML $pathToDocument = 'xmlFile'; - foreach ($resIds as $resId) { + foreach ($resIds as $res) { $id = Resource\controllers\StoreController::storeAttachment([ 'encodedFile' => base64_encode(file_get_contents($pathToDocument)), 'type' => 'reply_record_management', - 'resIdMaster' => $resId, + 'resIdMaster' => $res, 'title' => 'Réponse au transfert', 'format' => 'xml', 'status' => 'TRA' @@ -173,7 +173,7 @@ foreach ($pendingResources as $resId) { \Resource\models\ResModel::update([ 'set' => ['status' => $GLOBALS['statusReplyReceived']], 'where' => ['res_id = ?'], - 'data' => [$resId] + 'data' => [$res] ]); $nbMailsRetrieved++; } diff --git a/src/app/external/exportSeda/controllers/ExportSEDATrait.php b/src/app/external/exportSeda/controllers/ExportSEDATrait.php index f7ce65c450c..bf941648bd5 100644 --- a/src/app/external/exportSeda/controllers/ExportSEDATrait.php +++ b/src/app/external/exportSeda/controllers/ExportSEDATrait.php @@ -175,7 +175,8 @@ trait ExportSEDATrait 'config' => $config, 'encodedFilePath' => $sedaPackage['encodedFilePath'], 'messageFilename' => $sedaPackage['messageFilename'], - 'resId' => $resource['res_id'] + 'resId' => $resource['res_id'], + 'reference' => $data['messageObject']['messageIdentifier'] ]); if (!empty($elementSend['errors'])) { return ['errors' => [$elementSend['errors']]]; @@ -210,11 +211,16 @@ trait ExportSEDATrait return ['errors' => 'Error returned by the route /medona/create : ' . $curlResponse['response']['message']]; } - // TODO GET XML - $pathToDocument = 'xmlFile'; + $acknowledgement = ExportSEDATrait::getAcknowledgement([ + 'config' => $args['config'], + 'reference' => $args['reference'] + ]); + if (!empty($acknowledgement['errors'])) { + return ['errors' => 'Error returned in getAcknowledgement process : ' . $acknowledgement['errors']]; + } $id = StoreController::storeAttachment([ - 'encodedFile' => base64_encode(file_get_contents($pathToDocument)), + 'encodedFile' => $acknowledgement['encodedAcknowledgement'], 'type' => 'acknowledgement_record_management', 'resIdMaster' => $args['resId'], 'title' => 'Accusé de réception', @@ -460,6 +466,85 @@ trait ExportSEDATrait return $informationsToSend; } + public static function getAcknowledgement($args = []) + { + $curlResponse = CurlModel::execSimple([ + 'url' => rtrim($args['config']['exportSeda']['urlSAEService'], '/') . '/medona/message/reference?reference='.urlencode($args['reference']."_Ack"), + 'method' => 'GET', + 'cookie' => 'LAABS-AUTH=' . urlencode($args['config']['exportSeda']['token']), + 'headers' => [ + 'Accept: application/json', + 'Content-Type: application/json', + 'User-Agent: ' . $args['config']['exportSeda']['userAgent'] + ] + ]); + + if (!empty($curlResponse['errors'])) { + return ['errors' => 'Error returned by the route /medona/message/reference : ' . $curlResponse['errors']]; + } elseif ($curlResponse['code'] != 200) { + return ['errors' => 'Error returned by the route /medona/message/reference : ' . $curlResponse['response']['message']]; + } + + $messageId = $curlResponse['response']['messageId']; + + $curlResponse = CurlModel::execSimple([ + 'url' => rtrim($args['config']['exportSeda']['urlSAEService'], '/') . '/medona/message/'.urlencode($curlResponse['response']['messageId']).'/Export', + 'method' => 'GET', + 'cookie' => 'LAABS-AUTH=' . urlencode($args['config']['exportSeda']['token']), + 'headers' => [ + 'Accept: application/zip', + 'Content-Type: application/json', + 'User-Agent: ' . $args['config']['exportSeda']['userAgent'] + ] + ]); + + if (!empty($curlResponse['errors'])) { + return ['errors' => 'Error returned by the route /medona/message/{messageId}/Export : ' . $curlResponse['errors']]; + } elseif ($curlResponse['code'] != 200) { + return ['errors' => 'Error returned by the route /medona/message/{messageId}/Export : ' . $curlResponse['response']['message']]; + } + + $encodedAcknowledgement = ExportSEDATrait::getEncodedDocumentFromEncodedZip([ + 'encodedZipDocument' => base64_encode($curlResponse['response']), + 'messageId' => $messageId + ]); + if (!empty($encodedAcknowledgement['errors'])) { + return ['errors' => 'Error during getEncodedDocumentFromEncodedZip process : ' . $encodedAcknowledgement['errors']]; + } + + return ['encodedAcknowledgement' => $encodedAcknowledgement['encodedDocument']]; + } + + public static function getEncodedDocumentFromEncodedZip(array $args) + { + $tmpPath = CoreConfigModel::getTmpPath(); + + $zipDocumentOnTmp = $tmpPath . mt_rand() .'_' . $GLOBALS['id'] . '_acknowledgement.zip'; + file_put_contents($zipDocumentOnTmp, base64_decode($args['encodedZipDocument'])); + + $zipArchive = new \ZipArchive(); + $open = $zipArchive->open($zipDocumentOnTmp); + if ($open != true) { + return ['errors' => "getDocumentFromEncodedZip : $open"]; + } + + $dirOnTmp = $tmpPath . mt_rand() . '_acknowledgement'; + if (!@$zipArchive->extractTo($dirOnTmp)) { + return ['errors' => "getDocumentFromEncodedZip : Extract failed"]; + } + + $filesOnTmp = scandir($dirOnTmp); + foreach ($filesOnTmp as $fileOnTmp) { + if ($fileOnTmp == $args['messageId']) { + $base64Content = base64_encode(file_get_contents("{$dirOnTmp}/{$fileOnTmp}")); + unlink($zipDocumentOnTmp); + return ['encodedDocument' => $base64Content]; + } + } + + return ['errors' => "getDocumentFromEncodedZip : No document was found in Zip"]; + } + public static function checkAcknowledgmentRecordManagement(array $args) { ValidatorModel::notEmpty($args, ['resId']); diff --git a/src/core/models/CurlModel.php b/src/core/models/CurlModel.php index a46aeb98d31..2f458e303df 100755 --- a/src/core/models/CurlModel.php +++ b/src/core/models/CurlModel.php @@ -256,16 +256,21 @@ class CurlModel $curl = curl_init(); curl_setopt_array($curl, $opts); $rawResponse = curl_exec($curl); - $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); - $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); - $errors = curl_error($curl); + $code = curl_getinfo($curl, CURLINFO_HTTP_CODE); + $headerSize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); + $errors = curl_error($curl); curl_close($curl); - $headers = substr($rawResponse, 0, $headerSize); - $headers = explode("\r\n", $headers); + $headers = substr($rawResponse, 0, $headerSize); + $headers = explode("\r\n", $headers); $response = substr($rawResponse, $headerSize); if (empty($args['noLogs'])) { + if (in_array('Accept: application/zip', $args['headers'])) { + $logResponse = 'Zip file content'; + } else { + $logResponse = $response; + } LogsController::add([ 'isTech' => true, 'moduleId' => 'curl', @@ -273,12 +278,14 @@ class CurlModel 'tableName' => 'curl', 'recordId' => 'execSimple', 'eventType' => "Url : {$args['url']} HttpCode : {$code} Errors : {$errors}", - 'eventId' => "Response : {$response}" + 'eventId' => "Response : {$logResponse}" ]); } if ($args['isXml']) { $response = simplexml_load_string($response); + } elseif (in_array('Accept: application/zip', $args['headers'])) { + $response = trim($response); } else { $response = json_decode($response, true); } -- GitLab