synergy/server/controller/TribeCtrl.php (285 lines of code) (raw):
<?php
namespace Synergy\Controller;
use Synergy\App\Synergy;
use Synergy\DB\TribeDAO;
use Synergy\Misc\Util;
use Synergy\Model\CurlRequestResult;
use Synergy\Model\Exception\AssignmentException;
use Synergy\Model\Exception\AssignmentSecurityException;
use Synergy\Model\Exception\CurlRequestException;
use Synergy\Model\Membership;
use Synergy\Model\Tribe;
use Synergy\Model\User;
use Synergy\Extensions\Tribe\TribeSpecificationExtension;
/**
* Description of TribeCtrl
*
* @author lada
*/
class TribeCtrl extends ExtensionCtrl {
private $tribeDao;
private $userCtrl;
private $tribesCreated;
private $projectCtrl;
public static $tribes = array();
private $tribesCached = false;
function __construct() {
parent::__construct('tribe');
$this->tribeDao = new TribeDAO();
}
private function getUserCtrl() {
if (is_null($this->userCtrl)) {
$this->userCtrl = new UserCtrl();
}
return $this->userCtrl;
}
/**
*
* @return ProjectCtrl
*/
private function getProjectCtrl() {
if (is_null($this->projectCtrl)) {
$this->projectCtrl = new ProjectCtrl();
}
return $this->projectCtrl;
}
/**
* Returns array of user's memberships in tribes
* @param string $username username
* @return Membership[]
*/
public function getUserMembership($username) {
$memberOf = $this->tribeDao->getUserMembership($username);
$leaderOf = $this->getUserLeadership($username);
$result = array_merge($memberOf, $leaderOf);
return $result;
}
/**
* Returns arrays of user's leaderships in tribes
* @param string $username username
* @return Membership|Array
*/
public function getUserLeadership($username) {
$userId = $this->getUserCtrl()->getUserIDbyUsername($username);
return $this->tribeDao->getUserLeadership($userId);
}
/**
* Returns tribe
* @param int $id tribe ID
* @return Tribe
*/
public function getTribe($id) {
$tribe = $this->tribeDao->getTribe($id);
if (!is_null($tribe)) {
$tribe->members = $this->getMembers($id);
$img = $this->getUserCtrl()->getProfileImg($tribe->leader_id);
$tribe->leaderImg = (strlen($img) > 0) ? IMAGE_BASE . $img : "./img/user.png";
}
return parent::get($tribe);
}
/**
* Returns array of members for tribe with given ID
* @param int $tribeId tribe ID
* @return User[]
*/
public function getMembers($tribeId) {
return $this->tribeDao->getTribeMembers($tribeId);
}
/**
* Removes user from tribe
* @param string $username username
* @param int $tribeId tribe ID
*/
public function removeMember($username, $tribeId) {
$user_id = $this->getUserCtrl()->getUserIDbyUsername($username);
$this->tribeDao->removeMember($username, $tribeId, $user_id);
}
/**
* Returns tribe leader's username
* @param int $id tribe ID
* @return User
*/
public function getLeader($id) {
return $this->tribeDao->getLeader($id);
}
/**
* Edits tribe
* @param Tribe $tribe tribe
* @return boolean true if successful
*/
public function editTribe($tribe) {
$uid = $this->getUserCtrl()->getUserIDbyUsername($tribe->leaderUsername);
if ($uid < 0) {
return false;
}
$tribe->leader_id = $uid;
$result = $this->tribeDao->editTribe($tribe->name, $tribe->description, $tribe->id, $tribe->leader_id);
if ($result) {
parent::edit($tribe);
}
return $result;
}
/**
* Adds user to tribe
* @param string $username username
* @param int $id tribe ID
* @return boolean true if successful
*/
public function addMember($username, $id) {
$uid = $this->getUserCtrl()->getUserIDbyUsername($username);
if ($uid < 0) {
return false;
}
if (!$this->getUserCtrl()->isMemberOfTribe($uid, $id)) {
return $this->tribeDao->addMember($uid, $id);
}
return false;
}
/**
* Returns all tribes
* @return Tribe[]
*/
public function getTribes() {
$tribes = $this->tribeDao->getTribes();
for ($index = 0, $max = count($tribes); $index < $max; $index++) {
$tribes[$index]->leaderUsername = $this->getUserCtrl()->getUsernameById($tribes[$index]->leader_id);
}
return $tribes;
}
/**
* Removes tribe
* @param int $id tribe ID
* @return boolean true if successful
*/
public function removeTribe($id) {
parent::delete($id);
$this->tribeDao->removeMembersOfTribe($id);
return $this->tribeDao->removeTribe($id);
}
/**
* Creates new tribe
* @param Tribe $tribe tribe
* @return int new tribe ID
*/
public function createTribe($tribe) {
$uid = $this->getUserCtrl()->getUserIDbyUsername($tribe->leaderUsername);
if ($uid < 0) {
return 0;
}
$tribe->leader_id = $uid;
$newId = $this->tribeDao->createTribe($uid, $tribe->description, $tribe->name);
$tribe->id = $newId;
parent::create($tribe, $newId);
return $newId;
}
/**
* Creates a new tribe, in case $tribe->leaderUsername is not found, current user is set as leader
* @param Tribe $tribe
* @return int new tribe ID
*/
public function createTribeFallbackLeader($tribe) {
$uid = $this->getUserCtrl()->getUserIDbyUsername($tribe->leaderUsername);
if ($uid < 0) {
$uid = Synergy::getSessionProvider()->getUserId();
}
$tribe->leader_id = $uid;
$newId = $this->tribeDao->createTribe($uid, $tribe->description, $tribe->name);
$tribe->id = $newId;
parent::create($tribe, $newId);
return $newId;
}
public function importTribes($url) {
$data = $this->requestUrlForTribes($url);
if ($data->headers['http_code'] !== 200) {
throw new CurlRequestException("Curl request failed", "Response from URL was " . $data->headers['http_code'], "");
}
$tribes = json_decode($data->data);
// empty all existing tribes
$this->tribeDao->removeMembersOfAllTribes();
$this->tribesCreated = 0;
foreach ($tribes as $name => $tribe) {
$t = Tribe::init($name, $tribe->leader);
$newId = $this->createTribeIfNotExists($t);
if ($newId > 0) {
$this->addMembers($newId, $tribe->members);
}
}
return $this->tribesCreated;
}
private function addMembers($tribeId, $members) {
foreach ($members as $member) {
$this->addMember($member->username, $tribeId);
}
}
public function tribeExists($tribeName) {
return $this->tribeDao->tribeExists($tribeName);
}
/**
*
* @param Tribe $tribe
*/
private function createTribeIfNotExists($tribe) {
if (!$this->tribeExists($tribe->name)) {
$newId = $this->createTribeFallbackLeader($tribe);
if ($newId > 0) {
$this->tribesCreated++;
}
return $newId;
}
return $this->getTribeIdByName($tribe->name);
}
public function getTribeIdByName($tribeName) {
return $this->tribeDao->getTribeIdByName($tribeName);
}
/**
* Makes curl request to specified url
* @param String $url
* @return CurlRequestResult
*/
private function requestUrlForTribes($url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
if (Synergy::hasProxy()) {
curl_setopt($ch, CURLOPT_PROXY, Synergy::getProxy());
}
// curl_setopt($ch, CURLOPT_PROXYPORT, 80);
$data = curl_exec($ch);
$result = new CurlRequestResult($data, curl_getinfo($ch));
curl_close($ch);
return $result;
}
/**
* Returns all tribes where given user is leader
* @param String $leaderUsername
* @return Tribe[]
*/
public function getTribesByLeader($leaderUsername) {
$leaderships = $this->getUserLeadership($leaderUsername);
$tribes = array();
for ($i = 0, $max = count($leaderships); $i < $max; $i++) {
$t = $this->getTribe($leaderships[$i]->id);
$l = new User($t->leaderUsername);
$l->firstName = $t->leaderDisplayName;
$l->lastName = "";
$l->id = $t->leader_id;
array_push($t->members, $l);
array_push($tribes, $t);
}
return $tribes;
}
/**
* Validates received assignments (permission and structure) and throws AssignmentException or AssignmentSecurityException in case some condition is not met.
* @param \Synergy\Model\TestAssignment[] $assignments
* @param Tribe[] $tribes
*/
public function validateAssignments($assignments, $tribes) {
for ($i = 0, $max = count($assignments); $i < $max; $i++) {
$this->validateModel($assignments[$i]);
$this->validatePermission($assignments[$i], $tribes);
}
}
/**
* Checks that object has all required properties so new assignment can be created based on it.
* @param \Synergy\Model\TestAssignment $assignment
* @throws AssignmentException in case some property is not set
*/
private function validateModel($assignment) {
if (!isset($assignment->specificationId) || !isset($assignment->platformId) || !isset($assignment->tribeId) || !isset($assignment->username) || !isset($assignment->labelId) || !isset($assignment->testRunId)) {
throw new AssignmentException("Wrong model", "Missing some assignment properties", "");
}
}
/**
* Makes sure that specification in given assignment and assignees belongs to the same tribe
* and that current user is tribe leader of this tribe
* @param \Synergy\Model\TestAssignment $assignment
* @param Tribe[] $tribes
* @throws AssignmentSecurityException in case logged in user has no permission to create this assignment
*/
public function validatePermission($assignment, $tribes) {
if (Synergy::getSessionProvider()->getUserRole() === "admin" || Synergy::getSessionProvider()->getUserRole() === "manager") {
return;
}
$assignment->tribeId = intval($assignment->tribeId);
$tribeOk = false;
$assigneeOk = false;
$specificationOk = false;
for ($i = 0, $maxi = count($tribes); $i < $maxi; $i++) {
if (intval($tribes[$i]->id) === intval($assignment->tribeId)) {
$tribeOk = true;
// check assignee
for ($j = 0, $maxj = count($tribes[$i]->members); $j < $maxj; $j++) {
if ($assignment->username === $tribes[$i]->members[$j]->username) {
$assigneeOk = true;
}
}
for ($j = 0, $maxj = count($tribes[$i]->ext["specifications"]); $j < $maxj; $j++) {
if (intval($assignment->specificationId) === intval($tribes[$i]->ext["specifications"][$j]->id)) {
$specificationOk = true;
}
}
// check specification
break;
}
}
if (!$tribeOk || !$assigneeOk || !$specificationOk) {
$msg = "Specification check: " . ($specificationOk ? "OK" : "Failed") . " Tribe check: " . ($tribeOk ? "OK" : "Failed") . " Assignee check: " . ($assigneeOk ? "OK" : "Failed");
throw new AssignmentSecurityException("Not allowed", "You don't have permissions for this action. " . $msg, "");
}
}
/**
* Returns all tribes with all possible information (members, specifications etc.)
* @return Tribe[]
*/
public function getTribesDetailed() {
$tribes = $this->getTribes();
$fullData = array();
for ($i = 0, $max = count($tribes); $i < $max; $i++) {
$t = $this->getTribe($tribes[$i]->id);
$l = new User($t->leaderUsername);
$l->firstName = $t->leaderDisplayName;
$l->lastName = "";
array_push($t->members, $l);
array_push($fullData, $t);
}
return $fullData;
}
public function initTribesNameAndLeaders() {
if (!$this->tribesCached) {
$allTribes = $this->tribeDao->getTribesNameAndLeaders();
$tribeExt = new TribeSpecificationExtension();
for ($i = 0, $max = count($allTribes); $i < $max; $i++) {
$allTribes[$i]->ext["specifications"] = $tribeExt->getSpecifications($allTribes[$i]->id);
TribeCtrl::$tribes["t" . $allTribes[$i]->id] = $allTribes[$i];
}
$this->tribesCached = true;
}
return TribeCtrl::$tribes;
}
/**
* Returns array of instances of TribeOverview with set specificationIDs
* @param itn $tribesId array of tribe IDs
* @return TribeOverview[]
*/
public function getTribesSpecificationsForTribes($tribesId) {
if (count($tribesId) < 1) {
return array();
}
$tribeSqlString = Util::arrayToSQLOR($tribesId, "t.id");
return $this->tribeDao->getTribeAndSpecifications($tribeSqlString);
}
/**
*
* @param Tribe $tribes
* @return type
*/
public function filterByProjectId($tribes, $projectId) {
foreach ($tribes as $tribe) {
if (array_key_exists("specifications", $tribe->ext)) {
$this->filter($projectId, $tribe);
}
}
return $tribes;
}
private function filter($projectId, $tribe) {
foreach ($tribe->ext["specifications"] as $index => $spec) {
$hasProject = false;
foreach ($spec->projects as $pr) {
if ($pr->id === $projectId) {
$hasProject = true;
}
}
if (!$hasProject) {
unset($tribe->ext["specifications"][$index]);
}
}
$tribe->ext["specifications"] = array_values($tribe->ext["specifications"]);
}
}
?>