From 04a44d86eec5eb306261c7f8880160981049d5e4 Mon Sep 17 00:00:00 2001
From: Laurent Giovannoni <laurent.giovannoni@maarch.org>
Date: Thu, 16 Nov 2017 11:12:43 +0100
Subject: [PATCH] FEAT #6441 add ws for qualiville

---
 apps/maarch_entreprise/standard_connect.php | 30 ++++++++
 core/Controllers/ResController.php          | 77 +++++++++++++++++++++
 core/Models/ResModelAbstract.php            | 20 ++++++
 rest/index.php                              |  3 +
 4 files changed, 130 insertions(+)

diff --git a/apps/maarch_entreprise/standard_connect.php b/apps/maarch_entreprise/standard_connect.php
index 8606dc75de6..4798edefec6 100755
--- a/apps/maarch_entreprise/standard_connect.php
+++ b/apps/maarch_entreprise/standard_connect.php
@@ -1,7 +1,18 @@
 <?php
+function getHeaders() 
+{
+
+    foreach ($_SERVER as $h => $v ) 
+    {      
+      if( preg_match( '/HTTP_(.+)/', $h, $hp ) )
+        $headers[$hp[1]] = $v ;
+    }
+    return $headers;
+}
 
 if ($restMode) {
     $userLogin = [];
+    $http_header = getHeaders();
     //HTTP AUTH
     if (
         (isset($_SERVER["PHP_AUTH_USER"])
@@ -14,6 +25,20 @@ if ($restMode) {
         list($_SERVER["PHP_AUTH_USER"], $_SERVER["PHP_AUTH_PW"])
             = explode(":", base64_decode(substr($_SERVER["HTTP_AUTHORIZATION"], 6)));
     }
+    else if (isset($http_header['LOGIN']) && isset($http_header['PASSWORD'])){
+        $force_login = $http_header['LOGIN'];
+        $force_psw = $http_header['PASSWORD'];
+    }
+    else{
+        header("WWW-Authenticate: Basic realm=\"Maarch WebServer Engine\"");
+        if (preg_match("/Microsoft/", $_SERVER["SERVER_SOFTWARE"])) {
+            header("Status: 401 Unauthorized");
+            exit();
+        } else {
+            header("HTTP/1.0 401 Unauthorized");
+            exit();
+        }
+    }
     if (
         (isset($_SERVER["PHP_AUTH_USER"])
             && isset($_SERVER["PHP_AUTH_PW"])
@@ -24,6 +49,11 @@ if ($restMode) {
         $password = $_SERVER["PHP_AUTH_PW"];
     }
 
+    else if (isset($force_login) && isset($force_psw)){
+        $_SESSION['user']['UserId'] = $force_login;
+        $password = $force_psw;
+    }
+
     $userLogin['user'] = $_SESSION['user']['UserId'];
     $userLogin['password'] = $password;
 
diff --git a/core/Controllers/ResController.php b/core/Controllers/ResController.php
index c99b243c3da..506f4c6f448 100755
--- a/core/Controllers/ResController.php
+++ b/core/Controllers/ResController.php
@@ -226,4 +226,81 @@ class ResController
         }
         return $return;
     }
+
+
+    
+
+    public function getListDocs(RequestInterface $request, ResponseInterface $response, $aArgs)
+    {
+        $clause = $aArgs['clause'];
+        $clause_elem = explode("&",$clause);
+
+        $tab_where = array();
+        foreach ($clause_elem as $elem) {
+            $tmp = explode("=",$elem);
+            $column = $tmp[0];
+            $values = explode(",",$tmp[1]);
+            $tmp_values = array();
+            foreach ($values as $v) {
+                if (!empty($v)){
+                    if ($column == "date_begin"){
+                        $v_date = explode("-",$v);
+                        array_push($tmp_values, "creation_date >= '".$v_date[2]."-".$v_date[1]."-".$v_date[0]."'");
+                    }
+                    else if ($column == "date_end"){
+                        $v_date = explode("-",$v);
+                        array_push($tmp_values, "creation_date <= '".$v_date[2]."-".$v_date[1]."-".$v_date[0]."'");
+                    }
+                    else
+                        array_push($tmp_values, $column."='".trim($v)."'");
+                }
+            }
+            if (count($tmp_values) > 0) array_push($tab_where, "(".implode(" OR ", $tmp_values).")");
+        }
+
+        $clause = implode(" AND ", $tab_where);
+        if (empty($clause)) $clause = ' 1=1 ';
+
+        $colSelect = $aArgs['select'];
+        $select_elem = explode(",",$colSelect);
+        $tab_tables = array();
+
+        foreach ($select_elem as $col) {
+            $c_elem=explode(".",$col);
+            if (!in_array($c_elem[0], $tab_tables)){
+                //ajout de la table
+                array_push($tab_tables,$c_elem[0]);
+
+                //ajout de la jointure
+                if ($c_elem[0] == "mlb_coll_ext")
+                    $clause .= " AND res_letterbox.res_id = mlb_coll_ext.res_id ";
+                elseif ($c_elem[0] == "doctypes")
+                    $clause .= " AND res_letterbox.type_id = doctypes.type_id ";
+                elseif ($c_elem[0] == "entities")
+                    $clause .= " AND res_letterbox.destination=entities.entity_id ";
+            }
+        }
+
+        $result = array();        
+        $resList = ResModel::getDocsByClause(
+            [
+                'select'  => [$colSelect],
+                'table'  => implode(",",$tab_tables),
+                'clause'   => $clause
+            ]
+        );
+
+        foreach ($resList as $doc) {
+            $result_infos = array();
+            foreach ($doc as $key => $value) {
+                if (empty($value)) $result_infos[$key] = '';
+                elseif ($key=='creation_date' || ($key=='closing_date' && !empty($value)) || ($key=='process_limit_date' && !empty($value)) || ($key=='admission_date' && !empty($value))) {
+                    $result_infos[$key] = str_replace("-","/",\functions::format_date_db($value, false, '', false));
+                }
+                else $result_infos[$key] = $value;
+            }
+            array_push($result,$result_infos);            
+        }
+        return $response->withJson(['docs' => $result, 'nb_docs' => count($resList)]);
+    }
 }
diff --git a/core/Models/ResModelAbstract.php b/core/Models/ResModelAbstract.php
index 1739348cf2a..a95c1578f8b 100755
--- a/core/Models/ResModelAbstract.php
+++ b/core/Models/ResModelAbstract.php
@@ -157,6 +157,26 @@ class ResModelAbstract
         return ['lock' => $lock, 'lockBy' => $lockBy];
     }
 
+    public static function getDocsByClause(array $aArgs = [])
+    {
+		ValidatorModel::notEmpty($aArgs, ['clause']);
+
+        if (!empty($aArgs['table'])) {
+            $table = $aArgs['table'];
+        } else {
+            $table = 'res_view_letterbox';
+        }
+
+        $aReturn = DatabaseModel::select([
+            'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
+            'table'     => [$table],
+            'where'     => [$aArgs['clause']],
+            'order_by'  => ['res_letterbox.res_id']
+        ]);
+
+        return $aReturn;
+    }
+
     // In Progress
 //    public static function getProcessLimitDate(array $aArgs)
 //    {
diff --git a/rest/index.php b/rest/index.php
index e4c61c308fd..ee43aa222fb 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -241,5 +241,8 @@ $app->post('/contacts', \Core\Controllers\ContactController::class . ':create');
 //Templates
 $app->post('/templates/{id}/duplicate', \Templates\Controllers\TemplateController::class . ':duplicate');
 
+//liste documents
+$app->get('/res/listDocs/{clause}/{select}', \Core\Controllers\ResController::class . ':getListDocs');
+
 
 $app->run();
-- 
GitLab