summaryrefslogtreecommitdiffstats
path: root/lib/private/Group/MetaData.php
diff options
context:
space:
mode:
Diffstat (limited to 'lib/private/Group/MetaData.php')
-rw-r--r--lib/private/Group/MetaData.php200
1 files changed, 200 insertions, 0 deletions
diff --git a/lib/private/Group/MetaData.php b/lib/private/Group/MetaData.php
new file mode 100644
index 00000000000..8e0866479c1
--- /dev/null
+++ b/lib/private/Group/MetaData.php
@@ -0,0 +1,200 @@
+<?php
+/**
+ * @author Arthur Schiwon <blizzz@owncloud.com>
+ * @author Joas Schilling <nickvergessen@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) 2016, 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;
+
+use OCP\IUserSession;
+
+class MetaData {
+ const SORT_NONE = 0;
+ const SORT_USERCOUNT = 1; // May have performance issues on LDAP backends
+ const SORT_GROUPNAME = 2;
+
+ /** @var string */
+ protected $user;
+ /** @var bool */
+ protected $isAdmin;
+ /** @var array */
+ protected $metaData = array();
+ /** @var \OCP\IGroupManager */
+ protected $groupManager;
+ /** @var bool */
+ protected $sorting = false;
+ /** @var IUserSession */
+ protected $userSession;
+
+ /**
+ * @param string $user the uid of the current user
+ * @param bool $isAdmin whether the current users is an admin
+ * @param \OCP\IGroupManager $groupManager
+ * @param IUserSession $userSession
+ */
+ public function __construct(
+ $user,
+ $isAdmin,
+ \OCP\IGroupManager $groupManager,
+ IUserSession $userSession
+ ) {
+ $this->user = $user;
+ $this->isAdmin = (bool)$isAdmin;
+ $this->groupManager = $groupManager;
+ $this->userSession = $userSession;
+ }
+
+ /**
+ * 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, see SORT_* constants for supported modes
+ *
+ * @param int $sortMode
+ */
+ public function setSorting($sortMode) {
+ switch ($sortMode) {
+ case self::SORT_USERCOUNT:
+ case self::SORT_GROUPNAME:
+ $this->sorting = $sortMode;
+ break;
+
+ default:
+ $this->sorting = self::SORT_NONE;
+ }
+ }
+
+ /**
+ * 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()
+ */
+ private function addEntry(&$entries, &$sortKeys, &$sortIndex, $data) {
+ $entries[] = $data;
+ if ($this->sorting === self::SORT_USERCOUNT) {
+ $sortKeys[$sortIndex] = $data['usercount'];
+ $sortIndex++;
+ } else if ($this->sorting === self::SORT_GROUPNAME) {
+ $sortKeys[$sortIndex] = $data['name'];
+ $sortIndex++;
+ }
+ }
+
+ /**
+ * creates an array containing the group meta data
+ * @param \OCP\IGroup $group
+ * @param string $userSearch
+ * @return array with the keys 'id', 'name' and 'usercount'
+ */
+ private function generateGroupMetaData(\OCP\IGroup $group, $userSearch) {
+ return array(
+ 'id' => $group->getGID(),
+ 'name' => $group->getGID(),
+ 'usercount' => $this->sorting === self::SORT_USERCOUNT ? $group->count($userSearch) : 0,
+ );
+ }
+
+ /**
+ * 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 === self::SORT_USERCOUNT) {
+ array_multisort($sortKeys, SORT_DESC, $entries);
+ } else if ($this->sorting === self::SORT_GROUPNAME) {
+ array_multisort($sortKeys, SORT_ASC, $entries);
+ }
+ }
+
+ /**
+ * returns the available groups
+ * @param string $search a search string
+ * @return \OCP\IGroup[]
+ */
+ protected function getGroups($search = '') {
+ if($this->isAdmin) {
+ return $this->groupManager->search($search);
+ } else {
+ $userObject = $this->userSession->getUser();
+ if($userObject !== null) {
+ $groups = $this->groupManager->getSubAdmin()->getSubAdminsGroups($userObject);
+ } else {
+ $groups = [];
+ }
+
+ return $groups;
+ }
+ }
+}