Skip to content

Commit 80e469c

Browse files
committed
Split in getReadablePathByUserForFileId and getReadableNodesByUserForFileId
Optimises further and avoid duplicate code for all activity listeners Signed-off-by: Côme Chilliet <come.chilliet@nextcloud.com>
1 parent 287a5a8 commit 80e469c

File tree

4 files changed

+47
-13
lines changed

4 files changed

+47
-13
lines changed

apps/comments/lib/Activity/Listener.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -68,10 +68,9 @@ public function commentEvent(CommentsEvent $event): void {
6868

6969
$cache = $this->mountCollection->getMountCache();
7070

71-
$users = [];
72-
$filesPerUser = $cache->getReadableNodesByUserForFileId((int)$event->getComment()->getObjectId());
73-
foreach ($filesPerUser as $user => $files) {
74-
$users[$user] = $this->rootFolder->getUserFolder($user)->getRelativePath(reset($files)?->getPath() ?? '');
71+
$users = $cache->getReadablePathByUserForFileId((int)$event->getComment()->getObjectId());
72+
if (empty($users)) {
73+
return;
7574
}
7675

7776
$actor = $this->session->getUser();

apps/systemtags/lib/Activity/Listener.php

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -171,14 +171,10 @@ public function mapperEvent(MapperEvent $event) {
171171
// Get all mount point owners
172172
$cache = $this->mountCollection->getMountCache();
173173

174-
$users = [];
175-
$filesPerUser = $cache->getReadableNodesByUserForFileId((int)$event->getObjectId());
176-
if (empty($filesPerUser)) {
174+
$users = $cache->getReadablePathByUserForFileId((int)$event->getObjectId());
175+
if (empty($users)) {
177176
return;
178177
}
179-
foreach ($filesPerUser as $user => $files) {
180-
$users[$user] = $this->rootFolder->getUserFolder($user)->getRelativePath(reset($files)?->getPath() ?? '');
181-
}
182178

183179
$actor = $this->session->getUser();
184180
if ($actor instanceof IUser) {

lib/private/Files/Config/UserMountCache.php

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -397,12 +397,42 @@ public function getReadableNodesByUserForFileId(int $fileId): array {
397397
$rootFolder = Server::get(IRootFolder::class);
398398
$result = [];
399399
foreach ($mounts as $mount) {
400-
if (isset($result[$mount->getUser()->getUID()])) {
400+
$uid = $mount->getUser()->getUID();
401+
if (!isset($result[$uid])) {
402+
$result[$uid] = [];
403+
}
404+
405+
$userFolder = $rootFolder->getUserFolder($uid);
406+
$result[$uid] = array_merge($result[$uid], $userFolder->getById($fileId));
407+
}
408+
409+
return array_filter($result);
410+
}
411+
412+
/**
413+
* Get all users having read access to a file, with a path they see it as.
414+
* They may see the same file under other paths,
415+
* to get this information use the exhaustive getReadableNodesByUserForFileId
416+
*
417+
* @return array<string,string> Paths giving access to the given fileId, indexed by user ID
418+
* @since 28.0.0
419+
*/
420+
public function getReadablePathByUserForFileId(int $fileId): array {
421+
$mounts = $this->getMountsForFileId($fileId);
422+
$rootFolder = Server::get(IRootFolder::class);
423+
$result = [];
424+
foreach ($mounts as $mount) {
425+
$uid = $mount->getUser()->getUID();
426+
if (isset($result[$uid])) {
401427
continue;
402428
}
403429

404-
$userFolder = $rootFolder->getUserFolder($mount->getUser()->getUID());
405-
$result[$mount->getUser()->getUID()] = $userFolder->getById($fileId);
430+
$userFolder = $rootFolder->getUserFolder($uid);
431+
$nodes = $userFolder->getById($fileId);
432+
$node = reset($nodes);
433+
if ($node) {
434+
$result[$uid] = $userFolder->getRelativePath($node->getPath());
435+
}
406436
}
407437

408438
return $result;

lib/public/Files/Config/IUserMountCache.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,15 @@ public function getMountsForFileId($fileId, $user = null);
9191
*/
9292
public function getReadableNodesByUserForFileId(int $fileId): array;
9393

94+
/**
95+
* Get all users having read access to a file, with a path they see it as.
96+
* They may see the same file under other paths, to get this information use exhaustive getReadableNodesByUserForFileId
97+
*
98+
* @return array<string, string> Paths giving access to the given fileId, indexed by user ID
99+
* @since 28.0.0
100+
*/
101+
public function getReadablePathByUserForFileId(int $fileId): array;
102+
94103
/**
95104
* Remove all cached mounts for a user
96105
*

0 commit comments

Comments
 (0)