]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
baculum: Add to jobs endpoint parameters to sort property and sort order
authorMarcin Haba <marcin.haba@bacula.pl>
Tue, 8 Nov 2022 14:59:13 +0000 (15:59 +0100)
committerMarcin Haba <marcin.haba@bacula.pl>
Thu, 17 Nov 2022 09:05:10 +0000 (10:05 +0100)
gui/baculum/protected/API/Modules/JobManager.php
gui/baculum/protected/API/Pages/API/Jobs.php
gui/baculum/protected/Common/Modules/Errors/GenericError.php
gui/baculum/protected/Common/Modules/Miscellaneous.php

index 2f9e20cfcee012d94eeacd12c61bbd51049b35b1..3f619f66e0c018a8e3bb00cbefed2858845acb1b 100644 (file)
@@ -34,13 +34,12 @@ use Prado\Data\ActiveRecord\TActiveRecordCriteria;
  */
 class JobManager extends APIModule {
 
-       public function getJobs($criteria = array(), $limit_val = null) {
-               $sort_col = 'JobId';
+       public function getJobs($criteria = array(), $limit_val = null, $sort_col = 'JobId', $sort_order = 'ASC') {
                $db_params = $this->getModule('api_config')->getConfig('db');
                if ($db_params['type'] === Database::PGSQL_TYPE) {
                    $sort_col = strtolower($sort_col);
                }
-               $order = ' ORDER BY ' . $sort_col . ' DESC';
+               $order = ' ORDER BY ' . $sort_col . ' ' . strtoupper($sort_order);
                $limit = '';
                if(is_int($limit_val) && $limit_val > 0) {
                        $limit = ' LIMIT ' . $limit_val;
index 7a89c1bccb9fdab574ea334c0b0fdda12de6783d..454ff8000860fdcdc139378bd1583ac02bcdb094 100644 (file)
@@ -21,6 +21,7 @@
  */
 
 use Baculum\API\Modules\BaculumAPIServer;
+use Baculum\API\Modules\JobRecord;
 use Baculum\Common\Modules\Errors\JobError;
 
 /**
@@ -31,6 +32,7 @@ use Baculum\Common\Modules\Errors\JobError;
  * @package Baculum API
  */
 class Jobs extends BaculumAPIServer {
+
        public function get() {
                $misc = $this->getModule('misc');
                $limit = $this->Request->contains('limit') ? intval($this->Request['limit']) : 0;
@@ -47,6 +49,8 @@ class Jobs extends BaculumAPIServer {
                $endtime_to = $this->Request->contains('endtime_to') && $misc->isValidInteger($this->Request['endtime_to']) ? (int)$this->Request['endtime_to'] : null;
                $realendtime_from = $this->Request->contains('realendtime_from') && $misc->isValidInteger($this->Request['realendtime_from']) ? (int)$this->Request['realendtime_from'] : null;
                $realendtime_to = $this->Request->contains('realendtime_to') && $misc->isValidInteger($this->Request['realendtime_to']) ? (int)$this->Request['realendtime_to'] : null;
+               $order_by = $this->Request->contains('order_by') && $misc->isValidColumn($this->Request['order_by']) ? $this->Request['order_by']: 'JobId';
+               $order_direction = $this->Request->contains('order_direction') && $misc->isValidOrderDirection($this->Request['order_direction']) ? $this->Request['order_direction']: 'DESC';
 
                if (!empty($clientid) && !$misc->isValidId($clientid)) {
                        $this->output = JobError::MSG_ERROR_CLIENT_DOES_NOT_EXISTS;
@@ -60,6 +64,25 @@ class Jobs extends BaculumAPIServer {
                        $this->error = JobError::ERROR_CLIENT_DOES_NOT_EXISTS;
                        return;
                }
+               $jr = new \ReflectionClass('Baculum\API\Modules\JobRecord');
+               $sort_cols = $jr->getProperties();
+               $order_by_lc = strtolower($order_by);
+               $cols_excl = ['client', 'fileset', 'pool'];
+               $columns = [];
+               foreach ($sort_cols as $cols) {
+                       $name = $cols->getName();
+                       // skip columns not existing in the catalog
+                       if (in_array($name, $cols_excl)) {
+                               continue;
+                       }
+                       $columns[] = $name;
+               }
+               if (!in_array($order_by_lc, $columns)) {
+                       $this->output = JobError::MSG_ERROR_INVALID_PROPERTY;
+                       $this->error = JobError::ERROR_INVALID_PROPERTY;
+                       return;
+               }
+
 
                $params = [];
                $jobstatuses = array_keys($misc->getJobState());
@@ -215,7 +238,7 @@ class Jobs extends BaculumAPIServer {
                        }
 
                        if ($error === false) {
-                               $jobs = $this->getModule('job')->getJobs($params, $limit);
+                               $jobs = $this->getModule('job')->getJobs($params, $limit, $order_by, $order_direction);
                                $this->output = $jobs;
                                $this->error = JobError::ERROR_NO_ERRORS;
                        }
index 3cf4eaa674a225b19bdfe2a7c2726ff7fcacbfc0..5a7bb90919976c70224193d88f79ffb8756f02c1 100644 (file)
@@ -35,10 +35,12 @@ class GenericError {
        const ERROR_INTERNAL_ERROR = 1000;
        const ERROR_INVALID_PATH = 8;
        const ERROR_WRONG_EXITCODE = 9;
+       const ERROR_INVALID_PROPERTY = 520;
 
        const MSG_ERROR_NO_ERRORS = '';
        const MSG_ERROR_INVALID_COMMAND = 'Invalid command.';
        const MSG_ERROR_INTERNAL_ERROR = 'Internal error.';
        const MSG_ERROR_INVALID_PATH = 'Invalid path.';
        const MSG_ERROR_WRONG_EXITCODE = 'Wrong exitcode.';
+       const MSG_ERROR_INVALID_PROPERTY = 'Invalid property.';
 }
index 6a415f7651f71969bbc910cedbc41b44598938c5..ed2d2cc4fe649478dee65a3c84f1d4c77b30249e 100644 (file)
@@ -302,6 +302,13 @@ class Miscellaneous extends TModule {
                return filter_var($email, FILTER_VALIDATE_EMAIL);
        }
 
+       public function isValidColumn($column) {
+               return (preg_match('/^[\w+.]+$/i', $column) === 1);
+       }
+       public function isValidOrderDirection($order) {
+               return (preg_match('/^(asc|desc)$/i', $order) === 1);
+       }
+
        public function escapeCharsToConsole($path) {
                return preg_replace('/([$])/', '\\\${1}', $path);
        }