From: Marcin Haba Date: Thu, 11 Aug 2022 13:04:11 +0000 (+0200) Subject: baculum: Add object size statistics endpoint X-Git-Tag: Release-13.0.2~71 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a4317e18354237ac3dc4c7eaafb6c40a527e6e11;p=thirdparty%2Fbacula.git baculum: Add object size statistics endpoint --- diff --git a/gui/baculum/protected/API/Modules/ObjectManager.php b/gui/baculum/protected/API/Modules/ObjectManager.php index 8f49c8a3f..637ed4dc3 100644 --- a/gui/baculum/protected/API/Modules/ObjectManager.php +++ b/gui/baculum/protected/API/Modules/ObjectManager.php @@ -71,13 +71,13 @@ LEFT JOIN Job USING (JobId) ' /** * Get number object per object category. * - * @param string $objecttype object type (usually plugin short name such as 'm365' or 'mysql') + * @param string $objecttype object type (usually 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) { + public function getObjectCategorySum($objecttype = null, $objectsource = null, $datestart = null, $dateend = null) { $otype = ''; if (!is_null($objecttype)) { $otype = ' AND oobj.ObjectType=:objecttype '; @@ -112,7 +112,67 @@ LEFT JOIN Job USING (JobId) ' ' . $otype . $osource . ' GROUP BY oobj.ObjectCategory, oobj.ObjectType, oobj.ObjectSource'; - $connection = JobRecord::finder()->getDbConnection(); + $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); + } + $sth->bindParam(':datestart', $datestart, \PDO::PARAM_STR, 19); + $sth->bindParam(':dateend', $dateend, \PDO::PARAM_STR, 19); + $sth->execute(); + return $sth->fetchAll(\PDO::FETCH_ASSOC); + } + + /** + * Get object size statistics. + * + * @param string $objecttype object type (usually 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 [sum => 0, month => ''] + */ + public function getObjectSizeSum($objecttype = null, $objectsource = null, $datestart = null, $dateend = null) { + $otype = ''; + if (!is_null($objecttype)) { + $otype = ' AND Object.ObjectType=:objecttype '; + + } + $osource = ''; + if (!is_null($objectsource)) { + $osource = ' AND Object.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); + } + $db_params = $this->getModule('api_config')->getConfig('db'); + if ($db_params['type'] === Database::PGSQL_TYPE) { + $date_month = ' date_trunc(\'month\', Job.StartTime) '; + } elseif ($db_params['type'] === Database::MYSQL_TYPE) { + $date_month = ' DATE_FORMAT(Job.StartTime, \'%Y-%m-01 00:00:00\') '; + } elseif ($db_params['type'] === Database::SQLITE_TYPE) { + $date_month = ' strftime(\'%Y-%m-01 00:00:00\', Job.StartTime) '; + } + $sql = 'SELECT SUM(Object.ObjectSize) AS sum, + ' . $date_month . ' AS month + FROM Object + LEFT JOIN Job USING (JobId) + WHERE + Job.StartTime BETWEEN :datestart AND :dateend + ' . $otype . $osource . ' + GROUP BY month + ORDER BY month ASC'; + $connection = ObjectRecord::finder()->getDbConnection(); $connection->setActive(true); $pdo = $connection->getPdoInstance(); $sth = $pdo->prepare($sql); diff --git a/gui/baculum/protected/API/Pages/API/ObjectStatsCategorySum.php b/gui/baculum/protected/API/Pages/API/ObjectStatsCategorySum.php index 8ed0a1f28..66aa34fa2 100644 --- a/gui/baculum/protected/API/Pages/API/ObjectStatsCategorySum.php +++ b/gui/baculum/protected/API/Pages/API/ObjectStatsCategorySum.php @@ -23,7 +23,7 @@ use Baculum\Common\Modules\Errors\ObjectError; /** - * Objects endpoint. + * Object category stats endpoint. * * @author Marcin Haba * @category API @@ -50,7 +50,7 @@ class ObjectStatsCategorySum extends BaculumAPIServer { $dateend = $this->Request['dateend']; } - $objects = $this->getModule('object')->getObjectPerCategorySum( + $objects = $this->getModule('object')->getObjectCategorySum( $objecttype, $objectsource, $datestart, diff --git a/gui/baculum/protected/API/Pages/API/ObjectStatsSizeSum.php b/gui/baculum/protected/API/Pages/API/ObjectStatsSizeSum.php new file mode 100644 index 000000000..677cf39e6 --- /dev/null +++ b/gui/baculum/protected/API/Pages/API/ObjectStatsSizeSum.php @@ -0,0 +1,62 @@ + + * @category API + * @package Baculum API + */ +class ObjectStatsSizeSum 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')->getObjectSizeSum( + $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 2de38dd54..28d98cf84 100644 --- a/gui/baculum/protected/API/Pages/API/endpoints.xml +++ b/gui/baculum/protected/API/Pages/API/endpoints.xml @@ -91,6 +91,7 @@ + diff --git a/gui/baculum/protected/API/openapi_baculum.json b/gui/baculum/protected/API/openapi_baculum.json index 2ab87dd03..2ec195736 100644 --- a/gui/baculum/protected/API/openapi_baculum.json +++ b/gui/baculum/protected/API/openapi_baculum.json @@ -6138,7 +6138,7 @@ ] } }, - "/api/v2/objects/stats/category-sum/": { + "/api/v2/objects/stats/category-sum": { "get": { "tags": ["objects"], "summary": "Get object stats per category", @@ -6230,6 +6230,86 @@ ] } }, + "/api/v2/objects/stats/size-sum": { + "get": { + "tags": ["objects"], + "summary": "Get object size stats", + "description": "Get object size statistics", + "responses": { + "200": { + "description": "Object size statistics", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "output": { + "type": "array", + "items": { + "type": "object", + "properties": { + "sum": { + "type": "string", + "description": "Object size sum" + }, + "month": { + "type": "string", + "description": "Month date" + } + } + } + }, + "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"],