Skip to content

Commit c1c40ff

Browse files
committed
fix: Split in getReadablePathByUserForFileId and getReadableNodesByUserForFileId
Optimises further and avoid duplicate code for all activity listeners Signed-off-by: Côme Chilliet <[email protected]>
1 parent 8977e4e commit c1c40ff

File tree

4 files changed

+50
-13
lines changed

4 files changed

+50
-13
lines changed

apps/comments/lib/Activity/Listener.php

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

3838
$cache = $this->mountCollection->getMountCache();
3939

40-
$users = [];
41-
$filesPerUser = $cache->getReadableNodesByUserForFileId((int)$event->getComment()->getObjectId());
42-
foreach ($filesPerUser as $user => $files) {
43-
$users[$user] = $this->rootFolder->getUserFolder($user)->getRelativePath(reset($files)?->getPath() ?? '');
40+
$users = $cache->getReadablePathByUserForFileId((int)$event->getComment()->getObjectId());
41+
if (empty($users)) {
42+
return;
4443
}
4544

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

apps/systemtags/lib/Activity/Listener.php

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

156-
$users = [];
157-
$filesPerUser = $cache->getReadableNodesByUserForFileId((int)$event->getObjectId());
158-
if (empty($filesPerUser)) {
156+
$users = $cache->getReadablePathByUserForFileId((int)$event->getObjectId());
157+
if (empty($users)) {
159158
return;
160159
}
161-
foreach ($filesPerUser as $user => $files) {
162-
$users[$user] = $this->rootFolder->getUserFolder($user)->getRelativePath(reset($files)?->getPath() ?? '');
163-
}
164160

165161
$actor = $this->session->getUser();
166162
if ($actor instanceof IUser) {

lib/private/Files/Config/UserMountCache.php

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

402-
$userFolder = $rootFolder->getUserFolder($mount->getUser()->getUID());
403-
$result[$mount->getUser()->getUID()] = $userFolder->getById($fileId);
428+
$userFolder = $rootFolder->getUserFolder($uid);
429+
$nodes = $userFolder->getById($fileId);
430+
$node = reset($nodes);
431+
if ($node) {
432+
$path = $userFolder->getRelativePath($node->getPath());
433+
if ($path !== null) {
434+
$result[$uid] = $path;
435+
}
436+
}
404437
}
405438

406439
return $result;

lib/public/Files/Config/IUserMountCache.php

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

77+
/**
78+
* Get all users having read access to a file, with a path they see it as.
79+
* They may see the same file under other paths, to get this information use exhaustive getReadableNodesByUserForFileId
80+
*
81+
* @return array<string, string> Paths giving access to the given fileId, indexed by user ID
82+
* @since 28.0.0
83+
*/
84+
public function getReadablePathByUserForFileId(int $fileId): array;
85+
7786
/**
7887
* Remove all cached mounts for a user
7988
*

0 commit comments

Comments
 (0)