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:
Côme Chilliet 2023-06-27 15:00:06 +02:00
parent 8977e4eb06
commit c1c40ff2bb
No known key found for this signature in database
GPG key ID: A3E2F658B28C760A
4 changed files with 50 additions and 13 deletions

View file

@ -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();

View file

@ -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) {

View file

@ -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;

View file

@ -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
*