From 17434d6b9d8cbbc62d551c02e54cf4b1e378d7f6 Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Fri, 13 Nov 2020 18:10:14 +0100
Subject: [PATCH] FEAT #14568 TIME 2:00 WIP search all documents

---
 composer.json                                 |  1 +
 rest/index.php                                |  3 +
 sql/2010.sql                                  |  2 +
 .../search/controllers/SearchController.php   | 87 +++++++++++++++++++
 vendor/composer/autoload_psr4.php             |  1 +
 vendor/composer/autoload_static.php           |  5 ++
 6 files changed, 99 insertions(+)
 create mode 100755 src/app/search/controllers/SearchController.php

diff --git a/composer.json b/composer.json
index e4601e216b..536eac42ee 100755
--- a/composer.json
+++ b/composer.json
@@ -10,6 +10,7 @@
             "Email\\"             : "src/app/email/",
             "Group\\"             : "src/app/group/",
             "History\\"           : "src/app/history/",
+            "Search\\"            : "src/app/search/",
             "User\\"              : "src/app/user/",
             "Workflow\\"          : "src/app/workflow/"
     	}
diff --git a/rest/index.php b/rest/index.php
index 1833fb45f7..ed972a74e9 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -121,6 +121,9 @@ $app->get('/users/{id}/history', \History\controllers\HistoryController::class .
 $app->post('/password', \User\controllers\UserController::class . ':forgotPassword');
 $app->put('/password', \User\controllers\UserController::class . ':updateForgottenPassword');
 
+//Search
+$app->get('/search/documents', \Search\controllers\SearchController::class . ':getDocuments');
+
 //Signatures
 $app->get('/users/{id}/signatures', \User\controllers\SignatureController::class . ':get');
 $app->post('/users/{id}/signatures', \User\controllers\SignatureController::class . ':create');
diff --git a/sql/2010.sql b/sql/2010.sql
index a319d332a6..bef4d9c1a2 100755
--- a/sql/2010.sql
+++ b/sql/2010.sql
@@ -6,6 +6,8 @@
 --                                                                          --
 -- *************************************************************************--
 
+CREATE EXTENSION IF NOT EXISTS unaccent;
+
 ALTER TABLE main_documents DROP COLUMN IF EXISTS status;
 ALTER TABLE main_documents ADD COLUMN status varchar(10);
 
diff --git a/src/app/search/controllers/SearchController.php b/src/app/search/controllers/SearchController.php
new file mode 100755
index 0000000000..1e08340496
--- /dev/null
+++ b/src/app/search/controllers/SearchController.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+* Copyright Maarch since 2008 under licence GPLv3.
+* See LICENCE.txt file at the root folder for more details.
+* This file is part of Maarch software.
+*
+*/
+
+/**
+* @brief Search Controller
+* @author dev@maarch.org
+*/
+
+namespace Search\controllers;
+
+use Group\controllers\PrivilegeController;
+use Document\models\DocumentModel;
+use Slim\Http\Request;
+use Slim\Http\Response;
+use Workflow\models\WorkflowModel;
+
+class SearchController
+{
+    public function getDocuments(Request $request, Response $response)
+    {
+        $queryParams = $request->getQueryParams();
+
+        $queryParams['offset'] = empty($queryParams['offset']) ? 0 : (int)$queryParams['offset'];
+        $queryParams['limit'] = empty($queryParams['limit']) ? 0 : (int)$queryParams['limit'];
+
+        $where = [];
+        $data = [];
+        if (!PrivilegeController::hasPrivilege(['userId' => $GLOBALS['id'], 'privilege' => 'manage_documents'])) {
+            $where[] = 'typist = ?';
+            $data[] = $GLOBALS['id'];
+        }
+
+        $whereWorkflow = [];
+        $dataWorkflow = [];
+        if (!empty($queryParams['statuses'])) {
+            $whereWorkflow[] = 'status in (?)';
+            $dataWorkflow[] = $queryParams['statuses'];
+        }
+        if (!empty($queryParams['users'])) {
+            $whereWorkflow[] = 'user_id in (?)';
+            $dataWorkflow[] = $queryParams['statuses'];
+        }
+
+        if (!empty($whereWorkflow)) {
+            $workflows = WorkflowModel::get([
+                'select'    => ['main_document_id'],
+                'where'     => $whereWorkflow,
+                'data'      => $dataWorkflow,
+                'groupBy'   => ['main_document_id']
+            ]);
+            $documentIds = array_column($workflows, 'main_document_id');
+            if (empty($documentIds)) {
+                $documentIds = [0];
+            }
+            $where[] = 'id in (?)';
+            $data[] = $documentIds;
+        }
+
+        if (!empty($queryParams['search'])) {
+            $where[] = '(reference ilike ? OR unaccent(title) ilike unaccent(?::text))';
+            $data[] = "%{$queryParams['search']}%";
+            $data[] = "%{$queryParams['search']}%";
+        }
+
+        $documents = DocumentModel::get([
+            'select'    => ['id', 'title', 'reference', 'count(1) OVER()'],
+            'where'     => $where,
+            'data'      => $data,
+            'limit'     => $queryParams['limit'],
+            'offset'    => $queryParams['offset'],
+            'orderBy'   => ['creation_date desc']
+        ]);
+
+        $count = empty($documents[0]['count']) ? 0 : $documents[0]['count'];
+        foreach ($documents as $key => $document) {
+            unset($documents[$key]['count']);
+        }
+
+        return $response->withJson(['documents' => $documents, 'count' => $count]);
+    }
+}
diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php
index 1fa2618bf2..202d663a19 100644
--- a/vendor/composer/autoload_psr4.php
+++ b/vendor/composer/autoload_psr4.php
@@ -12,6 +12,7 @@ return array(
     'Symfony\\Polyfill\\Mbstring\\' => array($vendorDir . '/symfony/polyfill-mbstring'),
     'SrcCore\\' => array($baseDir . '/src/core'),
     'Slim\\' => array($vendorDir . '/slim/slim/Slim'),
+    'Search\\' => array($baseDir . '/src/app/search'),
     'Respect\\Validation\\' => array($vendorDir . '/respect/validation/library'),
     'Psr\\Http\\Message\\' => array($vendorDir . '/psr/http-message/src'),
     'Psr\\Container\\' => array($vendorDir . '/psr/container/src'),
diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php
index 9aa07932a5..f411d06d9b 100644
--- a/vendor/composer/autoload_static.php
+++ b/vendor/composer/autoload_static.php
@@ -29,6 +29,7 @@ class ComposerStaticInit637514d10f1ed5d4c55a005a428a3656
             'Symfony\\Polyfill\\Mbstring\\' => 26,
             'SrcCore\\' => 8,
             'Slim\\' => 5,
+            'Search\\' => 7,
         ),
         'R' => 
         array (
@@ -102,6 +103,10 @@ class ComposerStaticInit637514d10f1ed5d4c55a005a428a3656
         array (
             0 => __DIR__ . '/..' . '/slim/slim/Slim',
         ),
+        'Search\\' => 
+        array (
+            0 => __DIR__ . '/../..' . '/src/app/search',
+        ),
         'Respect\\Validation\\' => 
         array (
             0 => __DIR__ . '/..' . '/respect/validation/library',
-- 
GitLab