synergy/server/api/specification.php (212 lines of code) (raw):
<?php
use Synergy\App\Synergy;
use Synergy\Controller\Mediator;
use Synergy\Controller\SpecificationCtrl;
use Synergy\Controller\UserCtrl;
use Synergy\Controller\VersionCtrl;
use Synergy\Misc\HTTP;
use Synergy\Model\Exception\SpecificationDuplicateException;
use Synergy\Model\Specification;
use Synergy\Model\Specification\Rest\SpecificationResource;
use Synergy\Misc\Util;
require_once '../setup/conf.php';
switch ($_SERVER['REQUEST_METHOD']) {
case "GET":
if (!isset($_REQUEST['id'])) {
HTTP::BadRequest("Missing parameters");
die();
}
$view = (isset($_REQUEST["view"])) ? $_REQUEST['view'] : "";
switch ($view) {
case "cont":
$specCtrl = new SpecificationCtrl();
$specification = $specCtrl->getSpecificationFull(intval($_REQUEST['id']));
if (is_null($specification)) {
HTTP::NotFound("Specification not found");
die();
}
if (Synergy::getSessionProvider()->sessionExists()) {
$role = Synergy::getSessionProvider()->getUserRole();
$specification->addControls($role);
foreach ($specification->testSuites as $ts) {
$ts->addControls($role);
}
foreach ($specification->attachments as $at) {
$at->addControls($role);
}
}
$specification->setIsUsed($specCtrl->isSpecificationUsed($specification->id));
HTTP::OK(json_encode(SpecificationResource::createFromSpecification($specification, true)), 'Content-type: application/json');
break;
case "contAlias":
$specCtrl = new SpecificationCtrl();
if (isset($_REQUEST['simpleVersion']) && !is_null($_REQUEST['simpleVersion']) && strlen($_REQUEST['simpleVersion']) > 0 && $_REQUEST['simpleVersion']!== "latest") {
$versionCtrl = new VersionCtrl();
$version = $versionCtrl->getVersionByName($_REQUEST['simpleVersion']);
$specification = $specCtrl->getSpecificationFullByAlias($_REQUEST['simpleName'], $version->id);
} else {
$specification = $specCtrl->getSpecificationFullByAlias($_REQUEST['simpleName'], -1);
}
if (is_null($specification)) {
HTTP::NotFound("Specification not found");
die();
}
if (Synergy::getSessionProvider()->sessionExists()) {
$role = Synergy::getSessionProvider()->getUserRole();
$specification->addControls($role);
foreach ($specification->testSuites as $ts) {
$ts->addControls($role);
}
foreach ($specification->attachments as $at) {
$at->addControls($role);
}
}
$specification->setIsUsed($specCtrl->isSpecificationUsed($specification->id));
HTTP::OK(json_encode(SpecificationResource::createFromSpecification($specification, true)), 'Content-type: application/json');
break;
default :
$specCtrl = new SpecificationCtrl();
$specification = $specCtrl->getSpecification(intval($_REQUEST['id']), '', -1);
if (is_null($specification)) {
HTTP::NotFound("Specification not found");
die();
}
if (Synergy::getSessionProvider()->sessionExists()) {
$role = Synergy::getSessionProvider()->getUserRole();
$specification->addControls($role);
foreach ($specification->testSuites as $ts) {
$ts->addControls($role);
}
foreach ($specification->attachments as $at) {
$at->addControls($role);
}
}
$specification->setIsUsed($specCtrl->isSpecificationUsed($specification->id));
HTTP::OK(json_encode(SpecificationResource::createFromSpecification($specification, false)), 'Content-type: application/json');
break;
}
break;
case "PUT":
$data = json_decode(file_get_contents('php://input'));
if (!isset($data->id) || !isset($data->title) || !isset($data->desc) || !isset($data->owner) || !isset($data->simpleName)) {
HTTP::BadRequest("Missing parameters");
die();
}
if (!Specification::canEdit(intval($data->id))) {
HTTP::Unauthorized("");
die();
}
$keepSimpleName = true;
if(isset($_REQUEST['keepSimpleName']) && !is_null($_REQUEST['keepSimpleName']) && strtolower($_REQUEST['keepSimpleName'])=== "false"){
$keepSimpleName = false;
}
$specCtrl = new SpecificationCtrl();
$usersCtrl = new UserCtrl();
$originalOwnerId = $specCtrl->getOwnerId(intval($data->id));
$newOwnerId = $usersCtrl->getUserIDbyUsername($data->owner);
if($originalOwnerId === Synergy::getSessionProvider()->getUserId() || Util::isAuthorized("admin") || Util::isAuthorized("manager")){
$specification = new Specification(intval($data->id), $data->desc, $data->title, -1, -1, $newOwnerId);
}else{
$specification = new Specification(intval($data->id), $data->desc, $data->title, -1, -1, $originalOwnerId);
}
$specification->simpleName = $data->simpleName;
if (isset($data->ext)) {
$specification->ext = $data->ext;
}
try {
$r = $specCtrl->updateSpecification($specification, $keepSimpleName);
Mediator::emit("addRevision", $specification->id);
Mediator::emit("updateProjectSpecification", array("specificationId" => $specification->id, "projects" => $data->ext->projects));
if ($r) {
HTTP::OK("");
} else {
HTTP::InternalServerError("");
}
} catch (SpecificationDuplicateException $ex) {
HTTP::BadRequest($ex->message);
}
break;
case "POST":
if (!Specification::canCreate()) {
HTTP::Unauthorized("");
die();
}
$specCtrl = new SpecificationCtrl();
$mode = '';
if (isset($_REQUEST['mode']))
$mode = $_REQUEST['mode'];
switch ($mode) {
case "create":
$put = file_get_contents('php://input');
$data = json_decode($put);
if (!isset($data->title) || !isset($data->desc) || !isset($data->version) || !isset($data->simpleName)) {
HTTP::BadRequest("Missing parameters");
die();
}
$specification = new Specification(-1, $data->desc, $data->title, -1, -1, -1);
$specification->simpleName = $data->simpleName;
if (!Synergy::getSessionProvider()->sessionExists() || (defined('ANONYM') && Synergy::getSessionProvider()->getUsername() === ANONYM)) {
$specification->author = $data->author;
} else {
$specification->author = Synergy::getSessionProvider()->getUsername();
}
$specification->version = $data->version;
if (isset($data->ext)) {
$specification->ext = $data->ext;
}
try {
$id = $specCtrl->createSpecification($specification, false);
} catch (SpecificationDuplicateException $ex) {
HTTP::BadRequest($ex->message);
}
break;
case "clone":
$put = file_get_contents('php://input');
$data = json_decode($put);
if (isset($_REQUEST['id']) && isset($data->version) && isset($data->newName)) {
try {
$id = $specCtrl->cloneSpecification(intval($_REQUEST['id']), $data->version, $data->newName);
} catch (SpecificationDuplicateException $ex) {
HTTP::BadRequest($ex->message);
die();
}
} else {
$id = -1;
}
break;
default:
break;
}
if ($id > -1) {
$url = BASER_URL . "specification.php?id=" . $id;
HTTP::OK(json_encode($url), 'Content-type: application/json');
} else {
HTTP::InternalServerError('');
}
break;
case "DELETE":
if (!isset($_REQUEST['id'])) {
HTTP::BadRequest("Missing parameters");
die();
}
if (!Specification::canDelete(intval($_REQUEST["id"]))) {
HTTP::Unauthorized("");
die();
}
$specCtrl = new SpecificationCtrl();
if ($specCtrl->isSpecificationUsed(intval($_REQUEST["id"]))) {
HTTP::BadRequest("Specification is used in paused assignment, no changes are allowed until the assignment is finished");
die();
}
if ($specCtrl->deleteSpecification(intval($_REQUEST['id']))) {
Mediator::emit("removeRevisions", intval($_REQUEST['id']));
HTTP::OK("");
} else { // removal request created
HTTP::Accepted("Request to remove specification has been sent to the owner");
}
break;
default :
HTTP::MethodNotAllowed("");
break;
}
?>