mirror of
https://github.com/nextcloud/server.git
synced 2026-06-12 10:10:49 -04:00
fix: 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>
This commit is contained in:
parent
8977e4eb06
commit
c1c40ff2bb
4 changed files with 50 additions and 13 deletions
|
|
@ -37,10 +37,9 @@ class Listener {
|
|||
|
||||
$cache = $this->mountCollection->getMountCache();
|
||||
|
||||
$users = [];
|
||||
$filesPerUser = $cache->getReadableNodesByUserForFileId((int)$event->getComment()->getObjectId());
|
||||
foreach ($filesPerUser as $user => $files) {
|
||||
$users[$user] = $this->rootFolder->getUserFolder($user)->getRelativePath(reset($files)?->getPath() ?? '');
|
||||
$users = $cache->getReadablePathByUserForFileId((int)$event->getComment()->getObjectId());
|
||||
if (empty($users)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$actor = $this->session->getUser();
|
||||
|
|
|
|||
|
|
@ -153,14 +153,10 @@ class Listener {
|
|||
// Get all mount point owners
|
||||
$cache = $this->mountCollection->getMountCache();
|
||||
|
||||
$users = [];
|
||||
$filesPerUser = $cache->getReadableNodesByUserForFileId((int)$event->getObjectId());
|
||||
if (empty($filesPerUser)) {
|
||||
$users = $cache->getReadablePathByUserForFileId((int)$event->getObjectId());
|
||||
if (empty($users)) {
|
||||
return;
|
||||
}
|
||||
foreach ($filesPerUser as $user => $files) {
|
||||
$users[$user] = $this->rootFolder->getUserFolder($user)->getRelativePath(reset($files)?->getPath() ?? '');
|
||||
}
|
||||
|
||||
$actor = $this->session->getUser();
|
||||
if ($actor instanceof IUser) {
|
||||
|
|
|
|||
|
|
@ -395,12 +395,45 @@ class UserMountCache implements IUserMountCache {
|
|||
$rootFolder = Server::get(IRootFolder::class);
|
||||
$result = [];
|
||||
foreach ($mounts as $mount) {
|
||||
if (isset($result[$mount->getUser()->getUID()])) {
|
||||
$uid = $mount->getUser()->getUID();
|
||||
if (!isset($result[$uid])) {
|
||||
$result[$uid] = [];
|
||||
}
|
||||
|
||||
$userFolder = $rootFolder->getUserFolder($uid);
|
||||
$result[$uid] = array_merge($result[$uid], $userFolder->getById($fileId));
|
||||
}
|
||||
|
||||
return array_filter($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all users having read access to a file, with a path they see it as.
|
||||
* They may see the same file under other paths,
|
||||
* to get this information use the exhaustive getReadableNodesByUserForFileId
|
||||
*
|
||||
* @return array<string,string> Paths giving access to the given fileId, indexed by user ID
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function getReadablePathByUserForFileId(int $fileId): array {
|
||||
$mounts = $this->getMountsForFileId($fileId);
|
||||
$rootFolder = Server::get(IRootFolder::class);
|
||||
$result = [];
|
||||
foreach ($mounts as $mount) {
|
||||
$uid = $mount->getUser()->getUID();
|
||||
if (isset($result[$uid])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$userFolder = $rootFolder->getUserFolder($mount->getUser()->getUID());
|
||||
$result[$mount->getUser()->getUID()] = $userFolder->getById($fileId);
|
||||
$userFolder = $rootFolder->getUserFolder($uid);
|
||||
$nodes = $userFolder->getById($fileId);
|
||||
$node = reset($nodes);
|
||||
if ($node) {
|
||||
$path = $userFolder->getRelativePath($node->getPath());
|
||||
if ($path !== null) {
|
||||
$result[$uid] = $path;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
|
|
|
|||
|
|
@ -74,6 +74,15 @@ interface IUserMountCache {
|
|||
*/
|
||||
public function getReadableNodesByUserForFileId(int $fileId): array;
|
||||
|
||||
/**
|
||||
* Get all users having read access to a file, with a path they see it as.
|
||||
* They may see the same file under other paths, to get this information use exhaustive getReadableNodesByUserForFileId
|
||||
*
|
||||
* @return array<string, string> Paths giving access to the given fileId, indexed by user ID
|
||||
* @since 28.0.0
|
||||
*/
|
||||
public function getReadablePathByUserForFileId(int $fileId): array;
|
||||
|
||||
/**
|
||||
* Remove all cached mounts for a user
|
||||
*
|
||||
|
|
|
|||
Loading…
Reference in a new issue