From: Marcin Haba Date: Fri, 12 Aug 2022 14:19:03 +0000 (+0200) Subject: baculum: Add object category status endpoint X-Git-Tag: Release-13.0.2~69 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=736e83738d11ecbcb547ea4c6f42eb2ad28bc8e3;p=thirdparty%2Fbacula.git baculum: Add object category status endpoint --- diff --git a/gui/baculum/protected/API/Modules/ObjectManager.php b/gui/baculum/protected/API/Modules/ObjectManager.php index 6ffa219c1..347ee01a9 100644 --- a/gui/baculum/protected/API/Modules/ObjectManager.php +++ b/gui/baculum/protected/API/Modules/ObjectManager.php @@ -228,4 +228,58 @@ LEFT JOIN Job USING (JobId) ' $sth->execute(); return $sth->fetchAll(\PDO::FETCH_ASSOC); } + + /** + * Get object job statistics by category. + * There are taken into account last three jobs. + * + * @param string $objecttype object type (usually short name such as 'm365' or 'MySQL') + * @param string $objectsource object source + * @param string $objectcategory object category like: 'mailbox' or 'team' + * @return array object statistics + */ + public function getObjectCategoryStatus($objecttype = null, $objectsource = null, $objectcategory = null) { + $where = []; + if (!is_null($objecttype)) { + $where[] = ' Object.ObjectType=:objecttype '; + } + if (!is_null($objectsource)) { + $where[] = ' Object.ObjectSource=:objectsource '; + } + if (!is_null($objectcategory)) { + $where[] = ' Object.ObjectCategory=:objectcategory '; + } + $where_val = implode(' AND ', $where); + + $sql = 'SELECT + DISTINCT b.JobId, b.JobStatus, b.StartTime, b.ObjectCategory + FROM ( + SELECT + Job.JobId AS jobid, + Job.JobStatus AS jobstatus, + Job.StartTime AS starttime, + Object.ObjectCategory AS objectcategory, + ROW_NUMBER() OVER (PARTITION BY Object.ObjectCategory ORDER BY Job.JobId DESC) AS r + FROM Job + JOIN Object USING(JobId) + ' . ($where_val ? ' WHERE ' . $where_val : '') . ' + ) AS b + WHERE + b.r <= 3'; + $connection = ObjectRecord::finder()->getDbConnection(); + $connection->setActive(true); + $pdo = $connection->getPdoInstance(); + $sth = $pdo->prepare($sql); + if (!is_null($objecttype)) { + $sth->bindParam(':objecttype', $objecttype, \PDO::PARAM_STR, 100); + } + if (!is_null($objectsource)) { + $sth->bindParam(':objectsource', $objectsource, \PDO::PARAM_STR, 400); + } + if (!is_null($objectcategory)) { + $sth->bindParam(':objectcategory', $objectcategory, \PDO::PARAM_STR, 400); + } + $sth->execute(); + return $sth->fetchAll(\PDO::FETCH_ASSOC); + } } diff --git a/gui/baculum/protected/API/Pages/API/ObjectStatsCategoryStatus.php b/gui/baculum/protected/API/Pages/API/ObjectStatsCategoryStatus.php new file mode 100644 index 000000000..6a518d46a --- /dev/null +++ b/gui/baculum/protected/API/Pages/API/ObjectStatsCategoryStatus.php @@ -0,0 +1,57 @@ + + * @category API + * @package Baculum API + */ +class ObjectStatsCategoryStatus extends BaculumAPIServer { + + public function get() { + $misc = $this->getModule('misc'); + $objecttype = null; + if ($this->Request->contains('objecttype') && $misc->isValidName($this->Request['objecttype'])) { + $objecttype = $this->Request['objecttype']; + } + $objectsource = null; + if ($this->Request->contains('objectsource') && $misc->isValidName($this->Request['objectsource'])) { + $objectsource = $this->Request['objectsource']; + } + $objectcategory = null; + if ($this->Request->contains('objectcategory') && $misc->isValidName($this->Request['objectcategory'])) { + $objectcategory = $this->Request['objectcategory']; + } + + $objects = $this->getModule('object')->getObjectCategoryStatus( + $objecttype, + $objectsource, + $objectcategory + ); + $this->output = $objects; + $this->error = ObjectError::ERROR_NO_ERRORS; + } +} diff --git a/gui/baculum/protected/API/Pages/API/endpoints.xml b/gui/baculum/protected/API/Pages/API/endpoints.xml index 04f93a251..fd929b782 100644 --- a/gui/baculum/protected/API/Pages/API/endpoints.xml +++ b/gui/baculum/protected/API/Pages/API/endpoints.xml @@ -92,6 +92,7 @@ + diff --git a/gui/baculum/protected/API/openapi_baculum.json b/gui/baculum/protected/API/openapi_baculum.json index 92add7e25..32a0b03d1 100644 --- a/gui/baculum/protected/API/openapi_baculum.json +++ b/gui/baculum/protected/API/openapi_baculum.json @@ -6270,6 +6270,85 @@ ] } }, + "/api/v2/objects/stats/category-status": { + "get": { + "tags": ["objects"], + "summary": "Get object category status stats", + "description": "Get object category status statistics", + "responses": { + "200": { + "description": "Object category statistics", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "output": { + "type": "array", + "items": { + "type": "object", + "properties": { + "jobid": { + "type": "integer", + "description": "Job identifier" + }, + "jobstatus": { + "type": "string", + "description": "Job status letter" + }, + "starttime": { + "type": "string", + "description": "Job start time" + }, + "objectcategory": { + "type": "string", + "description": "Object category" + } + } + } + }, + "error": { + "type": "integer", + "description": "Error code", + "enum": [0, 1, 2, 3, 6, 7, 1000] + } + } + } + } + } + } + }, + "parameters": [ + { + "name": "objecttype", + "in": "query", + "required": false, + "description": "Object type, ex. 'm365' or 'PostgreSQL'", + "schema": { + "type": "string" + } + }, + { + "name": "objectsource", + "in": "query", + "required": false, + "description": "Object data source", + "schema": { + "type": "string" + } + }, + { + "name": "objectcategory", + "in": "query", + "required": false, + "description": "Object category like 'mailbox' or 'team'", + "schema": { + "type": "string" + } + } + ] + } + }, "/api/v2/objects/stats/size-sum": { "get": { "tags": ["objects"],