]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
baculum: Add order_by and order_direction parameters to sources endpoint
authorMarcin Haba <marcin.haba@bacula.pl>
Mon, 17 Apr 2023 12:42:40 +0000 (14:42 +0200)
committerMarcin Haba <marcin.haba@bacula.pl>
Thu, 20 Apr 2023 10:00:26 +0000 (12:00 +0200)
gui/baculum/protected/API/Modules/SourceManager.php
gui/baculum/protected/API/Pages/API/Sources.php
gui/baculum/protected/Common/Modules/Miscellaneous.php

index bf3629a77efdb011f6df14e452b53dd9d881a2f8..d951842a9e6fb577aa21840a2d2bf88d5d727b17 100644 (file)
@@ -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 = [];
index a2e561000f5105fc6e9c95982474c824a83a7ebe..d400960d35a01f96842981796e1e77e9173806e9 100644 (file)
@@ -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;
index 13e703823c3faf0ece9d22c35ee272882d64e4f8..a380cd60e1faa9bf6818d2be99630372b1140669 100644 (file)
@@ -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);
+       }
 }
 ?>