Skip to content

Commit 38aed1d

Browse files
authored
Merge pull request #1514 from arawa/backport/improve-time-to-show-workspaces/1484/stable4.1
[Fix] Backport: Improve the time to display more than 1500 workspaces
2 parents 6db950b + 10e401a commit 38aed1d

File tree

5 files changed

+153
-120
lines changed

5 files changed

+153
-120
lines changed

lib/Controller/WorkspaceController.php

Lines changed: 11 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -28,18 +28,12 @@
2828
use OCA\Workspace\Db\SpaceMapper;
2929
use OCA\Workspace\Exceptions\BadRequestException;
3030
use OCA\Workspace\Folder\RootFolder;
31-
use OCA\Workspace\Group\Admin\AdminGroup;
32-
use OCA\Workspace\Group\Admin\AdminUserGroup;
3331
use OCA\Workspace\Helper\GroupfolderHelper;
34-
use OCA\Workspace\Service\Group\ConnectedGroupsService;
35-
use OCA\Workspace\Service\Group\GroupFormatter;
32+
use OCA\Workspace\Service\Formatter\WorkspaceFormatter;
3633
use OCA\Workspace\Service\Group\ManagersWorkspace;
37-
use OCA\Workspace\Service\Group\UserGroup;
3834
use OCA\Workspace\Service\Group\WorkspaceManagerGroup;
39-
use OCA\Workspace\Service\SpaceService;
4035
use OCA\Workspace\Service\User\UserFormatter;
4136
use OCA\Workspace\Service\UserService;
42-
use OCA\Workspace\Service\Workspace\WorkspaceCheckService;
4337
use OCA\Workspace\Service\WorkspaceService;
4438
use OCA\Workspace\Space\SpaceManager;
4539
use OCP\AppFramework\Controller;
@@ -53,22 +47,16 @@
5347
class WorkspaceController extends Controller {
5448
public function __construct(
5549
IRequest $request,
56-
private AdminGroup $adminGroup,
57-
private AdminUserGroup $adminUserGroup,
5850
private GroupfolderHelper $folderHelper,
5951
private IGroupManager $groupManager,
6052
private RootFolder $rootFolder,
6153
private IUserManager $userManager,
6254
private LoggerInterface $logger,
6355
private SpaceMapper $spaceMapper,
64-
private SpaceService $spaceService,
6556
private UserService $userService,
66-
private ConnectedGroupsService $connectedGroups,
67-
private WorkspaceCheckService $workspaceCheck,
57+
private WorkspaceFormatter $workspaceFormatter,
6858
private WorkspaceService $workspaceService,
69-
private UserGroup $userGroup,
7059
private UserFormatter $userFormatter,
71-
private WorkspaceManagerGroup $workspaceManagerGroup,
7260
private SpaceManager $spaceManager,
7361
public $AppName,
7462
) {
@@ -144,53 +132,27 @@ public function destroy(int $spaceId): JSONResponse {
144132
public function findAll(): JSONResponse {
145133
$workspaces = $this->workspaceService->getAll();
146134
$spaces = [];
135+
$rootFolderStorageId = $this->rootFolder->getRootFolderStorageId();
147136
foreach ($workspaces as $workspace) {
148137
$folderInfo = $this->folderHelper->getFolder(
149138
$workspace['groupfolder_id'],
150-
$this->rootFolder->getRootFolderStorageId()
139+
$rootFolderStorageId
151140
);
152-
$space = ($folderInfo !== false) ? array_merge(
153-
$folderInfo,
154-
$workspace
155-
) : $workspace;
156141

157-
$gids = array_keys($space['groups'] ?? []);
158-
$wsGroups = [];
159-
$space['users'] = (object)[];
160-
$addedGroups = [];
161-
162-
foreach ($gids as $gid) {
163-
$group = $this->groupManager->get($gid);
164-
if (is_null($group)) {
165-
$this->logger->warning(
166-
"Be careful, the $gid group does not exist in the oc_groups table."
167-
. ' The group is still present in the oc_group_folders_groups table.'
168-
. ' To fix this inconsistency, recreate the group using occ commands.'
169-
);
170-
continue;
171-
}
172-
if (UserGroup::isWorkspaceGroup($group)) {
173-
$wsGroups[] = $group;
174-
} else {
175-
$addedGroups[] = $group;
176-
}
177-
178-
if (UserGroup::isWorkspaceUserGroupId($gid)) {
179-
$space['usersCount'] = $group->count();
180-
}
142+
if ($folderInfo === false) {
143+
$this->logger->warning("The groupfolder associated with {$workspace['name']} does not seem to exist.");
144+
continue;
181145
}
182146

183-
$space['groups'] = GroupFormatter::formatGroups($wsGroups);
184-
$space['added_groups'] = (object)GroupFormatter::formatGroups($addedGroups);
185-
186-
$spaces[] = $space;
147+
$spaces[$workspace['name']] = $this->workspaceFormatter->format($workspace, $folderInfo);
187148
}
149+
188150
// We only want to return those workspaces for which the connected user is a manager
189151
if (!$this->userService->isUserGeneralAdmin()) {
190152
$this->logger->debug('Filtering workspaces');
191-
$filteredWorkspaces = array_values(array_filter($spaces, function ($space) {
153+
$filteredWorkspaces = array_filter($spaces, function ($space) {
192154
return $this->userService->isSpaceManagerOfSpace($space);
193-
}));
155+
});
194156
$spaces = $filteredWorkspaces;
195157
}
196158

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
<?php
2+
3+
namespace OCA\Workspace\Service\Formatter;
4+
5+
use OCA\Workspace\Service\Group\GroupFormatter;
6+
use OCA\Workspace\Service\Group\UserGroup;
7+
use OCP\IGroupManager;
8+
use Psr\Log\LoggerInterface;
9+
10+
class WorkspaceFormatter {
11+
12+
public const NO_USERS = 0;
13+
14+
public function __construct(
15+
private LoggerInterface $logger,
16+
private IGroupManager $groupManager,
17+
) {
18+
}
19+
20+
/**
21+
* @param array $workspace
22+
* @param array $folderInfo
23+
* @return array
24+
*/
25+
public function format(array $workspace, array $folderInfo): array {
26+
$space = [
27+
'id' => $workspace['id'] ?? null,
28+
'color' => $workspace['color_code'] ?? null,
29+
'groupfolderId' => $workspace['groupfolder_id'] ?? null,
30+
'isOpen' => false,
31+
'name' => $workspace['name'] ?? null,
32+
'quota' => $folderInfo['quota'] ?? null,
33+
'size' => $folderInfo['size'] ?? null,
34+
'managers' => null,
35+
'users' => (object)[],
36+
'usersCount' => self::NO_USERS,
37+
];
38+
39+
$wsGroups = [];
40+
$addedGroups = [];
41+
$gids = array_keys($folderInfo['groups'] ?? []);
42+
43+
foreach ($gids as $gid) {
44+
$group = $this->groupManager->get($gid);
45+
46+
if (is_null($group)) {
47+
$this->logger->warning(
48+
"Be careful, the $gid group does not exist in the oc_groups table."
49+
. ' The group is still present in the oc_group_folders_groups table.'
50+
. ' To fix this inconsistency, recreate the group using occ commands.'
51+
);
52+
continue;
53+
}
54+
55+
if (UserGroup::isWorkspaceGroup($group)) {
56+
$wsGroups[] = $group;
57+
} else {
58+
$addedGroups[] = $group;
59+
}
60+
61+
if (UserGroup::isWorkspaceUserGroupId($gid)) {
62+
$space['usersCount'] = $group->count();
63+
}
64+
}
65+
66+
$space['groups'] = GroupFormatter::formatGroups($wsGroups);
67+
$space['added_groups'] = (object)GroupFormatter::formatGroups($addedGroups);
68+
69+
return $space;
70+
}
71+
}

src/SpaceMenuItem.vue

Lines changed: 64 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -23,62 +23,65 @@
2323
:key="space.id"
2424
:class="'workspace-sidebar '+($route.params.space === spaceName ? 'space-selected' : '')"
2525
:allow-collapse="true"
26-
:open="open()"
26+
:open="open"
2727
:name="spaceName"
28-
:to="{path: getSpacePath()}">
28+
:to="{path: getSpacePath()}"
29+
@update:open="isOpen = $event">
2930
<NcAppNavigationIconBullet slot="icon" :color="space.color" />
3031
<NcCounterBubble slot="counter" class="user-counter">
3132
{{ $store.getters.getSpaceUserCount(spaceName) }}
3233
</NcCounterBubble>
3334
<MenuItemSelector />
34-
<NcAppNavigationCaption
35-
ref="navigationGroup"
36-
:name="t('workspace', 'Workspace groups')">
37-
<template #actionsTriggerIcon>
38-
<Plus v-tooltip.right="t('workspace', 'Create a workspace group')" :name="t('workspace', 'Create a workspace group')" :size="20" />
39-
</template>
40-
<template #actions>
41-
<NcActionText :class="'space-text'">
42-
{{ t('workspace', 'Create a workspace group') }}
43-
</NcActionText>
44-
<NcActionInput v-show="true"
45-
ref="createGroupInput"
46-
:class="'ws-modal-action'"
47-
icon="icon-group"
48-
:close-after-click="true"
49-
:show-trailing-button="true"
50-
@submit="onNewWorkspaceGroup" />
51-
</template>
52-
</NcAppNavigationCaption>
53-
54-
<GroupMenuItem
55-
v-for="group in sortedGroups(Object.values(space.groups ?? []), spaceName)"
56-
:key="group.gid"
57-
:group="group"
58-
:count="group.usersCount"
59-
:space-id="space.id"
60-
:space-name="spaceName" />
61-
<NcAppNavigationCaption
62-
:name="t('workspace', 'Added groups')">
63-
<template #actions>
64-
<NcActionButton
65-
:aria-label="t('workspace', 'Add a group')"
66-
@click="toggleAddGroupModal">
67-
<template #icon>
68-
<Plus v-tooltip.right="t('workspace', 'Add a group')" :size="20" />
69-
</template>
70-
</NcActionButton>
71-
</template>
72-
</NcAppNavigationCaption>
73-
<SelectConnectedGroups v-if="isAddGroupModalOpen" :space="space" @close="toggleAddGroupModal" />
74-
<GroupMenuItem
75-
v-for="group in sortedGroups(Object.values(space.added_groups ?? []), spaceName)"
76-
:key="group.gid"
77-
:group="group"
78-
:space-id="space.id"
79-
:space-name="spaceName"
80-
:count="group.usersCount"
81-
:added-group="true" />
35+
<div v-if="isOpen">
36+
<NcAppNavigationCaption
37+
ref="navigationGroup"
38+
:name="t('workspace', 'Workspace groups')">
39+
<template #actionsTriggerIcon>
40+
<Plus v-tooltip.right="t('workspace', 'Create a workspace group')" :name="t('workspace', 'Create a workspace group')" :size="20" />
41+
</template>
42+
<template #actions>
43+
<NcActionText :class="'space-text'">
44+
{{ t('workspace', 'Create a workspace group') }}
45+
</NcActionText>
46+
<NcActionInput v-show="true"
47+
ref="createGroupInput"
48+
:class="'ws-modal-action'"
49+
icon="icon-group"
50+
:close-after-click="true"
51+
:show-trailing-button="true"
52+
@submit="onNewWorkspaceGroup" />
53+
</template>
54+
</NcAppNavigationCaption>
55+
56+
<GroupMenuItem
57+
v-for="group in sortedGroups(Object.values(space.groups ?? []), spaceName)"
58+
:key="group.gid"
59+
:group="group"
60+
:count="group.usersCount"
61+
:space-id="space.id"
62+
:space-name="spaceName" />
63+
<NcAppNavigationCaption
64+
:name="t('workspace', 'Added groups')">
65+
<template #actions>
66+
<NcActionButton
67+
:aria-label="t('workspace', 'Add a group')"
68+
@click="toggleAddGroupModal">
69+
<template #icon>
70+
<Plus v-tooltip.right="t('workspace', 'Add a group')" :size="20" />
71+
</template>
72+
</NcActionButton>
73+
</template>
74+
</NcAppNavigationCaption>
75+
<SelectConnectedGroups v-if="isAddGroupModalOpen" :space="space" @close="toggleAddGroupModal" />
76+
<GroupMenuItem
77+
v-for="group in sortedGroups(Object.values(space.added_groups ?? []), spaceName)"
78+
:key="group.gid"
79+
:group="group"
80+
:space-id="space.id"
81+
:space-name="spaceName"
82+
:count="group.usersCount"
83+
:added-group="true" />
84+
</div>
8285
</NcAppNavigationItem>
8386
</template>
8487

@@ -124,6 +127,7 @@ export default {
124127
},
125128
data() {
126129
return {
130+
isOpen: false,
127131
workspaceGroups: [],
128132
connectedGroups: [],
129133
@@ -132,6 +136,16 @@ export default {
132136
}
133137
},
134138
computed: {
139+
open() {
140+
const id = this.space.id.toString()
141+
return this.$route.params.space === id
142+
},
143+
},
144+
mounted() {
145+
// Open the space menu item if we are in the space route
146+
if (this.open) {
147+
this.isOpen = true
148+
}
135149
},
136150
methods: {
137151
// sorts groups alphabetically
@@ -195,10 +209,6 @@ export default {
195209
return url.substr(url.indexOf('/workspace/'))
196210
},
197211
198-
open() {
199-
const id = this.space.id.toString()
200-
return this.$route.params.space === id
201-
},
202212
},
203213
}
204214
</script>

src/WorkspaceContent.vue

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -64,24 +64,10 @@ export default {
6464
return
6565
}
6666
67-
resp.data.forEach(space => {
68-
this.$store.commit('addSpace', {
69-
color: space.color_code,
70-
groupfolderId: space.groupfolder_id,
71-
groups: space.groups,
72-
added_groups: space.added_groups ?? {},
73-
id: space.id,
74-
isOpen: false,
75-
name: space.name,
76-
quota: space.quota,
77-
size: space.size,
78-
users: space.users,
79-
userCount: space.userCount,
80-
managers: null,
81-
})
82-
})
67+
const spaces = resp.data
68+
this.$store.commit('addSpaces', { spaces })
8369
84-
this.$store.dispatch('setCountWorkspaces', { count: resp.data.length })
70+
this.$store.dispatch('setCountWorkspaces', { count: Object.values(resp.data).length })
8571
this.$store.state.loading = false
8672
8773
})

src/store/mutations.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ export default {
109109
state.spaces[space.name] = space
110110
sortSpaces(state)
111111
},
112+
addSpaces(state, spaces) {
113+
state.spaces = spaces.spaces
114+
sortSpaces(state)
115+
},
112116
addSpaceAdminUsers(state, space) {
113117
state.spaces[space.name].managers = space.managers
114118
},

0 commit comments

Comments
 (0)