From 258e61c0c484cd500f46bb584161f0031f527b8c Mon Sep 17 00:00:00 2001
From: Damien <damien.burel@maarch.org>
Date: Wed, 28 Feb 2018 15:48:32 +0100
Subject: [PATCH] FEAT #142 Create autocomplete routes

---
 rest/index.php                                |   9 +-
 src/app/status/models/StatusModelAbstract.php |   8 +-
 src/app/user/controllers/UserController.php   |  17 ---
 src/app/user/models/UserModelAbstract.php     |   8 +-
 .../controllers/AutoCompleteController.php    | 118 ++++++++++++++++++
 5 files changed, 134 insertions(+), 26 deletions(-)
 create mode 100644 src/core/controllers/AutoCompleteController.php

diff --git a/rest/index.php b/rest/index.php
index 5883261b368..52712f15ac2 100755
--- a/rest/index.php
+++ b/rest/index.php
@@ -115,6 +115,12 @@ $app->get('/administration', \SrcCore\controllers\CoreController::class . ':getA
 $app->get('/administration/users', \User\controllers\UserController::class . ':getUsersForAdministration');
 $app->get('/administration/users/{id}', \User\controllers\UserController::class . ':getUserForAdministration');
 
+//AutoComplete
+$app->get('/autocomplete/users', \SrcCore\controllers\AutoCompleteController::class . ':getUsers');
+$app->get('/autocomplete/users/visa', \SrcCore\controllers\AutoCompleteController::class . ':getUsersForVisa');
+$app->get('/autocomplete/entities', \SrcCore\controllers\AutoCompleteController::class . ':getEntities');
+$app->get('/autocomplete/statuses', \SrcCore\controllers\AutoCompleteController::class . ':getStatuses');
+
 //Baskets
 $app->get('/baskets', \Basket\controllers\BasketController::class . ':get');
 $app->post('/baskets', \Basket\controllers\BasketController::class . ':create');
@@ -138,7 +144,7 @@ $app->put('/statuses/{identifier}', \Status\controllers\StatusController::class
 $app->delete('/statuses/{identifier}', \Status\controllers\StatusController::class . ':delete');
 $app->get('/administration/statuses/new', \Status\controllers\StatusController::class . ':getNewInformations');
 
-//groups
+//Groups
 $app->get('/groups', \Group\controllers\GroupController::class . ':get');
 $app->post('/groups', \Group\controllers\GroupController::class . ':create');
 $app->get('/groups/{id}', \Group\controllers\GroupController::class . ':getById');
@@ -173,7 +179,6 @@ $app->get('/res/{resId}/lock', \Resource\controllers\ResController::class . ':is
 $app->get('/res/{resId}/notes/count', \Resource\controllers\ResController::class . ':getNotesCountForCurrentUserById');
 
 //Users
-$app->get('/users/autocompleter', \User\controllers\UserController::class . ':getUsersForAutocompletion');
 $app->post('/users', \User\controllers\UserController::class . ':create');
 $app->get('/users/{id}/details', \User\controllers\UserController::class . ':getDetailledById');
 $app->put('/users/{id}', \User\controllers\UserController::class . ':update');
diff --git a/src/app/status/models/StatusModelAbstract.php b/src/app/status/models/StatusModelAbstract.php
index 21870f510e8..5e0ae527818 100755
--- a/src/app/status/models/StatusModelAbstract.php
+++ b/src/app/status/models/StatusModelAbstract.php
@@ -20,8 +20,10 @@ use SrcCore\models\DatabaseModel;
 
 class StatusModelAbstract
 {
-    public static function get()
+    public static function get(array $aArgs = [])
     {
+        ValidatorModel::arrayType($aArgs, ['select']);
+
         $aReturn = DatabaseModel::select([
             'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
             'table'     => ['status'],
@@ -31,7 +33,7 @@ class StatusModelAbstract
         return $aReturn;
     }
 
-    public static function getById(array $aArgs = [])
+    public static function getById(array $aArgs)
     {
         ValidatorModel::notEmpty($aArgs, ['id']);
         ValidatorModel::stringType($aArgs, ['id']);
@@ -46,7 +48,7 @@ class StatusModelAbstract
         return $aReturn;
     }
 
-    public static function getByIdentifier(array $aArgs = [])
+    public static function getByIdentifier(array $aArgs)
     {
         ValidatorModel::notEmpty($aArgs, ['identifier']);
         ValidatorModel::intVal($aArgs, ['identifier']);
diff --git a/src/app/user/controllers/UserController.php b/src/app/user/controllers/UserController.php
index 4514c71168b..8db516f6026 100644
--- a/src/app/user/controllers/UserController.php
+++ b/src/app/user/controllers/UserController.php
@@ -458,23 +458,6 @@ class UserController
         ]);
     }
 
-    public function getUsersForAutocompletion(Request $request, Response $response)
-    {
-        $excludedUsers = ['superadmin'];
-
-        $users = UserModel::get([
-            'select'    => ['user_id', 'firstname', 'lastname'],
-            'where'     => ['enabled = ?', 'status != ?', 'user_id not in (?)'],
-            'data'      => ['Y', 'DEL', $excludedUsers]
-        ]);
-
-        foreach ($users as $key => $value) {
-            $users[$key]['formattedUser'] = "{$value['firstname']} {$value['lastname']} ({$value['user_id']})";
-        }
-
-        return $response->withJson($users);
-    }
-
     public function getUsersForAdministration(Request $request, Response $response)
     {
         if (!ServiceModel::hasService(['id' => 'admin_users', 'userId' => $GLOBALS['userId'], 'location' => 'apps', 'type' => 'admin'])) {
diff --git a/src/app/user/models/UserModelAbstract.php b/src/app/user/models/UserModelAbstract.php
index fdec0ee1fee..2f0511eaa4a 100644
--- a/src/app/user/models/UserModelAbstract.php
+++ b/src/app/user/models/UserModelAbstract.php
@@ -16,7 +16,6 @@ namespace User\models;
 
 use Docserver\models\DocserverModel;
 use Entity\models\EntityModel;
-use History\controllers\HistoryController;
 use SrcCore\models\CoreConfigModel;
 use SrcCore\models\DatabaseModel;
 use SrcCore\models\SecurityModel;
@@ -26,13 +25,14 @@ class UserModelAbstract
 {
     public static function get(array $aArgs)
     {
-        ValidatorModel::arrayType($aArgs, ['select', 'where', 'data']);
+        ValidatorModel::arrayType($aArgs, ['select', 'where', 'data', 'orderBy']);
 
         $aUsers = DatabaseModel::select([
             'select'    => empty($aArgs['select']) ? ['*'] : $aArgs['select'],
             'table'     => ['users'],
-            'where'     => empty($aArgs['where']) ? [] : $aArgs['where'],
-            'data'      => empty($aArgs['data']) ? [] : $aArgs['data']
+            'where'     => $aArgs['where'],
+            'data'      => $aArgs['data'],
+            'order_by'  => $aArgs['orderBy']
         ]);
 
         return $aUsers;
diff --git a/src/core/controllers/AutoCompleteController.php b/src/core/controllers/AutoCompleteController.php
new file mode 100644
index 00000000000..2e3f171470c
--- /dev/null
+++ b/src/core/controllers/AutoCompleteController.php
@@ -0,0 +1,118 @@
+<?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 Auto Complete Controller
+* @author dev@maarch.org
+*/
+
+namespace SrcCore\controllers;
+
+use Core\Models\ServiceModel;
+use Slim\Http\Request;
+use Slim\Http\Response;
+use Entity\models\EntityModel;
+use Status\models\StatusModel;
+use User\models\UserModel;
+
+class AutoCompleteController
+{
+    public static function getUsers(Request $request, Response $response)
+    {
+        $excludedUsers = ['superadmin'];
+
+        $users = UserModel::get([
+            'select'    => ['user_id', 'firstname', 'lastname'],
+            'where'     => ['enabled = ?', 'status != ?', 'user_id not in (?)'],
+            'data'      => ['Y', 'DEL', $excludedUsers],
+            'orderBy'   => ['lastname']
+        ]);
+
+        $data = [];
+        foreach ($users as $key => $value) {
+            $primaryEntity = UserModel::getPrimaryEntityByUserId(['userId' => $value['user_id']]);
+            $data[] = [
+                'type'          => 'user',
+                'id'            => $value['user_id'],
+                'idToDisplay'   => "{$value['firstname']} {$value['lastname']}",
+                'otherInfo'     => $primaryEntity['entity_label']
+            ];
+        }
+
+        return $response->withJson($data);
+    }
+
+    public static function getUsersForVisa(Request $request, Response $response)
+    {
+        $excludedUsers = ['superadmin'];
+
+        $users = UserModel::get([
+            'select'    => ['user_id', 'firstname', 'lastname'],
+            'where'     => ['enabled = ?', 'status != ?', 'user_id not in (?)'],
+            'data'      => ['Y', 'DEL', $excludedUsers],
+            'orderBy'   => ['lastname']
+        ]);
+
+        $data = [];
+        foreach ($users as $key => $value) {
+            if (ServiceModel::hasService(['id' => 'visa_documents', 'userId' => $value['user_id'], 'location' => 'visa', 'type' => 'use'])) {
+                $primaryEntity = UserModel::getPrimaryEntityByUserId(['userId' => $value['user_id']]);
+                $data[] = [
+                    'type'          => 'user',
+                    'id'            => $value['user_id'],
+                    'idToDisplay'   => "{$value['firstname']} {$value['lastname']}",
+                    'otherInfo'     => $primaryEntity['entity_label']
+                ];
+            }
+        }
+
+        return $response->withJson($data);
+    }
+
+    public static function getEntities(Request $request, Response $response)
+    {
+        $entities = EntityModel::get([
+            'select'    => ['entity_id', 'entity_label', 'short_label'],
+            'where'     => ['enabled = ?'],
+            'data'      => ['Y'],
+            'orderBy'   => ['entity_label']
+        ]);
+
+        $data = [];
+        foreach ($entities as $key => $value) {
+            $data[] = [
+                'type'          => 'entity',
+                'id'            => $value['entity_id'],
+                'idToDisplay'   => $value['entity_label'],
+                'otherInfo'     => $value['short_label']
+            ];
+        }
+
+        return $response->withJson($data);
+    }
+
+    public static function getStatuses(Request $request, Response $response)
+    {
+        $statuses = StatusModel::get([
+            'select'    => ['id', 'label_status']
+        ]);
+
+        $data = [];
+        foreach ($statuses as $key => $value) {
+            $data[] = [
+                'type'          => 'status',
+                'id'            => $value['id'],
+                'idToDisplay'   => $value['label_status'],
+                'otherInfo'     => $value['label_status']
+            ];
+        }
+
+        return $response->withJson($data);
+    }
+}
-- 
GitLab