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