tao-test/app/taoTaskQueue/model/Repository/StuckTaskQuery.php

120 lines
3.2 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) 2021 (original work) Open Assessment Technologies SA;
*/
declare(strict_types=1);
namespace oat\taoTaskQueue\model\Repository;
use DateTimeImmutable;
use DateTimeZone;
use Doctrine\Common\Cache\Psr6\InvalidArgument;
use oat\tao\model\taskQueue\TaskLog;
class StuckTaskQuery
{
private const ALLOWED_STATUSES = [
TaskLog::STATUS_ENQUEUED,
];
/** @var string */
private $queryName;
/** @var array */
private $whitelist;
/** @var int */
private $age;
/** @var DateTimeImmutable */
private $ageDateTime;
/** @var array */
private $statuses;
public function __construct(string $queryName, array $whitelist, array $statuses, int $age)
{
array_walk(
$whitelist,
function (&$value) {
$value = trim($value);
}
);
$whitelist = array_filter($whitelist);
if (empty($whitelist)) {
throw new InvalidArgument('Stuck tasks names white list cannot be empty');
}
if (count(array_intersect($statuses, self::ALLOWED_STATUSES)) !== count($statuses)) {
throw new InvalidArgument(
sprintf(
'Only allowed statuses "%s" for stuck tasks. Provided: "%s"',
implode(',', self::ALLOWED_STATUSES),
implode(',', $statuses)
)
);
}
$this->queryName = $queryName;
$this->whitelist = $whitelist;
$this->age = max($age, StuckTaskRepository::MIN_AGE);
$this->statuses = $statuses;
/**
* Simulating approach provided at common_persistence_sql_Platform::getNowExpression()
* This is how we create new taskLogs in the system.
*
* @TODO Refactor this when we will have support for other Queue and TaskLog broker
*
* Task: https://oat-sa.atlassian.net/browse/ADF-556
*/
$this->ageDateTime = new DateTimeImmutable(
sprintf('now -%s seconds', $this->age),
new DateTimeZone('UTC')
);
}
public function getQueryName(): string
{
return $this->queryName;
}
public function getWhitelist(): array
{
return $this->whitelist;
}
public function getStatuses(): array
{
return $this->statuses;
}
public function getAge()
{
return $this->age;
}
public function getAgeDateTime(): DateTimeImmutable
{
return $this->ageDateTime;
}
}