/** * Gets default search criteria according environment scope * * @return array Returns array of the search criteria */ private function getDefaultCriteria() { $environment = $this->getEnvironment(); $criteria = [['envId' => $environment->id]]; if (!$this->hasPermissions(Acl::RESOURCE_FARMS)) { $where = []; $farm = new Farm(); $farmTeam = new FarmTeam(); if ($this->hasPermissions(Acl::RESOURCE_OWN_FARMS)) { $where[] = "{$farm->columnOwnerId()} = " . $farm->qstr('ownerId', $this->getUser()->id); } if ($this->hasPermissions(Acl::RESOURCE_TEAM_FARMS)) { $join[] = "\n LEFT JOIN {$farmTeam->table('ft')} ON {$farmTeam->columnFarmId('ft')} = {$farm->columnId()}\n LEFT JOIN `account_team_users` `atu` ON `atu`.`team_id` = {$farmTeam->columnTeamId('ft')}\n LEFT JOIN `account_team_envs` `ate` ON `ate`.`team_id` = {$farmTeam->columnTeamId('ft')} AND `ate`.`env_id` = {$farm->columnEnvId()}\n "; $where[] = "`atu`.`user_id` = " . $farmTeam->db()->qstr($this->getUser()->id) . " AND `ate`.`team_id` IS NOT NULL"; } if (!empty($where)) { $criteria[Farm::STMT_WHERE] = '(' . join(' OR ', $where) . ')'; } if (!empty($join)) { if (empty($criteria[Farm::STMT_FROM])) { $criteria[Farm::STMT_FROM] = $farm->table(); } $criteria[Farm::STMT_FROM] .= implode(' ', $join); } } return $criteria; }
/** * Gets Default search criteria for the Environment scope * * @return array Returns array of the default search criteria for the Environment scope */ private function getDefaultCriteria() { $server = new Server(); $defaultCondition = sprintf("{$server->columnAccountId()} = %d AND {$server->columnEnvId()} = %d ", $this->getUser()->accountId, $this->getEnvironment()->id); $and = " AND {$server->columnFarmId()} IS NOT NULL "; if (!$this->hasPermissions(Acl::RESOURCE_FARMS)) { $where = []; $farm = new Farm(); $farmTeam = new FarmTeam(); $join[] = " LEFT JOIN {$farm->table('f')} ON {$farm->columnId('f')} = {$server->columnFarmId()}"; if ($this->hasPermissions(Acl::RESOURCE_OWN_FARMS)) { $where[] = "{$farm->columnOwnerId('f')} = " . $farm->qstr('ownerId', $this->getUser()->id); } if ($this->hasPermissions(Acl::RESOURCE_TEAM_FARMS)) { $join[] = "\n LEFT JOIN {$farmTeam->table('ft')} ON {$farmTeam->columnFarmId('ft')} = {$farm->columnId('f')}\n LEFT JOIN `account_team_users` `atu` ON `atu`.`team_id` = {$farmTeam->columnTeamId('ft')}\n LEFT JOIN `account_team_envs` `ate` ON `ate`.`team_id` = {$farmTeam->columnTeamId('ft')} AND `ate`.`env_id` = {$farm->columnEnvId('f')}\n "; $where[] = "`atu`.`user_id` = " . $farmTeam->db()->qstr($this->getUser()->id) . " AND `ate`.`team_id` IS NOT NULL"; } if (!empty($where)) { $criteria[Farm::STMT_WHERE] = '(' . $defaultCondition . $and . ' AND ' . join(' OR ', $where) . ')'; } $criteria[Farm::STMT_FROM] = $server->table() . implode(' ', $join); } // add Temporary and Importing Servers to response if ($this->hasPermissions(Acl::RESOURCE_IMAGES_ENVIRONMENT, Acl::PERM_IMAGES_ENVIRONMENT_MANAGE)) { $extraCondition = sprintf("({$defaultCondition} AND {$server->columnFarmId()} IS NULL AND {$server->columnStatus()} IN ('%s', '%s'))", Server::STATUS_IMPORTING, Server::STATUS_TEMPORARY); if (empty($criteria[Farm::STMT_WHERE]) && $this->hasPermissions(Acl::RESOURCE_FARMS)) { $criteria[Farm::STMT_WHERE] = "(({$defaultCondition}{$and}) OR {$extraCondition})"; } else { if (empty($criteria[Farm::STMT_WHERE])) { $criteria[Farm::STMT_WHERE] = "{$extraCondition}"; } else { $criteria[Farm::STMT_WHERE] = "({$criteria[Farm::STMT_WHERE]} OR {$extraCondition})"; } } } if (empty($criteria[Farm::STMT_WHERE])) { $criteria[Farm::STMT_WHERE] = $defaultCondition; } return $criteria; }
public function _teams($from, $to, $action) { switch ($action) { case static::ACT_CONVERT_TO_OBJECT: /* @var $from Farm */ /* @var $team Team */ foreach ($from->getTeams() as $team) { $to->teams[] = ['id' => $team->id]; } break; case static::ACT_CONVERT_TO_ENTITY: /* @var $to Farm */ $newTeams = []; $newTeamIds = []; $user = $this->controller->getUser(); foreach ($from->teams as $teamFk) { $team = new Team(); $team->id = ApiController::getBareId($teamFk); $newTeams[] = $team; $newTeamIds[] = $team->id; } $currentTeamIds = []; foreach ($to->getTeams() as $team) { $currentTeamIds[] = $team->id; } sort($newTeamIds); sort($currentTeamIds); if ($newTeamIds != $currentTeamIds) { //filter out the Teams to which the User has no access $teams = empty($newTeams) ? [] : Team::find([['id' => ['$in' => $newTeamIds]], ['accountId' => $user->getAccountId()]]); if (count($teams) != count($newTeamIds)) { throw new ApiErrorException(404, ErrorMessage::ERR_OBJECT_NOT_FOUND, "Requested Team(s) either does not exist or Farm has no access to it."); } $to->setTeams($newTeams); } break; case static::ACT_GET_FILTER_CRITERIA: $team = ApiController::getBareId($from, 'teams'); $farm = new Farm(); $farmTeam = new FarmTeam(); return [AbstractEntity::STMT_FROM => "\n JOIN {$farmTeam->table('ft')} ON {$farmTeam->columnFarmId('ft')} = {$farm->columnId()}\n AND {$farmTeam->columnTeamId('ft')} = " . $farmTeam->qstr('teamId', $team) . "\n "]; } }
/** * Searches farms by criteria and selecting and initiating their Teams * * @param array $criteria optional The search criteria. * @param array $group optional The group by looks like [property1, ...], by default groups by `id` * @param array $order optional The results order looks like [property1 => true|false, ... ] * @param int $limit optional The records limit * @param int $offset optional The offset * @param bool $countRecords optional True to calculate total number of the records without limit * * @return ArrayCollection|Farm[] Returns collection of the entities. * * @throws \Scalr\Exception\ModelException */ public static function findWithTeams(array $criteria = null, array $group = null, array $order = null, $limit = null, $offset = null, $countRecords = null) { $farm = new Farm(); /* @var $farms Farm[] */ $farms = []; if (!isset($group)) { $group = ['id']; } $collection = $farm->result(AbstractEntity::RESULT_ENTITY_COLLECTION)->find($criteria, $group, $order, $limit, $offset, $countRecords); /* @var $farm Farm */ foreach ($collection as $farm) { $farms[$farm->id] = $farm; } $team = new Team(); $farmTeam = new FarmTeam(); $stmt = "\n SELECT {$team->fields()}, {$farmTeam->fields('ft', true)}\n FROM {$team->table()}\n JOIN {$farmTeam->table('ft')} ON {$farmTeam->columnTeamId('ft')} = {$team->columnId()}\n AND {$farmTeam->columnFarmId('ft')} IN ('" . implode("', '", array_keys($farms)) . "')\n "; foreach ($team->db()->Execute($stmt) as $row) { $team = new Team(); $team->load($row); $farmTeam->load($row, 'ft'); $farms[$farmTeam->farmId]->_teams[$team->id] = $team; } return $collection; }