From f23ce191e3eb8d947d7c26862a8ea13b876deb86 Mon Sep 17 00:00:00 2001 From: Ioannis Igoumenos Date: Wed, 6 Mar 2024 12:57:46 +0200 Subject: [PATCH] Introduce Identifier case insensitive configuration option and functionality --- app/Config/Schema/schema.xml | 1 + app/Controller/StandardController.php | 11 ++++++++++- app/Lib/lang.php | 1 + app/Model/CoSetting.php | 18 ++++++++++++++++++ app/Model/Identifier.php | 9 +++++++-- 5 files changed, 37 insertions(+), 3 deletions(-) diff --git a/app/Config/Schema/schema.xml b/app/Config/Schema/schema.xml index d1c95301b..274e9af50 100644 --- a/app/Config/Schema/schema.xml +++ b/app/Config/Schema/schema.xml @@ -3142,6 +3142,7 @@ + diff --git a/app/Controller/StandardController.php b/app/Controller/StandardController.php index bfa173950..751fa9a81 100644 --- a/app/Controller/StandardController.php +++ b/app/Controller/StandardController.php @@ -839,7 +839,16 @@ public function index() { if(!empty($this->request->query['search_identifier'])) { // XXX temporary implementation -- need more general approach (CO-1053) $args = array(); - $args['conditions']['Identifier.identifier'] = $this->request->query['search_identifier']; + // search.identifier is supported by CoDepartment, OrgIdentity, CoGroup, CoPerson API. All these requests + // require the coId as a query parameter + $CoSetting = ClassRegistry::init('CoSetting'); + if(!empty($this->request->query['coid']) + && $CoSetting->identifierISearchEnabled($this->request->query['coid']) + ) { + $args['conditions']['LOWER(Identifier.identifier) LIKE'] = '%' . $this->request->query['search_identifier'] . '%'; + } else { + $args['conditions']['Identifier.identifier'] = $this->request->query['search_identifier']; + } $orgPooled = $this->CmpEnrollmentConfiguration->orgIdentitiesPooled(); if(!empty($this->params['url']['coid']) && !$orgPooled) { diff --git a/app/Lib/lang.php b/app/Lib/lang.php index cb590c2c7..d8df81adb 100644 --- a/app/Lib/lang.php +++ b/app/Lib/lang.php @@ -1660,6 +1660,7 @@ 'fd.id.seq' => 'ID', 'fd.id.val' => 'ID: %1$s', // The next set must be named fd.model.validation-field + 'fd.identifier.caseinsensitive.search.enable' => 'Enable Case Insensitive Identifier Searching', 'fd.identifier.description' => 'Description', 'fd.identifier.identifier' => 'Identifier', 'fd.identifier.login' => 'Login', diff --git a/app/Model/CoSetting.php b/app/Model/CoSetting.php index 7f8a9fba3..254618c0d 100644 --- a/app/Model/CoSetting.php +++ b/app/Model/CoSetting.php @@ -84,6 +84,11 @@ class CoSetting extends AppModel { 'required' => false, 'allowEmpty' => true ), + 'enable_ident_isearch' => array( + 'rule' => 'boolean', + 'required' => false, + 'allowEmpty' => true + ), 'enable_nsf_demo' => array( 'rule' => 'boolean', 'required' => false, @@ -202,6 +207,7 @@ class CoSetting extends AppModel { 'group_create_admin_only' => false, 'enable_normalization' => true, 'enable_nsf_demo' => false, + 'enable_ident_isearch' => false, 'group_validity_sync_window' => DEF_GROUP_SYNC_WINDOW, 'invitation_validity' => DEF_INV_VALIDITY, 'garbage_collection_interval' => DEF_GARBAGE_COLLECT_INTERVAL, @@ -495,6 +501,18 @@ public function getTAndCLoginMode($coId) { return $this->lookupValue($coId, 't_and_c_login_mode'); } + /** + * Determine if Identifier Case Insensitise search is enabled for the specified CO. + * + * @since COmanage Registry 4.3.3 + * @param integer $coId CO ID + * @return boolean True if enabled, false otherwise + */ + + public function identifierISearchEnabled($coId) { + return (boolean)$this->lookupValue($coId, 'enable_ident_isearch'); + } + /** * Obtain a single CO setting. * diff --git a/app/Model/Identifier.php b/app/Model/Identifier.php index 68c576b3e..924934bfa 100644 --- a/app/Model/Identifier.php +++ b/app/Model/Identifier.php @@ -461,12 +461,17 @@ public function findCoForRecord($id) { * @param integer $coId CO ID to constrain search to * @param string $q String to search for * @param integer $limit Search limit - * @return Array Array of search results, as from find('all) + * @return Array Array of search results, as from find('all') */ public function search($coId, $q, $limit) { $args = array(); - $args['conditions']['LOWER(Identifier.identifier) LIKE'] = '%' . strtolower($q) . '%'; + $CoSetting = ClassRegistry::init('CoSetting'); + if($CoSetting->identifierISearchEnabled($coId)) { + $args['conditions']['LOWER(Identifier.identifier) LIKE'] = '%' . $q . '%'; + } else { + $args['conditions']['Identifier.identifier'] = $q; + } $args['conditions']['OR'] = array( 'CoPerson.co_id' => $coId, 'CoGroup.co_id' => $coId