mirror of
https://github.com/nextcloud/server.git
synced 2026-06-08 16:26:59 -04:00
improve lazy UserFolder
Signed-off-by: Robin Appelman <robin@icewind.nl>
This commit is contained in:
parent
19c64cf8b6
commit
79f6742410
3 changed files with 70 additions and 7 deletions
59
lib/private/Files/Node/LazyUserFolder.php
Normal file
59
lib/private/Files/Node/LazyUserFolder.php
Normal file
|
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
/**
|
||||
* @copyright Copyright (c) 2022 Robin Appelman <robin@icewind.nl>
|
||||
*
|
||||
* @license GNU AGPL version 3 or any later version
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as
|
||||
* published by the Free Software Foundation, either version 3 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
namespace OC\Files\Node;
|
||||
|
||||
|
||||
use OCP\Constants;
|
||||
use OCP\Files\IRootFolder;
|
||||
use OCP\Files\NotFoundException;
|
||||
use OCP\IUser;
|
||||
|
||||
class LazyUserFolder extends LazyFolder {
|
||||
private IRootFolder $rootFolder;
|
||||
private IUser $user;
|
||||
|
||||
public function __construct(IRootFolder $rootFolder, IUser $user) {
|
||||
$this->rootFolder = $rootFolder;
|
||||
$this->user = $user;
|
||||
parent::__construct(function() use ($user) {
|
||||
try {
|
||||
return $this->rootFolder->get('/' . $user->getUID() . '/files');
|
||||
} catch (NotFoundException $e) {
|
||||
if (!$this->rootFolder->nodeExists('/' . $user->getUID())) {
|
||||
$this->rootFolder->newFolder('/' . $user->getUID());
|
||||
}
|
||||
return $this->rootFolder->newFolder('/' . $user->getUID() . '/files');
|
||||
}
|
||||
}, [
|
||||
'path' => '/' . $user->getUID() . '/files',
|
||||
'permissions' => Constants::PERMISSION_ALL,
|
||||
]);
|
||||
}
|
||||
|
||||
public function get($path) {
|
||||
return $this->rootFolder->get('/' . $this->user->getUID() . '/files/' . rtrim($path, '/'));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
@ -381,19 +381,23 @@ class Root extends Folder implements IRootFolder {
|
|||
$userId = $userObject->getUID();
|
||||
|
||||
if (!$this->userFolderCache->hasKey($userId)) {
|
||||
$folder = new LazyFolder(function () use ($userId) {
|
||||
if ($this->mountManager->getSetupManager()->isSetupComplete($userObject)) {
|
||||
try {
|
||||
return $this->get('/' . $userId . '/files');
|
||||
$folder = $this->get('/' . $userId . '/files');
|
||||
if ($folder instanceof \OCP\Files\Folder) {
|
||||
return $folder;
|
||||
} else {
|
||||
throw new \Exception("User folder for $userId exists as a file");
|
||||
}
|
||||
} catch (NotFoundException $e) {
|
||||
if (!$this->nodeExists('/' . $userId)) {
|
||||
$this->newFolder('/' . $userId);
|
||||
}
|
||||
return $this->newFolder('/' . $userId . '/files');
|
||||
}
|
||||
}, [
|
||||
'path' => '/' . $userId . '/files',
|
||||
'permissions' => Constants::PERMISSION_ALL,
|
||||
]);
|
||||
} else {
|
||||
$folder = new LazyUserFolder($this, $userObject);
|
||||
}
|
||||
|
||||
$this->userFolderCache->set($userId, $folder);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -95,7 +95,7 @@ class SetupManager {
|
|||
return in_array($user->getUID(), $this->setupUsers, true);
|
||||
}
|
||||
|
||||
private function isSetupComplete(IUser $user): bool {
|
||||
public function isSetupComplete(IUser $user): bool {
|
||||
return in_array($user->getUID(), $this->setupUsersComplete, true);
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue