tao-test/app/taoTaskQueue/scripts/tools/TaskLogUtility.php

238 lines
8.6 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) 2017 (original work) Open Assessment Technologies SA (under the project TAO-PRODUCT);
*
*/
declare(strict_types = 1);
namespace oat\taoTaskQueue\scripts\tools;
use oat\oatbox\action\Action;
use oat\oatbox\filesystem\FileSystemService;
use oat\oatbox\reporting\Report;
use oat\tao\model\taskQueue\TaskLogInterface;
use oat\taoTaskQueue\model\Entity\Decorator\CategoryEntityDecorator;
use oat\taoTaskQueue\model\Entity\Decorator\HasFileEntityDecorator;
use oat\taoTaskQueue\model\TaskLog\Decorator\SimpleManagementCollectionDecorator;
use Laminas\ServiceManager\ServiceLocatorAwareTrait;
use Laminas\ServiceManager\ServiceLocatorAwareInterface;
/**
* Task Log Utility.
*
* ```
* $ sudo -u www-data php index.php 'oat\taoTaskQueue\scripts\tools\TaskLogUtility'
* ```
*/
class TaskLogUtility implements Action, ServiceLocatorAwareInterface
{
use ServiceLocatorAwareTrait;
private $argStats;
private $argAvailable;
private $argGetTask;
private $argHelp;
private $argArchive;
private $argCancel;
private $argForce = false;
private $argLimit;
private $argOffset;
private $examples = [
[
'title' => 'Stats',
'description' => 'Return stats about the tasks logs statuses',
'example' => 'sudo -u www-data php index.php \'oat\taoTaskQueue\scripts\tools\TaskLogUtility\' --stats'
],
[
'title' => 'List Task Logs',
'description' => 'List All the tasks that are not archived will be retrived, default limit is 20',
'example' => 'sudo -u www-data php index.php \'oat\taoTaskQueue\scripts\tools\TaskLogUtility\' --available --limit[optional]=20 --offset[optional]=10',
],
[
'title' => 'Get Task Log',
'description' => 'Get an specific task log by id',
'example' => 'sudo -u www-data php index.php \'oat\taoTaskQueue\scripts\tools\TaskLogUtility\' --get-task=[taskdId]'
],
[
'title' => 'Archive a Task Log',
'description' => 'Archive a task log',
'example' => 'sudo -u www-data php index.php \'oat\taoTaskQueue\scripts\tools\TaskLogUtility\' --archive=[taskdId] --force[optional]'
],
[
'title' => 'Cancel a Task Log',
'description' => 'Cancel a task log',
'example' => 'sudo -u www-data php index.php \'oat\taoTaskQueue\scripts\tools\TaskLogUtility\' --cancel=[taskdId] --force[optional]'
]
];
public function __invoke($params): Report
{
try {
$this->assertValidParams($params);
/** @var TaskLogInterface $taskLog */
$taskLog = $this->getServiceLocator()->get(TaskLogInterface::SERVICE_ID);
/** @var FileSystemService $fs */
$fs = $this->getServiceLocator()->get(FileSystemService::SERVICE_ID);
if ($this->argStats) {
$stats = $taskLog->getStats(TaskLogInterface::SUPER_USER);
return Report::createSuccess($this->jsonPretty($stats->jsonSerialize()));
}
if ($this->argAvailable) {
$tasks = $taskLog->findAvailableByUser(TaskLogInterface::SUPER_USER, $this->argLimit, $this->argOffset);
return Report::createSuccess($this->jsonPretty(
(new SimpleManagementCollectionDecorator(
$tasks,
$taskLog,
$fs,
true
))
->jsonSerialize()
));
}
if ($this->argGetTask) {
$task = $taskLog->getByIdAndUser($this->argGetTask, TaskLogInterface::SUPER_USER);
return Report::createSuccess($this->jsonPretty(
(new HasFileEntityDecorator(new CategoryEntityDecorator($task, $taskLog), $fs))->jsonSerialize()
));
}
if ($this->argArchive) {
$task = $taskLog->getByIdAndUser($this->argArchive, TaskLogInterface::SUPER_USER);
return Report::createSuccess('Archived: ' . $taskLog->archive($task, $this->argForce));
}
if ($this->argCancel) {
$task = $taskLog->getByIdAndUser($this->argCancel, TaskLogInterface::SUPER_USER);
return Report::createSuccess('Cancelled: ' . $taskLog->cancel($task, $this->argForce));
}
if ($this->argHelp) {
return Report::createSuccess($this->commandOutput($this->examples));
}
return Report::createSuccess($this->commandOutput($this->examples));
} catch (\Exception $exception) {
$message = $exception->getMessage();
if (!$this->argForce) {
if ($this->argArchive) {
$message .= "\nPlease use --force to force archive of an in-progress task.";
}
if ($this->argCancel) {
$message .= "\nPlease use --force to force cancellation of a created task.";
}
}
return Report::createError($message);
}
}
private function assertValidParams(array $params): void
{
foreach ($params as $param) {
$args = explode('=', $param);
$option = $args[0];
$value = $args[1] ?? null;
switch ($option) {
case '--stats':
$this->argStats = true;
break;
case '--available':
$this->argAvailable = true;
break;
case '--limit':
if (!isset($this->argAvailable)) {
throw new \RuntimeException('Arg --available argument must be use');
}
$this->argLimit = (int)$value;
break;
case '--offset':
if (!isset($this->argAvailable)) {
throw new \RuntimeException('Arg --available argument must be use');
}
$this->argOffset = (int)$value;
break;
case '--get-task':
$this->argGetTask = $value;
if (!isset($this->argGetTask)) {
throw new \RuntimeException('--get-task=[taskId] argument must be set');
}
break;
case '--archive':
$this->argArchive = $value;
if (!isset($this->argArchive)) {
throw new \RuntimeException('--archive=[taskId] argument must be set');
}
break;
case '--cancel':
$this->argCancel = $value;
if (!isset($this->argCancel)) {
throw new \RuntimeException('--cancel=[taskId] argument must be set');
}
break;
case '--force':
if (!isset($this->argArchive) && !isset($this->argCancel)) {
throw new \RuntimeException('--archive=[taskId] or --cancel=[taskId] argument must be set');
}
$this->argForce = true;
break;
case '--help':
$this->argHelp = true;
break;
}
}
}
private function jsonPretty(array $data): string
{
return json_encode($data, JSON_PRETTY_PRINT);
}
private function commandOutput(array $data): string
{
$string = 'Examples';
foreach ($data as $key => $example) {
$string .= sprintf("\n %s. %s", ++$key, $example['title']);
$string .= sprintf("\n\t Description: \t %s", $example['description']);
$string .= sprintf("\n\t Example: \t %s", $example['example']);
}
return $string;
}
}