Remove dead class `SingleObjectApiHandler`

This commit is contained in:
raviks789 2023-08-31 12:57:08 +02:00 committed by Thomas Gelf
parent dec1951774
commit fcaa97e1b2
1 changed files with 0 additions and 236 deletions

View File

@ -1,236 +0,0 @@
<?php
namespace Icinga\Module\Director\Web\Controller\Extension;
use Exception;
use Icinga\Exception\IcingaException;
use Icinga\Exception\InvalidPropertyException;
use Icinga\Exception\NotFoundError;
use Icinga\Module\Director\Forms\IcingaDeleteObjectForm;
use Icinga\Module\Director\Objects\IcingaObject;
use Icinga\Web\Request;
use Icinga\Web\Response;
class SingleObjectApiHandler
{
use DirectorDb;
/** @var IcingaObject */
private $object;
/** @var string */
private $type;
/** @var Request */
private $request;
/** @var Response */
private $response;
/** @var \Icinga\Web\UrlParams */
private $params;
public function __construct($type, Request $request, Response $response)
{
$this->type = $type;
$this->request = $request;
$this->response = $response;
$this->params = $request->getUrl()->getParams();
}
public function runFailSafe()
{
try {
$this->loadObject();
$this->run();
} catch (NotFoundError $e) {
$this->sendJsonError($e->getMessage(), 404);
} catch (Exception $e) {
$response = $this->response;
if ($response->getHttpResponseCode() === 200) {
$response->setHttpResponseCode(500);
}
$this->sendJsonError($e->getMessage());
}
}
protected function retrieveObject()
{
$this->requireObject();
$this->sendJson(
$this->object->toPlainObject(
$this->params->shift('resolved'),
! $this->params->shift('withNull'),
$this->params->shift('properties')
)
);
}
protected function deleteObject()
{
$this->requireObject();
$obj = $this->object->toPlainObject(false, true);
$form = new IcingaDeleteObjectForm();
$form->setObject($this->object)
->setRequest($this->request)
->onSuccess();
$this->sendJson($obj);
}
protected function storeObject()
{
$data = json_decode($this->request->getRawBody());
if ($data === null) {
$this->response->setHttpResponseCode(400);
throw new IcingaException(
'Invalid JSON: %s' . $this->request->getRawBody(),
$this->getLastJsonError()
);
} else {
$data = (array) $data;
}
if ($object = $this->object) {
if ($this->request->getMethod() === 'POST') {
$object->setProperties($data);
} else {
$data = array_merge([
'object_type' => $object->object_type,
'object_name' => $object->object_name
], $data);
$object->replaceWith(
IcingaObject::createByType($this->type, $data, $db)
);
}
} else {
$object = IcingaObject::createByType($this->type, $data, $db);
}
if ($object->hasBeenModified()) {
$status = $object->hasBeenLoadedFromDb() ? 200 : 201;
$object->store();
$this->response->setHttpResponseCode($status);
} else {
$this->response->setHttpResponseCode(304);
}
$this->sendJson($object->toPlainObject(false, true));
}
public function run()
{
switch ($this->request->getMethod()) {
case 'DELETE':
$this->deleteObject();
break;
case 'POST':
case 'PUT':
$this->storeObject();
break;
case 'GET':
$this->retrieveObject();
break;
default:
$this->response->setHttpResponseCode(400);
throw new IcingaException(
'Unsupported method: %s',
$this->request->getMethod()
);
}
}
protected function requireObject()
{
if (! $this->object) {
$this->response->setHttpResponseCode(404);
if (! $this->params->get('name')) {
throw new NotFoundError('You need to pass a "name" parameter to access a specific object');
} else {
throw new NotFoundError('No such object available');
}
}
}
// TODO: just return json_last_error_msg() for PHP >= 5.5.0
protected function getLastJsonError()
{
switch (json_last_error()) {
case JSON_ERROR_DEPTH:
return 'The maximum stack depth has been exceeded';
case JSON_ERROR_CTRL_CHAR:
return 'Control character error, possibly incorrectly encoded';
case JSON_ERROR_STATE_MISMATCH:
return 'Invalid or malformed JSON';
case JSON_ERROR_SYNTAX:
return 'Syntax error';
case JSON_ERROR_UTF8:
return 'Malformed UTF-8 characters, possibly incorrectly encoded';
default:
return 'An error occured when parsing a JSON string';
}
}
protected function sendJson($object)
{
$this->response->setHeader('Content-Type', 'application/json', true);
$this->_helper->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);
echo json_encode($object, JSON_PRETTY_PRINT) . "\n";
}
protected function sendJsonError($message, $code = null)
{
$response = $this->response;
if ($code !== null) {
$response->setHttpResponseCode((int) $code);
}
$this->sendJson((object) ['error' => $message]);
}
protected function loadObject()
{
if ($this->object === null) {
if ($name = $this->params->get('name')) {
$this->object = IcingaObject::loadByType(
$this->type,
$name,
$this->db()
);
if (! $this->allowsObject($this->object)) {
$this->object = null;
throw new NotFoundError('No such object available');
}
} elseif ($id = $this->params->get('id')) {
$this->object = IcingaObject::loadByType(
$this->type,
(int) $id,
$this->db()
);
} elseif ($this->request->isApiRequest()) {
if ($this->request->isGet()) {
$this->response->setHttpResponseCode(422);
throw new InvalidPropertyException(
'Cannot load object, missing parameters'
);
}
}
}
return $this->object;
}
protected function allowsObject(IcingaObject $object)
{
return true;
}
}