Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/api/v2/index.php
Original file line number Diff line number Diff line change
Expand Up @@ -315,6 +315,7 @@ public static function addCORSheaders(Request $request, $response) {
require __DIR__ . "/../../inc/apiv2/helper/resetChunk.routes.php";
require __DIR__ . "/../../inc/apiv2/helper/resetUserPassword.routes.php";
require __DIR__ . "/../../inc/apiv2/helper/setUserPassword.routes.php";
require __DIR__ . "/../../inc/apiv2/helper/taskExtraDetails.routes.php";
require __DIR__ . "/../../inc/apiv2/helper/unassignAgent.routes.php";


Expand Down
110 changes: 110 additions & 0 deletions src/inc/apiv2/helper/taskExtraDetails.routes.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,110 @@
<?php

use DBA\Aggregation;
use DBA\Chunk;
use DBA\Factory;
use DBA\QueryFilter;
use JetBrains\PhpStorm\NoReturn;
use Middlewares\Utils\HttpErrorException;
use Psr\Container\ContainerExceptionInterface;
use Psr\Container\NotFoundExceptionInterface;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;

require_once(dirname(__FILE__) . "/../common/AbstractHelperAPI.class.php");

class TaskExtraDetailsHelper extends AbstractHelperAPI {
public static function getBaseUri(): string {
return "/api/v2/helper/taskExtraDetails";
}

public static function getAvailableMethods(): array {
return ['GET'];
}

public function getRequiredPermissions(string $method): array {
return [];
}

public function getFormFields(): array {
return [];
}

/**
* @throws HttpErrorException
*/
public function handleGet(Request $request, Response $response): Response {
$this->preCommon($request);

$taskId = $request->getQueryParams()['task'];
if ($taskId === null) {
throw new HttpErrorException("No task query param has been provided");
}
$taskId = intval($taskId);
if ($taskId === 0) {
throw new HttpErrorException("No valid integer provided as task");
}
$task = Factory::getTaskFactory()->get($taskId);
if ($task === null) {
throw new HttpErrorException("No task found for provided task ID");
}

$qF = new QueryFilter(Chunk::TASK_ID, $taskId, "=");
$chunks = Factory::getChunkFactory()->filter([Factory::FILTER => $qF]);
$currentSpeed = 0;
$cProgress = 0;
foreach ($chunks as $chunk) {
$cProgress += $chunk->getCheckpoint() - $chunk->getSkip();
if (time() - max($chunk->getSolveTime(), $chunk->getDispatchTime()) < SConfig::getInstance()->getVal(DConfig::CHUNK_TIMEOUT) && $chunk->getProgress() < 10000) {
$currentSpeed += $chunk->getSpeed();
}
}

$timeChunks = $chunks;
usort($timeChunks, "Util::compareChunksTime");
$timeSpent = 0;
$current = 0;
foreach ($timeChunks as $c) {
if ($c->getDispatchTime() > $current) {
$timeSpent += $c->getSolveTime() - $c->getDispatchTime();
$current = $c->getSolveTime();
}
else if ($c->getSolveTime() > $current) {
$timeSpent += $c->getSolveTime() - $current;
$current = $c->getSolveTime();
}
}
$keyspace = $task->getKeyspace();
$estimatedTime = ($keyspace > 0 && $cProgress > 0) ? round($timeSpent / ($cProgress / $keyspace) - $timeSpent) : 0;
$responseObject = [
"estimatedTime" => $estimatedTime,
"timeSpent" => $timeSpent,
"currentSpeed" => $currentSpeed,
];

return self::getMetaResponse($responseObject, $request, $response);
}

#[NoReturn] public function actionPost($data): object|array|null {
assert(false, "TaskExtraDetails has no POST");
}

static public function register($app): void {
$baseUri = TaskExtraDetailsHelper::getBaseUri();

/* Allow CORS preflight requests */
$app->options($baseUri, function (Request $request, Response $response): Response {
return $response;
});
$app->get($baseUri, "TaskExtraDetailsHelper:handleGet");
}

/**
* getAccessGroups is different because it returns via another function
*/
public static function getResponse(): array|string|null {
return null;
}
}

TaskExtraDetailsHelper::register($app);