synergy/server/api/assignment.php (210 lines of code) (raw):

<?php use Synergy\App\Synergy; use Synergy\Controller\Mediator; use Synergy\Controller\RunCtrl; use Synergy\Controller\AssignmentCtrl; use Synergy\Misc\HTTP; use Synergy\Model\TestAssignment; use Synergy\Controller\SpecificationLockCtrl; use Synergy\Model\Exception\AssignmentConflictException; use Synergy\Model\Exception\CorruptedAssignmentException; require_once '../setup/conf.php'; switch ($_SERVER['REQUEST_METHOD']) { case "POST": if (isset($_REQUEST['volunteer'])) { if (!Synergy::getSessionProvider()->sessionExists()) { HTTP::Unauthorized(""); die(); } } else { if (!TestAssignment::canCreate()) { HTTP::Unauthorized(""); die(); } } $put = file_get_contents('php://input'); $data = json_decode($put); if (!isset($data->specificationId) || !isset($data->platformId) || !isset($data->username) || !isset($data->labelId) || !isset($data->testRunId)) { HTTP::BadRequest("Missing parameters"); die(); } if (!RunCtrl::runIsActive(intval($data->testRunId))) { HTTP::PreconditionFailed("Test run is closed"); die(); } $runCtrl = new RunCtrl(); $username = (isset($_REQUEST['volunteer'])) ? $username = Synergy::getSessionProvider()->getUsername() : $data->username; $createdBy = (isset($_REQUEST['volunteer'])) ? TestAssignment::CREATED_BY_TESTER : TestAssignment::CREATED_BY_MANAGER_ADMIN; if ($runCtrl->createAssignment(intval($data->specificationId), intval($data->platformId), intval($data->labelId), intval($data->testRunId), $username, intval($data->tribeId), $createdBy)) HTTP::OK(""); else HTTP::BadRequest("Oops"); break; case "DELETE": if (!isset($_REQUEST['id'])) { HTTP::BadRequest("Missing parameters"); die(); } $assignmentCtrl = new AssignmentCtrl(); $assignmentId = intval($_REQUEST['id']); if (!$assignmentCtrl->userCanDeleteAssignmentById($assignmentId)) { HTTP::Unauthorized(""); die(); } $runCtrl = new RunCtrl(); $runId = $runCtrl->getRunIdByAssignmentId($assignmentId); if (!$runCtrl->runIsActive($runId)) { HTTP::BadRequest("Removing assignments is not allowed when test run is closed"); die(); } $assignmentToRemove = $runCtrl->getAssignmentNoProgress($assignmentId); if ($runCtrl->deleteAssignment($assignmentId)) { if (AssignmentCtrl::$latestRemovalType === TestAssignment::CREATED_BY_TRIBE_LEADER) { $headers = array(); foreach ($_SERVER as $name => $value) { if (substr($name, 0, 5) == 'HTTP_') { $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; } } $assignmentToRemove->addRemovalComment(array_key_exists("Synergy-Comment", $headers) ? urldecode($headers["Synergy-Comment"]) : ""); Mediator::emit("assignmentRemovedByLeader", $assignmentToRemove); } HTTP::OK(""); } else { HTTP::BadRequest(""); } break; case "PUT": if (!isset($_REQUEST['id'])) { HTTP::BadRequest("Missing parameters"); die(); } $headers = array(); foreach ($_SERVER as $name => $value) { if (substr($name, 0, 5) == 'HTTP_') { $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; } } $requestedTimestamp = (array_key_exists("Synergy-Timestamp", $headers) ? urldecode($headers["Synergy-Timestamp"]) : ""); if (strlen($requestedTimestamp) < 1) { if (is_null($_REQUEST["datetime"]) || !isset($_REQUEST["datetime"])) { HTTP::BadRequest("Missing timestamp"); die(); } $requestedTimestamp = $_REQUEST["datetime"]; } $runCtrl = new RunCtrl(); if (!$runCtrl->isRequestUpToDate(intval($_REQUEST["id"]), $requestedTimestamp)) { HTTP::Conflict("Exists record saved after this request was made"); die(); } if (!Synergy::getSessionProvider()->sessionExists() || (Synergy::getSessionProvider()->sessionExists() && !$runCtrl->checkUserIsAssigned(intval($_REQUEST['id']), Synergy::getSessionProvider()->getUsername()))) { HTTP::Unauthorized(""); die(); } if (!RunCtrl::runIsActive($runCtrl->getRunIdByAssignmentId(intval($_REQUEST["id"])))) { HTTP::PreconditionFailed("Test run is closed"); die(); } $put = file_get_contents('php://input'); $data = json_decode($put); try { $runCtrl->saveAssignmentProgress($data, $put, intval($_REQUEST['id'])); HTTP::OK(""); } catch (CorruptedAssignmentException $exc) { HTTP::BadRequest($exc->title.": ".$exc->message); } break; case "GET": if (!isset($_REQUEST['id'])) { HTTP::BadRequest("Missing parameters"); die(); } $mode = "start"; if (isset($_REQUEST['mode'])) $mode = $_REQUEST['mode']; $runCtrl = new RunCtrl(); $runId = $runCtrl->getRunIdByAssignmentId(intval($_REQUEST["id"])); if (!RunCtrl::runIsActive($runId)) { HTTP::PreconditionFailed("Test run is closed"); die(); } $run = $runCtrl->getRunOverview($runId); date_default_timezone_set('UTC'); $now = time(); if ($now < strtotime($run->start) || $now > strtotime($run->end)) { HTTP::PreconditionFailed("Test run is closed"); die(); } switch ($mode) { case "start": try { $assignment = $runCtrl->getAssignment(intval($_REQUEST['id'])); } catch (AssignmentConflictException $e) { HTTP::Conflict($e->title . ": " . $e->message); die(); } if (is_null($assignment)) { HTTP::NotFound("Assignment not found"); die(); } if ($assignment->username !== Synergy::getSessionProvider()->getUsername()) { HTTP::Unauthorized($msg); die(); } $localTime = date('Y-m-d H:i:s'); $runCtrl->startAssignmentConditional($assignment->id, $localTime); if (intval($assignment->completed) < 1) { $lockCtrl = new SpecificationLockCtrl(); $lockCtrl->addLock($assignment->specificationId, $assignment->id); } HTTP::OK((json_encode($assignment)), 'Content-type: application/json'); break; case "restart": $headers = array(); foreach ($_SERVER as $name => $value) { if (substr($name, 0, 5) == 'HTTP_') { $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value; } } $requestedTimestamp = (array_key_exists("Synergy-Timestamp", $headers) ? urldecode($headers["Synergy-Timestamp"]) : ""); if (strlen($requestedTimestamp) < 1) { if (is_null($_REQUEST["datetime"]) || !isset($_REQUEST["datetime"])) { HTTP::BadRequest("Missing timestamp"); die(); } $requestedTimestamp = $_REQUEST["datetime"]; } if (!$runCtrl->isRequestUpToDate(intval($_REQUEST["id"]), $requestedTimestamp)) { HTTP::Conflict("Exists record saved after this request was made"); die(); } $runCtrl->restartAssignment(intval($_REQUEST['id'])); $lockCtrl = new SpecificationLockCtrl(); Mediator::emit("assignmentRestartedByUser", $id); try { $assignment = $runCtrl->getAssignment(intval($_REQUEST['id'])); } catch (AssignmentConflictException $e) { HTTP::Conflict($e->title . ": " . $e->message); die(); } $lockCtrl->addLock($assignment->specificationId, intval($_REQUEST["id"])); if (is_null($assignment)) { HTTP::NotFound("Assignment not found"); die(); } if ($assignment->username !== Synergy::getSessionProvider()->getUsername()) { HTTP::Unauthorized($msg); die(); } HTTP::OK((json_encode($assignment)), 'Content-type: application/json'); break; default: break; } break; default: HTTP::MethodNotAllowed(''); break; } ?>