diff --git a/src/app/entity/models/EntityModelAbstract.php b/src/app/entity/models/EntityModelAbstract.php index 7d780870ea6280d9d51871c47c7f8d3c81ebae3a..ebeff7ccfcce9e318e67ef59d081b18a60e8e8b8 100644 --- a/src/app/entity/models/EntityModelAbstract.php +++ b/src/app/entity/models/EntityModelAbstract.php @@ -24,13 +24,15 @@ abstract class EntityModelAbstract public static function get(array $aArgs = []) { ValidatorModel::arrayType($aArgs, ['select', 'where', 'data', 'orderBy']); + ValidatorModel::intType($aArgs, ['limit']); $aEntities = DatabaseModel::select([ 'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'], 'table' => ['entities'], - 'where' => $aArgs['where'], - 'data' => $aArgs['data'], - 'order_by' => $aArgs['orderBy'] + 'where' => empty($aArgs['where']) ? [] : $aArgs['where'], + 'data' => empty($aArgs['data']) ? [] : $aArgs['data'], + 'order_by' => empty($aArgs['orderBy']) ? [] : $aArgs['orderBy'], + 'limit' => empty($aArgs['limit']) ? 0 : $aArgs['limit'] ]); return $aEntities; diff --git a/src/app/user/models/UserModelAbstract.php b/src/app/user/models/UserModelAbstract.php index dd2ede28b6f1a9c050962e2a353417b0c4d67baf..2828d0eff52e95da30a5cb218208aabf42ecda19 100644 --- a/src/app/user/models/UserModelAbstract.php +++ b/src/app/user/models/UserModelAbstract.php @@ -25,13 +25,15 @@ abstract class UserModelAbstract public static function get(array $aArgs) { ValidatorModel::arrayType($aArgs, ['select', 'where', 'data', 'orderBy']); + ValidatorModel::intType($aArgs, ['limit']); $aUsers = DatabaseModel::select([ 'select' => empty($aArgs['select']) ? ['*'] : $aArgs['select'], 'table' => ['users'], - 'where' => $aArgs['where'], - 'data' => $aArgs['data'], - 'order_by' => $aArgs['orderBy'] + 'where' => empty($aArgs['where']) ? [] : $aArgs['where'], + 'data' => empty($aArgs['data']) ? [] : $aArgs['data'], + 'order_by' => empty($aArgs['orderBy']) ? [] : $aArgs['orderBy'], + 'limit' => empty($aArgs['limit']) ? 0 : $aArgs['limit'] ]); return $aUsers; diff --git a/src/core/controllers/AutoCompleteController.php b/src/core/controllers/AutoCompleteController.php index 7b5ac7d67039a7c95fd2552dd32c24d852e737b7..c1175523b0e6e598c87299b391d52f4341eb77af 100644 --- a/src/core/controllers/AutoCompleteController.php +++ b/src/core/controllers/AutoCompleteController.php @@ -29,6 +29,8 @@ use User\models\UserModel; class AutoCompleteController { + const LIMIT = 50; + public static function getContacts(Request $request, Response $response) { $data = $request->getQueryParams(); @@ -98,7 +100,8 @@ class AutoCompleteController 'select' => ['user_id', 'firstname', 'lastname'], 'where' => $requestData['where'], 'data' => $requestData['data'], - 'orderBy' => ['lastname'] + 'orderBy' => ['lastname'], + 'limit' => self::LIMIT ]); $data = []; @@ -144,31 +147,34 @@ class AutoCompleteController 'select' => ['DISTINCT users.user_id', 'users.id', 'users.firstname', 'users.lastname'], 'table' => ['users, users_entities'], 'where' => $requestData['where'], - 'data' => $requestData['data'] - ]); - - $requestData = AutoCompleteController::getDataForRequest([ - 'search' => $data['search'], - 'fields' => '(users.firstname ilike ? OR users.lastname ilike ?)', - 'where' => [ - 'users_entities IS NULL', - 'users.user_id not in (?)', - 'users.status != ?', - 'users.enabled = ?' - ], - 'data' => [$excludedUsers, 'DEL', 'Y'], - 'fieldsNumber' => 2, - ]); - - $usersNoEntities = DatabaseModel::select([ - 'select' => ['users.id', 'users.user_id', 'users.firstname', 'users.lastname'], - 'table' => ['users', 'users_entities'], - 'left_join' => ['users.user_id = users_entities.user_id'], - 'where' => $requestData['where'], - 'data' => $requestData['data'] + 'data' => $requestData['data'], + 'limit' => self::LIMIT ]); - $users = array_merge($users, $usersNoEntities); + if (count($users) == self::LIMIT) { + $requestData = AutoCompleteController::getDataForRequest([ + 'search' => $data['search'], + 'fields' => '(users.firstname ilike ? OR users.lastname ilike ?)', + 'where' => [ + 'users_entities IS NULL', + 'users.user_id not in (?)', + 'users.status != ?', + 'users.enabled = ?' + ], + 'data' => [$excludedUsers, 'DEL', 'Y'], + 'fieldsNumber' => 2, + ]); + + $usersNoEntities = DatabaseModel::select([ + 'select' => ['users.id', 'users.user_id', 'users.firstname', 'users.lastname'], + 'table' => ['users', 'users_entities'], + 'left_join' => ['users.user_id = users_entities.user_id'], + 'where' => $requestData['where'], + 'data' => $requestData['data'] + ]); + + $users = array_merge($users, $usersNoEntities); + } } else { $requestData = AutoCompleteController::getDataForRequest([ 'search' => $data['search'], @@ -179,10 +185,11 @@ class AutoCompleteController ]); $users = UserModel::get([ - 'select' => ['user_id', 'firstname', 'lastname'], + 'select' => ['id', 'user_id', 'firstname', 'lastname'], 'where' => $requestData['where'], 'data' => $requestData['data'], - 'orderBy' => ['lastname'] + 'orderBy' => ['lastname'], + 'limit' => self::LIMIT ]); } @@ -229,7 +236,8 @@ class AutoCompleteController 'table' => ['users, usergroup_content, usergroups_services'], 'where' => $requestData['where'], 'data' => $requestData['data'], - 'order_by' => ['users.lastname'] + 'order_by' => ['users.lastname'], + 'limit' => self::LIMIT ]); $data = []; @@ -265,7 +273,8 @@ class AutoCompleteController 'select' => ['entity_id', 'entity_label', 'short_label'], 'where' => $requestData['where'], 'data' => $requestData['data'], - 'orderBy' => ['entity_label'] + 'orderBy' => ['entity_label'], + 'limit' => self::LIMIT ]); $data = []; diff --git a/test/AutocompleteControllerTest.php b/test/AutocompleteControllerTest.php index cae0429ebbbe1954cda3a2088efed7786ce2ab3d..dd2b011ece6fe87099c53eb44a863d5ea4dde1c2 100644 --- a/test/AutocompleteControllerTest.php +++ b/test/AutocompleteControllerTest.php @@ -47,7 +47,12 @@ class AutocompleteControllerTest extends TestCase $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']); $request = \Slim\Http\Request::createFromEnvironment($environment); - $response = $autocompleteController->getUsers($request, new \Slim\Http\Response()); + $aArgs = [ + 'search' => 'bain' + ]; + $fullRequest = $request->withQueryParams($aArgs); + + $response = $autocompleteController->getUsers($fullRequest, new \Slim\Http\Response()); $responseBody = json_decode((string)$response->getBody()); $this->assertInternalType('array', $responseBody); @@ -69,7 +74,12 @@ class AutocompleteControllerTest extends TestCase $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']); $request = \Slim\Http\Request::createFromEnvironment($environment); - $response = $autocompleteController->getUsersForAdministration($request, new \Slim\Http\Response()); + $aArgs = [ + 'search' => 'bern', + ]; + $fullRequest = $request->withQueryParams($aArgs); + + $response = $autocompleteController->getUsersForAdministration($fullRequest, new \Slim\Http\Response()); $responseBody = json_decode((string)$response->getBody()); $this->assertInternalType('array', $responseBody); @@ -90,7 +100,12 @@ class AutocompleteControllerTest extends TestCase $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']); $request = \Slim\Http\Request::createFromEnvironment($environment); - $response = $autocompleteController->getUsersForVisa($request, new \Slim\Http\Response()); + $aArgs = [ + 'search' => 'dau', + ]; + $fullRequest = $request->withQueryParams($aArgs); + + $response = $autocompleteController->getUsersForVisa($fullRequest, new \Slim\Http\Response()); $responseBody = json_decode((string)$response->getBody()); $this->assertInternalType('array', $responseBody); @@ -112,7 +127,12 @@ class AutocompleteControllerTest extends TestCase $environment = \Slim\Http\Environment::mock(['REQUEST_METHOD' => 'GET']); $request = \Slim\Http\Request::createFromEnvironment($environment); - $response = $autocompleteController->getEntities($request, new \Slim\Http\Response()); + $aArgs = [ + 'search' => 'mai', + ]; + $fullRequest = $request->withQueryParams($aArgs); + + $response = $autocompleteController->getEntities($fullRequest, new \Slim\Http\Response()); $responseBody = json_decode((string)$response->getBody()); $this->assertInternalType('array', $responseBody);