diff --git a/workflow/engine/config/schema.xml b/workflow/engine/config/schema.xml index 8a5f5f608..1d7715bcb 100755 --- a/workflow/engine/config/schema.xml +++ b/workflow/engine/config/schema.xml @@ -457,6 +457,12 @@ + + + + + + diff --git a/workflow/engine/data/mysql/schema.sql b/workflow/engine/data/mysql/schema.sql index 99625e082..96d5cd944 100644 --- a/workflow/engine/data/mysql/schema.sql +++ b/workflow/engine/data/mysql/schema.sql @@ -211,8 +211,10 @@ CREATE TABLE `CONFIGURATION` `PRO_UID` VARCHAR(32) default '' NOT NULL, `USR_UID` VARCHAR(32) default '' NOT NULL, `APP_UID` VARCHAR(32) default '' NOT NULL, - PRIMARY KEY (`CFG_UID`,`OBJ_UID`,`PRO_UID`,`USR_UID`,`APP_UID`) -)ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Stores the users, processes and/or applications configuratio'; + PRIMARY KEY (`CFG_UID`,`OBJ_UID`,`PRO_UID`,`USR_UID`,`APP_UID`), + KEY `INDEX_CFG_UID`(`CFG_UID`), + KEY `INDEX_USR_UID`(`USR_UID`) +)ENGINE=InnoDB DEFAULT CHARSET='utf8' COMMENT='Stores the users, processes and/or applications configuration'; #----------------------------------------------------------------------------- #-- CONTENT #----------------------------------------------------------------------------- diff --git a/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Filter.php b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Filter.php new file mode 100644 index 000000000..b6db43019 --- /dev/null +++ b/workflow/engine/src/ProcessMaker/BusinessModel/Cases/Filter.php @@ -0,0 +1,118 @@ +select(['CFG_VALUE']); + $query->where('CFG_UID', '=', self::ADVANCED_SEARCH_FILTER_KEY); + $query->where('USR_UID', '=', $userUid); + + // Get results + $records = $query->get(); + + // Transform the serialized string to JSON object + $records->each(function ($record) use (&$filters) { + $filters[] = json_decode($record->CFG_VALUE); + }); + + // Return filters + return $filters; + } + + /** + * Get a specific filter of the advanced search for the current user + * + * @param string $userUid + * @param string $filterUid + * + * @return object + */ + public static function getByUid($userUid, $filterUid) + { + // Initialize variables + $filter = null; + + // Build query + $query = Configuration::query()->select(['CFG_VALUE']); + $query->where('CFG_UID', '=', self::ADVANCED_SEARCH_FILTER_KEY); + $query->where('USR_UID', '=', $userUid); + $query->where('OBJ_UID', '=', $filterUid); + + // Get result + $record = $query->first(); + + if (!is_null($record)) { + $filter = json_decode($record->CFG_VALUE); + } + + // Return filter + return $filter; + } + + /** + * Save a new filter of the advanced search for the current user + * + * @param string $userUid + * @param string $name + * @param object $filters + * + * @return object + */ + public static function create($userUid, $name, $filters) + { + // Generate a new unique Uid + $filterUid = G::generateUniqueID(); + + // Build object to serialize and save + $filter = new stdClass(); + $filter->id = $filterUid; + $filter->name = $name; + $filter->filters = $filters; + + // Save new filter + $configuration = new Configuration(); + $configuration->CFG_UID = self::ADVANCED_SEARCH_FILTER_KEY; + $configuration->OBJ_UID = $filterUid; + $configuration->CFG_VALUE = json_encode($filter); + $configuration->USR_UID = $userUid; + $configuration->save(); + + // Return the new filter + return $filter; + } + + /** + * Delete a specific filter by filter Uid + * + * @param string $filterUid + */ + public static function delete($filterUid) + { + // Build the query + $query = Configuration::query()->where('CFG_UID', '=', self::ADVANCED_SEARCH_FILTER_KEY); + $query->where('OBJ_UID', '=', $filterUid); + + // Delete filter + $query->delete(); + } +} diff --git a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php index af67f6785..c72910312 100644 --- a/workflow/engine/src/ProcessMaker/Services/Api/Cases.php +++ b/workflow/engine/src/ProcessMaker/Services/Api/Cases.php @@ -10,6 +10,7 @@ use Exception; use ListUnassigned; use Luracast\Restler\RestException; use ProcessMaker\BusinessModel\Cases as BmCases; +use ProcessMaker\BusinessModel\Cases\Filter; use ProcessMaker\BusinessModel\User as BmUser; use ProcessMaker\Services\Api; use ProcessMaker\Util\DateTime; @@ -1463,4 +1464,94 @@ class Cases extends Api throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); } } + + /** + * Get filters of the advanced search for the current user + * + * @url GET /advanced-search/filters + * + * @return array + * + * @throws RestException + */ + public function doGetAdvancedSearchFilters() + { + try { + return Filter::getByUser($this->getUserId()); + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + + /** + * Get a specific filter of the advanced search for the current user + * + * @url GET /advanced-search/filter/:filterUid + * + * @param string $filterUid {@min 32}{@max 32} + * + * @return object + * + * @throws RestException + */ + public function doGetAdvancedSearchFilter($filterUid) + { + try { + $filter = Filter::getByUid($this->getUserId(), $filterUid); + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + + // If not exists the requested filter throw an 404 error + if (is_null($filter)) { + throw new RestException(404, "Filter with Uid '{$filterUid}'."); + } + return $filter; + } + + /** + * Add a new filter of the advanced search for the current user + * + * @url POST /advanced-search/filter + * + * @param string $name + * @param string $filters + * + * @return object + * + * @throws RestException + */ + public function doPostAdvancedSearchFilter($name, $filters) + { + try { + // Create JSON object if is a serialized string + $filters = is_string($filters) ? json_decode($filters) : $filters; + + // Create new filter + $filter = Filter::create($this->getUserId(), $name, $filters); + + // Return the new filter + return $filter; + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } + + /** + * Delete a specific filter of the advanced search for the current user + * + * @url DELETE /advanced-search/filter/:filterUid + * + * @param string $filterUid {@min 32}{@max 32} + * + * @throws RestException + */ + public function doDeleteAdvancedSearchFilter($filterUid) + { + try { + Filter::delete($filterUid); + } catch (Exception $e) { + throw new RestException(Api::STAT_APP_EXCEPTION, $e->getMessage()); + } + } }