From: Marcin Haba Date: Mon, 17 Apr 2023 12:42:40 +0000 (+0200) Subject: baculum: Add order_by and order_direction parameters to sources endpoint X-Git-Tag: Release-13.0.3~77 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=6b5caa735e32b55d31486b0e15dce70d3d48cf12;p=thirdparty%2Fbacula.git baculum: Add order_by and order_direction parameters to sources endpoint --- diff --git a/gui/baculum/protected/API/Modules/SourceManager.php b/gui/baculum/protected/API/Modules/SourceManager.php index bf3629a77..d951842a9 100644 --- a/gui/baculum/protected/API/Modules/SourceManager.php +++ b/gui/baculum/protected/API/Modules/SourceManager.php @@ -45,7 +45,7 @@ class SourceManager extends APIModule { const SOURCE_RESULT_MODE_NORMAL = 'normal'; const SOURCE_RESULT_MODE_OVERVIEW = 'overview'; - public function getSources($criteria = [], $props = [], $limit_val = 0, $offset_val = 0, $mode = self::SOURCE_RESULT_MODE_NORMAL) { + public function getSources($criteria = [], $props = [], $limit_val = 0, $offset_val = 0, $order_by = null, $order_direction = 'DESC', $mode = self::SOURCE_RESULT_MODE_NORMAL) { $jobs_show = new \JobsShow; $config = $jobs_show->show( ConsoleOutputPage::OUTPUT_FORMAT_JSON @@ -194,6 +194,14 @@ class SourceManager extends APIModule { // below work only with filtered jobs $sources = $sources_ft; + $misc = $this->getModule('misc'); + + // Sort items if needed + if (is_string($order_by)) { + // Sort all items + $misc->sortResultsByField($sources, $order_by, $order_direction); + } + if ($mode == self::SOURCE_RESULT_MODE_OVERVIEW) { // Overview mode. $res = []; diff --git a/gui/baculum/protected/API/Pages/API/Sources.php b/gui/baculum/protected/API/Pages/API/Sources.php index a2e561000..d400960d3 100644 --- a/gui/baculum/protected/API/Pages/API/Sources.php +++ b/gui/baculum/protected/API/Pages/API/Sources.php @@ -46,8 +46,17 @@ class Sources extends BaculumAPIServer { $endtime_to = $this->Request->contains('endtime_to') && $misc->isValidInteger($this->Request['endtime_to']) ? (int)$this->Request['endtime_to'] : null; $jobstatus = $this->Request->contains('jobstatus') && $misc->isValidState($this->Request['jobstatus']) ? $this->Request['jobstatus'] : ''; $hasobject = $this->Request->contains('hasobject') && $misc->isValidBoolean($this->Request['hasobject']) ? $this->Request['hasobject'] : null; + $order_by = $this->Request->contains('order_by') && $misc->isValidColumn($this->Request['order_by']) ? $this->Request['order_by']: null; + $order_direction = $this->Request->contains('order_direction') && $misc->isValidOrderDirection($this->Request['order_direction']) ? $this->Request['order_direction']: 'DESC'; $mode = ($this->Request->contains('overview') && $misc->isValidBooleanTrue($this->Request['overview'])) ? SourceManager::SOURCE_RESULT_MODE_OVERVIEW : SourceManager::SOURCE_RESULT_MODE_NORMAL; + $allowed_sort_fields = ['job', 'client', 'fileset', 'starttime', 'endtime', 'jobid', 'content', 'type', 'jobstatus', 'joberrors']; + if (is_string($order_by) && !in_array($order_by, $allowed_sort_fields)) { + $this->output = SourceError::MSG_ERROR_INVALID_PROPERTY; + $this->error = SourceError::ERROR_INVALID_PROPERTY; + return; + } + $props = []; if (!is_null($job)) { $props['job'] = $job; @@ -119,6 +128,8 @@ class Sources extends BaculumAPIServer { $props, $limit, $offset, + $order_by, + $order_direction, $mode ); $this->output = $sources; diff --git a/gui/baculum/protected/Common/Modules/Miscellaneous.php b/gui/baculum/protected/Common/Modules/Miscellaneous.php index 13e703823..a380cd60e 100644 --- a/gui/baculum/protected/Common/Modules/Miscellaneous.php +++ b/gui/baculum/protected/Common/Modules/Miscellaneous.php @@ -36,6 +36,12 @@ class Miscellaneous extends TModule { const RPATH_PATTERN = '/^b2\d+$/'; + /** + * Order directions. + */ + const ORDER_DIRECTION_ASC = 'asc'; + const ORDER_DIRECTION_DESC = 'desc'; + public $job_types = array( 'B' => 'Backup', 'M' => 'Migrated', @@ -335,5 +341,18 @@ class Miscellaneous extends TModule { } return $jobid; } + + public function sortResultsByField(&$result, $order_by, $order_direction) { + $order_by = strtolower($order_by); + $order_direction = strtolower($order_direction); + $sort_by_func = function($a, $b) use ($order_by, $order_direction) { + $cmp = strnatcasecmp($a[$order_by], $b[$order_by]); + if ($order_direction === self::ORDER_DIRECTION_DESC) { + $cmp = -$cmp; + } + return $cmp; + }; + usort($result, $sort_by_func); + } } ?>