]> git.ipfire.org Git - thirdparty/bacula.git/commitdiff
baculum: Add offset parameter to jobs, objects and volumes endpoints
authorMarcin Haba <marcin.haba@bacula.pl>
Fri, 9 Dec 2022 09:33:37 +0000 (10:33 +0100)
committerMarcin Haba <marcin.haba@bacula.pl>
Mon, 9 Jan 2023 12:34:42 +0000 (13:34 +0100)
gui/baculum/protected/API/Modules/JobManager.php
gui/baculum/protected/API/Modules/ObjectManager.php
gui/baculum/protected/API/Modules/VolumeManager.php
gui/baculum/protected/API/Pages/API/Jobs.php
gui/baculum/protected/API/Pages/API/Objects.php
gui/baculum/protected/API/Pages/API/Volumes.php
gui/baculum/protected/API/openapi_baculum.json

index 9cddf21dc08cfcd7aa36058156bd5a96ff05f3cf..354d75837303fe0229e9b1402993f718ae2453ac 100644 (file)
@@ -34,7 +34,7 @@ use Prado\Data\ActiveRecord\TActiveRecordCriteria;
  */
 class JobManager extends APIModule {
 
-       public function getJobs($criteria = array(), $limit_val = null, $sort_col = 'JobId', $sort_order = 'ASC') {
+       public function getJobs($criteria = array(), $limit_val = null, $offset_val = 0, $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);
@@ -44,6 +44,10 @@ class JobManager extends APIModule {
                if(is_int($limit_val) && $limit_val > 0) {
                        $limit = ' LIMIT ' . $limit_val;
                }
+               $offset = '';
+               if (is_int($offset_val) && $offset_val > 0) {
+                       $offset = ' OFFSET ' . $offset_val;
+               }
 
                $where = Database::getWhere($criteria);
 
@@ -55,7 +59,7 @@ FROM Job
 LEFT JOIN Client USING (ClientId) 
 LEFT JOIN Pool USING (PoolId) 
 LEFT JOIN FileSet USING (FilesetId)'
-. $where['where'] . $order . $limit;
+. $where['where'] . $order . $limit . $offset;
 
                return JobRecord::finder()->findAllBySql($sql, $where['params']);
        }
index 4d9dda06d1823f8136967d4f34fd3e1c96571b00..fecc01ce43daac32d2ee6af9494e8b47a1d6b163 100644 (file)
@@ -37,13 +37,14 @@ class ObjectManager extends APIModule
         *
         * @param array $criteria criteria in nested array format (@see  Databaes::getWhere)
         * @param integer $limit_val maximum number of elements to return
+        * @param integer $offset_val query offset number
         * @param string $sort_col column to sort
         * @param string $sort_order sort order (asc - ascending, desc - descending)
         * @param string $group_by column to group
         * @param integer $group_limit maximum number of elements in one group
         * @return array object list
         */
-       public function getObjects($criteria = array(), $limit_val = null, $sort_col = 'ObjectId', $sort_order = 'DESC', $group_by = null, $group_limit = 0) {
+       public function getObjects($criteria = array(), $limit_val = null, $offset_val = 0, $sort_col = 'ObjectId', $sort_order = 'DESC', $group_by = null, $group_limit = 0) {
                $db_params = $this->getModule('api_config')->getConfig('db');
                if ($db_params['type'] === Database::PGSQL_TYPE) {
                    $sort_col = strtolower($sort_col);
@@ -56,10 +57,17 @@ class ObjectManager extends APIModule
                $limit = '';
                if(is_int($limit_val) && $limit_val > 0) {
                        $limit = sprintf(
-                               ' LIMIT %s',
+                               ' LIMIT %d',
                                $limit_val
                        );
                }
+               $offset = '';
+               if (is_int($offset_val) && $offset_val > 0) {
+                       $offset = sprintf(
+                               ' OFFSET %d',
+                               $offset_val
+                       );
+               }
 
                $where = Database::getWhere($criteria);
 
@@ -67,7 +75,7 @@ class ObjectManager extends APIModule
 Job.Name as jobname 
 FROM Object 
 LEFT JOIN Job USING (JobId) '
-. $where['where'] . $order . $limit;
+. $where['where'] . $order . $limit . $offset;
 
                $result = ObjectRecord::finder()->findAllBySql($sql, $where['params']);
                Database::groupBy($group_by, $result, $group_limit);
index 7f8d0580dbbed3d9442f56f64671f97c385c0fb9..5ac43e0af08f4c2b46a5a5e44d32372f0d068026 100644 (file)
@@ -31,7 +31,7 @@ namespace Baculum\API\Modules;
  */
 class VolumeManager extends APIModule {
 
-       public function getVolumes($criteria = array(), $limit_val = 0) {
+       public function getVolumes($criteria = array(), $limit_val = 0, $offset_val = 0) {
                $order_pool_id = 'PoolId';
                $order_volume = 'VolumeName';
                $db_params = $this->getModule('api_config')->getConfig('db');
@@ -45,6 +45,10 @@ class VolumeManager extends APIModule {
                if(is_int($limit_val) && $limit_val > 0) {
                        $limit = " LIMIT $limit_val ";
                }
+               $offset = '';
+               if (is_int($offset_val) && $offset_val > 0) {
+                       $offset = ' OFFSET ' . $offset_val;
+               }
 
                $where = Database::getWhere($criteria);
 
@@ -58,7 +62,7 @@ LEFT JOIN Pool AS pool1 USING (PoolId)
 LEFT JOIN Pool AS pool2 ON Media.ScratchPoolId = pool2.PoolId 
 LEFT JOIN Pool AS pool3 ON Media.RecyclePoolId = pool3.PoolId 
 LEFT JOIN Storage USING (StorageId) 
-' . $where['where'] . $order . $limit;
+' . $where['where'] . $order . $limit . $offset;
                $volumes = VolumeRecord::finder()->findAllBySql($sql, $where['params']);
                $this->setExtraVariables($volumes);
                return $volumes;
index cf1d95832d1a75451701591a19568555d76818d2..6891c8c854f1ca6f66872906ef59c7593bf78a55 100644 (file)
@@ -35,7 +35,8 @@ class Jobs extends BaculumAPIServer {
 
        public function get() {
                $misc = $this->getModule('misc');
-               $limit = $this->Request->contains('limit') ? intval($this->Request['limit']) : 0;
+               $limit = $this->Request->contains('limit') && $misc->isValidInteger($this->Request['limit']) ? (int)$this->Request['limit'] : 0;
+               $offset = $this->Request->contains('offset') && $misc->isValidInteger($this->Request['offset']) ? (int)$this->Request['offset'] : 0;
                $jobstatus = $this->Request->contains('jobstatus') ? $this->Request['jobstatus'] : '';
                $level = $this->Request->contains('level') && $misc->isValidJobLevel($this->Request['level']) ? $this->Request['level'] : '';
                $type = $this->Request->contains('type') && $misc->isValidJobType($this->Request['type']) ? $this->Request['type'] : '';
@@ -248,6 +249,7 @@ class Jobs extends BaculumAPIServer {
                                $result = $this->getModule('job')->getJobs(
                                        $params,
                                        $limit,
+                                       $offset,
                                        $order_by,
                                        $order_direction
                                );
index 0be7449c90ffffb890a05f46297b4dcb06271a21..264933f70c3cbef7fc40f82f82dd041379b2cb08 100644 (file)
@@ -34,7 +34,8 @@ class Objects extends BaculumAPIServer {
 
        public function get() {
                $misc = $this->getModule('misc');
-               $limit = $this->Request->contains('limit') ? intval($this->Request['limit']) : 0;
+               $limit = $this->Request->contains('limit') && $misc->isValidInteger($this->Request['limit']) ? (int)$this->Request['limit'] : 0;
+               $offset = $this->Request->contains('offset') && $misc->isValidInteger($this->Request['offset']) ? (int)$this->Request['offset'] : 0;
                $objecttype = $this->Request->contains('objecttype') && $misc->isValidName($this->Request['objecttype']) ? $this->Request['objecttype'] : null;
                $objectname = $this->Request->contains('objectname') && $misc->isValidName($this->Request['objectname']) ? $this->Request['objectname'] : null;
                $objectcategory = $this->Request->contains('objectcategory') && $misc->isValidName($this->Request['objectcategory']) ? $this->Request['objectcategory'] : null;
@@ -224,6 +225,7 @@ class Objects extends BaculumAPIServer {
                $objects = $this->getModule('object')->getObjects(
                        $params,
                        $limit,
+                       $offset,
                        $order_by_lc,
                        $order_direction,
                        $group_by,
index 433e79e2d24859ee74a6a23de645b2a7d5687896..a6c0a10eb9f5b87c4003780ab29a846b7a3914f2 100644 (file)
@@ -32,8 +32,10 @@ use Baculum\Common\Modules\Errors\VolumeError;
  */
 class Volumes extends BaculumAPIServer {
        public function get() {
-               $limit = $this->Request->contains('limit') ? intval($this->Request['limit']) : 0;
-               $result = $this->getModule('volume')->getVolumes(array(), $limit);
+               $misc = $this->getModule('misc');
+               $limit = $this->Request->contains('limit') && $misc->isValidInteger($this->Request['limit']) ? (int)$this->Request['limit'] : 0;
+               $offset = $this->Request->contains('offset') && $misc->isValidInteger($this->Request['offset']) ? (int)$this->Request['offset'] : 0;
+               $result = $this->getModule('volume')->getVolumes(array(), $limit, $offset);
                $this->output = $result;
                $this->error = VolumeError::ERROR_NO_ERRORS;
        }
index c3cf91599b67666bcbd3b83921f1533d265cc90d..632c34fac34ea907e49e6a06160486a2d9d90da6 100644 (file)
                                        "type": "integer"
                                }
                        },
+                       "Offset": {
+                               "name": "offset",
+                               "in": "query",
+                               "description": "Items offset",
+                               "required": false,
+                               "schema": {
+                                       "type": "integer"
+                               }
+                       },
                        "ClientId": {
                                "name": "clientid",
                                "in": "path",
                                        {
                                                "$ref": "#/components/parameters/Limit"
                                        },
+                                       {
+                                               "$ref": "#/components/parameters/Offset"
+                                       },
                                        {
                                                "name": "name",
                                                "in": "query",
                                                }
                                        }
                                },
-                               "parameters": [{
-                                       "$ref": "#/components/parameters/Limit"
-                               }]
+                               "parameters": [
+                                       {
+                                               "$ref": "#/components/parameters/Limit"
+                                       },
+                                       {
+                                               "$ref": "#/components/parameters/Offset"
+                                       }
+                               ]
                        }
                },
                "/api/v2/volumes/{mediaid}": {
                                        {
                                                "$ref": "#/components/parameters/Limit"
                                        },
+                                       {
+                                               "$ref": "#/components/parameters/Offset"
+                                       },
                                        {
                                                "name": "objecttype",
                                                "in": "query",