tao-test/app/taoDelivery/controller/DeliveryExecutionState.php

103 lines
3.5 KiB
PHP

<?php
/**
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; under version 2
* of the License (non-upgradable).
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Copyright (c) 2020 (original work) Open Assessment Technologies SA;
*
* @author Sergei Mikhailov <sergei.mikhailov@taotesting.com>
*/
declare(strict_types=1);
namespace oat\taoDelivery\controller;
use common_exception_MissingParameter;
use common_exception_NotFound as NotFoundException;
use common_exception_NotImplemented as NotImplementedException;
use common_exception_RestApi as ApiException;
use oat\taoDelivery\model\execution\ServiceProxy;
use oat\taoDelivery\model\execution\StateServiceInterface;
use tao_actions_RestController as RestController;
use oat\taoDelivery\model\execution\DeliveryExecutionService;
/** Kindly use `funcAcl` in order to assign the roles, having access to the controller */
class DeliveryExecutionState extends RestController
{
/**
* @throws NotFoundException
*
* @throws NotImplementedException
* @throws NotFoundException
*/
public function index(): void
{
$queryParams = $this->getPsrRequest()->getQueryParams();
switch ($this->getPsrRequest()->getMethod()) {
case 'PUT':
$this->put($queryParams['uri'] ?? '');
break;
default:
/** @noinspection PhpUnhandledExceptionInspection */
$this->returnFailure(new ApiException('Not implemented'));
}
}
private function put(string $uri): void
{
if (empty($uri)) {
$this->returnFailure(new common_exception_MissingParameter('uri'));
}
$state = $this->extractState();
$deliveryExecution = $this->getExecutionService()->getDeliveryExecution($uri);
try {
if ($deliveryExecution->getState()->getUri() !== $state) {
$deliveryExecution->setState($state);
}
} catch (NotFoundException $exception) {
$this->returnFailure(new NotFoundException('Delivery execution not found', 404, $exception));
}
$this->returnSuccess([], false);
}
protected function getExecutionService(): DeliveryExecutionService
{
/** @noinspection PhpIncompatibleReturnTypeInspection */
return $this->getServiceLocator()->get(ServiceProxy::SERVICE_ID);
}
protected function getStateService(): StateServiceInterface
{
/** @noinspection PhpIncompatibleReturnTypeInspection */
return $this->getServiceLocator()->get(StateServiceInterface::SERVICE_ID);
}
private function extractState(): string
{
$data = json_decode((string)$this->getPsrRequest()->getBody(), true);
if (empty($data['value']) || !in_array($data['value'], $this->getStateService()->getDeliveriesStates(), true)) {
/** @noinspection PhpUnhandledExceptionInspection */
$this->returnFailure(new common_exception_MissingParameter('value'));
}
return $data['value'];
}
}