123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205 |
- <?php
- /**
- * @author Arthur Schiwon <blizzz@owncloud.com>
- * @author Lukas Reschke <lukas@owncloud.com>
- * @author Morris Jobke <hey@morrisjobke.de>
- * @author Stephan Peijnik <speijnik@anexia-it.com>
- * @author Thomas Müller <thomas.mueller@tmit.eu>
- *
- * @copyright Copyright (c) 2015, ownCloud, Inc.
- * @license AGPL-3.0
- *
- * This code is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License, version 3,
- * as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License, version 3,
- * along with this program. If not, see <http://www.gnu.org/licenses/>
- *
- */
- namespace OC\Group;
- class MetaData {
- const SORT_NONE = 0;
- const SORT_USERCOUNT = 1;
- /**
- * @var string $user
- */
- protected $user;
- /**
- * @var bool $isAdmin
- */
- protected $isAdmin;
- /**
- * @var array $metaData
- */
- protected $metaData = array();
- /**
- * @var \OCP\IGroupManager $groupManager
- */
- protected $groupManager;
- /**
- * @var int $sorting
- */
- protected $sorting = false;
- /**
- * @param string $user the uid of the current user
- * @param bool $isAdmin whether the current users is an admin
- * @param \OCP\IGroupManager $groupManager
- */
- public function __construct(
- $user,
- $isAdmin,
- \OCP\IGroupManager $groupManager
- ) {
- $this->user = $user;
- $this->isAdmin = (bool)$isAdmin;
- $this->groupManager = $groupManager;
- }
- /**
- * returns an array with meta data about all available groups
- * the array is structured as follows:
- * [0] array containing meta data about admin groups
- * [1] array containing meta data about unprivileged groups
- * @param string $groupSearch only effective when instance was created with
- * isAdmin being true
- * @param string $userSearch the pattern users are search for
- * @return array
- */
- public function get($groupSearch = '', $userSearch = '') {
- $key = $groupSearch . '::' . $userSearch;
- if(isset($this->metaData[$key])) {
- return $this->metaData[$key];
- }
- $adminGroups = array();
- $groups = array();
- $sortGroupsIndex = 0;
- $sortGroupsKeys = array();
- $sortAdminGroupsIndex = 0;
- $sortAdminGroupsKeys = array();
- foreach($this->getGroups($groupSearch) as $group) {
- $groupMetaData = $this->generateGroupMetaData($group, $userSearch);
- if (strtolower($group->getGID()) !== 'admin') {
- $this->addEntry(
- $groups,
- $sortGroupsKeys,
- $sortGroupsIndex,
- $groupMetaData);
- } else {
- //admin group is hard coded to 'admin' for now. In future,
- //backends may define admin groups too. Then the if statement
- //has to be adjusted accordingly.
- $this->addEntry(
- $adminGroups,
- $sortAdminGroupsKeys,
- $sortAdminGroupsIndex,
- $groupMetaData);
- }
- }
- //whether sorting is necessary is will be checked in sort()
- $this->sort($groups, $sortGroupsKeys);
- $this->sort($adminGroups, $sortAdminGroupsKeys);
- $this->metaData[$key] = array($adminGroups, $groups);
- return $this->metaData[$key];
- }
- /**
- * sets the sort mode, currently 0 (none) and 1 (user entries,
- * descending) are supported
- * @param int $sortMode (SORT_NONE, SORT_USERCOUNT)
- */
- public function setSorting($sortMode) {
- if($sortMode >= 0 && $sortMode <= 1) {
- $this->sorting = $sortMode;
- } else {
- $this->sorting = 0;
- }
- }
- /**
- * adds an group entry to the resulting array
- * @param array $entries the resulting array, by reference
- * @param array $sortKeys the sort key array, by reference
- * @param int $sortIndex the sort key index, by reference
- * @param array $data the group's meta data as returned by generateGroupMetaData()
- * @return null
- */
- private function addEntry(&$entries, &$sortKeys, &$sortIndex, $data) {
- $entries[] = $data;
- if($this->sorting === 1) {
- $sortKeys[$sortIndex] = $data['usercount'];
- $sortIndex++;
- }
- }
- /**
- * creates an array containing the group meta data
- * @param \OC\Group\Group $group
- * @param string $userSearch
- * @return array with the keys 'id', 'name' and 'usercount'
- */
- private function generateGroupMetaData(\OC\Group\Group $group, $userSearch) {
- return array(
- 'id' => $group->getGID(),
- 'name' => $group->getGID(),
- 'usercount' => $group->count($userSearch)
- );
- }
- /**
- * sorts the result array, if applicable
- * @param array $entries the result array, by reference
- * @param array $sortKeys the array containing the sort keys
- * @param return null
- */
- private function sort(&$entries, $sortKeys) {
- if($this->sorting > 0) {
- array_multisort($sortKeys, SORT_DESC, $entries);
- }
- }
- /**
- * returns the available groups
- * @param string $search a search string
- * @return \OC\Group\Group[]
- */
- private function getGroups($search = '') {
- if($this->isAdmin) {
- return $this->groupManager->search($search);
- } else {
- // FIXME: Remove static method call
- $groupIds = \OC_SubAdmin::getSubAdminsGroups($this->user);
- /* \OC_SubAdmin::getSubAdminsGroups() returns an array of GIDs, but this
- * method is expected to return an array with the GIDs as keys and group objects as
- * values, so we need to convert this information.
- */
- $groups = array();
- foreach($groupIds as $gid) {
- $group = $this->groupManager->get($gid);
- if (!is_null($group)) {
- $groups[$gid] = $group;
- }
- }
- return $groups;
- }
- }
- }
|