From: Marcin Haba Date: Thu, 11 Aug 2022 09:49:53 +0000 (+0200) Subject: baculum: Add object category stats endpoint X-Git-Tag: Release-13.0.2~73 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ea20aaa6edfdcbca934b6753673dd1608225db81;p=thirdparty%2Fbacula.git baculum: Add object category stats endpoint --- diff --git a/gui/baculum/protected/API/Modules/ObjectManager.php b/gui/baculum/protected/API/Modules/ObjectManager.php index 5a6cd22b0..8f49c8a3f 100644 --- a/gui/baculum/protected/API/Modules/ObjectManager.php +++ b/gui/baculum/protected/API/Modules/ObjectManager.php @@ -67,4 +67,64 @@ LEFT JOIN Job USING (JobId) ' } return $obj; } + + /** + * Get number object per object category. + * + * @param string $objecttype object type (usually plugin short name such as 'm365' or 'mysql') + * @param string $objectsource object source + * @param string $datestart start date + * @param string $dateend end date + * @return array summary in form [objectcategory => '', objecttype => '', objectsource => '', count => 0, last_job_time => ''] + */ + public function getObjectPerCategorySum($objecttype = null, $objectsource = null, $datestart = null, $dateend = null) { + $otype = ''; + if (!is_null($objecttype)) { + $otype = ' AND oobj.ObjectType=:objecttype '; + + } + $osource = ''; + if (!is_null($objectsource)) { + $osource = ' AND oobj.ObjectSource=:objectsource '; + } + $dformat = 'Y-m-d H:i:s'; + if (is_null($datestart)) { + $m_ago = new \DateTime('1 month ago'); + $datestart = $m_ago->format($dformat); + } + if (is_null($dateend)) { + $dateend = date($dformat); + } + + $sql = 'SELECT oobj.ObjectCategory AS objectcategory, + oobj.ObjectType AS objecttype, + oobj.ObjectSource AS objectsource, + COUNT(DISTINCT oobj.ObjectUUID) AS count, + MAX(Job.StartTime) AS last_job_time + FROM Object AS oobj + JOIN Job USING(JobId) + WHERE + Job.StartTime BETWEEN :datestart AND :dateend + AND Job.JobStatus IN (\'T\', \'W\') + AND oobj.JobId=( + SELECT MAX(iobj.JobId) FROM Object AS iobj WHERE iobj.ObjectId=oobj.ObjectId + ) + ' . $otype . $osource . ' + GROUP BY oobj.ObjectCategory, oobj.ObjectType, oobj.ObjectSource'; + + $connection = JobRecord::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); + } + $sth->bindParam(':datestart', $datestart, \PDO::PARAM_STR, 19); + $sth->bindParam(':dateend', $dateend, \PDO::PARAM_STR, 19); + $sth->execute(); + return $sth->fetchAll(\PDO::FETCH_ASSOC); + } } diff --git a/gui/baculum/protected/API/Pages/API/ObjectStatsCategorySum.php b/gui/baculum/protected/API/Pages/API/ObjectStatsCategorySum.php new file mode 100644 index 000000000..8ed0a1f28 --- /dev/null +++ b/gui/baculum/protected/API/Pages/API/ObjectStatsCategorySum.php @@ -0,0 +1,62 @@ + + * @category API + * @package Baculum API + */ +class ObjectStatsCategorySum 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']; + } + $datestart = null; + if ($this->Request->contains('datestart') && $misc->isValidBDateAndTime($this->Request['datestart'])) { + $datestart = $this->Request['datestart']; + } + $dateend = null; + if ($this->Request->contains('dateend') && $misc->isValidBDateAndTime($this->Request['dateend'])) { + $dateend = $this->Request['dateend']; + } + + $objects = $this->getModule('object')->getObjectPerCategorySum( + $objecttype, + $objectsource, + $datestart, + $dateend + ); + $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 a64b3a912..2de38dd54 100644 --- a/gui/baculum/protected/API/Pages/API/endpoints.xml +++ b/gui/baculum/protected/API/Pages/API/endpoints.xml @@ -90,6 +90,7 @@ + diff --git a/gui/baculum/protected/API/openapi_baculum.json b/gui/baculum/protected/API/openapi_baculum.json index 6df738612..acac25d8f 100644 --- a/gui/baculum/protected/API/openapi_baculum.json +++ b/gui/baculum/protected/API/openapi_baculum.json @@ -6020,7 +6020,7 @@ "error": { "type": "integer", "description": "Error code", - "enum": [0, 1, 2, 3, 4, 5, 6, 7, 11, 1000] + "enum": [0, 1, 2, 3, 6, 7, 1000] } } } @@ -6098,6 +6098,127 @@ ] } }, + "/api/v2/objects/{objectid}": { + "get": { + "tags": ["objects"], + "summary": "Object by objectid", + "description": "Get single object.", + "responses": { + "200": { + "description": "Single object by objectid", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "output": { + "$ref": "#/components/schemas/Object" + }, + "error": { + "type": "integer", + "description": "Error code", + "enum": [0, 1, 2, 3, 6, 7, 1000] + } + } + } + } + } + } + } + } + }, + "/api/v2/objects/stats/category-sum/": { + "get": { + "tags": ["objects"], + "summary": "Get object stats per category", + "description": "Get object statistics per object category", + "responses": { + "200": { + "description": "Object statistics per category", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "output": { + "type": "array", + "items": { + "type": "object", + "properties": { + "objectcategory": { + "type": "string", + "description": "Object category" + }, + "objecttype": { + "type": "string", + "description": "Object type, ex. 'm365' or 'PostgreSQL'" + }, + "objectsource": { + "type": "string", + "description": "Object data source" + }, + "count": { + "type": "integer", + "description": "Object count" + }, + "last_job_time": { + "type": "string", + "description": "Last job start time in ISO form, ex: 2022-08-11 12:31:16" + } + } + } + }, + "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": "datestart", + "in": "query", + "required": false, + "description": "Start date for job time range. If not given, default is used 1 month ago date.", + "schema": { + "type": "string" + } + }, + { + "name": "dateend", + "in": "query", + "required": false, + "description": "End date for job time range. If not given, default is used current date.", + "schema": { + "type": "string" + } + } + ] + } + }, "/api/v2/plugins/m365/{clientid}/users": { "get": { "tags": ["plugins"],