diff options
author | Robin Appelman <robin@icewind.nl> | 2024-11-25 17:30:32 +0100 |
---|---|---|
committer | Robin Appelman <robin@icewind.nl> | 2025-01-16 17:06:04 +0100 |
commit | 3a2b3c75f20d1bd2ac22d79a4372c6c5c0b5fa2f (patch) | |
tree | 8e04572682efd8693046fde97d9492cc81c07aec /apps/provisioning_api/lib | |
parent | 8998e77c9d35d1c6183ac5d47f8e1ee9cdefa77f (diff) | |
download | nextcloud-server-ocs-user-info-quota-optimize.tar.gz nextcloud-server-ocs-user-info-quota-optimize.zip |
perf: use more optimized way to get user storage info in ocs user info when possibleocs-user-info-quota-optimize
Signed-off-by: Robin Appelman <robin@icewind.nl>
Diffstat (limited to 'apps/provisioning_api/lib')
3 files changed, 62 insertions, 28 deletions
diff --git a/apps/provisioning_api/lib/Controller/AUserDataOCSController.php b/apps/provisioning_api/lib/Controller/AUserDataOCSController.php index 4cded6c1137..32dcb08319c 100644 --- a/apps/provisioning_api/lib/Controller/AUserDataOCSController.php +++ b/apps/provisioning_api/lib/Controller/AUserDataOCSController.php @@ -11,7 +11,6 @@ namespace OCA\Provisioning_API\Controller; use OC\Group\Manager as GroupManager; use OC\User\Backend; use OC\User\NoUserException; -use OC_Helper; use OCA\Provisioning_API\ResponseDefinitions; use OCP\Accounts\IAccountManager; use OCP\Accounts\PropertyDoesNotExistException; @@ -19,6 +18,8 @@ use OCP\AppFramework\Http; use OCP\AppFramework\OCS\OCSException; use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\AppFramework\OCSController; +use OCP\Files\FileInfo; +use OCP\Files\IRootFolder; use OCP\Files\NotFoundException; use OCP\Group\ISubAdmin; use OCP\IConfig; @@ -29,6 +30,7 @@ use OCP\IUserSession; use OCP\L10N\IFactory; use OCP\User\Backend\ISetDisplayNameBackend; use OCP\User\Backend\ISetPasswordBackend; +use OCP\Util; /** * @psalm-import-type Provisioning_APIUserDetails from ResponseDefinitions @@ -56,6 +58,7 @@ abstract class AUserDataOCSController extends OCSController { protected IAccountManager $accountManager, protected ISubAdmin $subAdminManager, protected IFactory $l10nFactory, + protected IRootFolder $rootFolder, ) { parent::__construct($appName, $request); } @@ -121,7 +124,7 @@ abstract class AUserDataOCSController extends OCSController { $data['lastLogin'] = $targetUserObject->getLastLogin() * 1000; $data['backend'] = $targetUserObject->getBackendClassName(); $data['subadmin'] = $this->getUserSubAdminGroupsData($targetUserObject->getUID()); - $data[self::USER_FIELD_QUOTA] = $this->fillStorageInfo($targetUserObject->getUID()); + $data[self::USER_FIELD_QUOTA] = $this->fillStorageInfo($targetUserObject); $managers = $this->getManagers($targetUserObject); $data[self::USER_FIELD_MANAGER] = empty($managers) ? '' : $managers[0]; @@ -245,34 +248,61 @@ abstract class AUserDataOCSController extends OCSController { } /** - * @param string $userId + * @param IUser $user * @return Provisioning_APIUserDetailsQuota * @throws OCSException */ - protected function fillStorageInfo(string $userId): array { - try { - \OC_Util::tearDownFS(); - \OC_Util::setupFS($userId); - $storage = OC_Helper::getStorageInfo('/', null, true, false); - $data = [ - 'free' => $storage['free'], - 'used' => $storage['used'], - 'total' => $storage['total'], - 'relative' => $storage['relative'], - self::USER_FIELD_QUOTA => $storage['quota'], - ]; - } catch (NotFoundException $ex) { - // User fs is not setup yet - $user = $this->userManager->get($userId); - if ($user === null) { - throw new OCSException('User does not exist', 101); + protected function fillStorageInfo(IUser $user): array { + $includeExternal = $this->config->getSystemValueBool('quota_include_external_storage'); + $userId = $user->getUID(); + + $quota = $user->getQuota(); + if ($quota === 'none') { + $quota = FileInfo::SPACE_UNLIMITED; + } else { + $quota = Util::computerFileSize($quota); + if ($quota === false) { + $quota = FileInfo::SPACE_UNLIMITED; } - $quota = $user->getQuota(); - if ($quota !== 'none') { - $quota = OC_Helper::computerFileSize($quota); + } + + try { + if ($includeExternal) { + \OC_Util::setupFS($user->getUID()); + $storage = \OC_Helper::getStorageInfo('/', null, true, false); + $data = [ + 'free' => $storage['free'], + 'used' => $storage['used'], + 'total' => $storage['total'], + 'relative' => $storage['relative'], + self::USER_FIELD_QUOTA => $storage['quota'], + ]; + } else { + $userFileInfo = $this->rootFolder->getUserFolder($userId)->getStorage()->getCache()->get(''); + $used = $userFileInfo->getSize(); + + if ($quota > 0) { + // prevent division by zero or error codes (negative values) + $relative = round(($used / $quota) * 10000) / 100; + $free = $quota - $used; + $total = $quota; + } else { + $relative = 0; + $free = FileInfo::SPACE_UNLIMITED; + $total = FileInfo::SPACE_UNLIMITED; + } + + $data = [ + 'free' => $free, + 'used' => $used, + 'total' => $total, + 'relative' => $relative, + self::USER_FIELD_QUOTA => $quota, + ]; } + } catch (NotFoundException $ex) { $data = [ - self::USER_FIELD_QUOTA => $quota !== false ? $quota : 'none', + self::USER_FIELD_QUOTA => $quota >= 0 ? $quota : 'none', 'used' => 0 ]; } catch (\Exception $e) { @@ -284,8 +314,6 @@ abstract class AUserDataOCSController extends OCSController { 'exception' => $e, ] ); - /* In case the Exception left things in a bad state */ - \OC_Util::tearDownFS(); return []; } return $data; diff --git a/apps/provisioning_api/lib/Controller/GroupsController.php b/apps/provisioning_api/lib/Controller/GroupsController.php index 0ae7faae7e8..3d9fa6b1cfc 100644 --- a/apps/provisioning_api/lib/Controller/GroupsController.php +++ b/apps/provisioning_api/lib/Controller/GroupsController.php @@ -21,6 +21,7 @@ use OCP\AppFramework\OCS\OCSException; use OCP\AppFramework\OCS\OCSForbiddenException; use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\AppFramework\OCSController; +use OCP\Files\IRootFolder; use OCP\Group\ISubAdmin; use OCP\IConfig; use OCP\IGroup; @@ -48,6 +49,7 @@ class GroupsController extends AUserDataOCSController { IAccountManager $accountManager, ISubAdmin $subAdminManager, IFactory $l10nFactory, + IRootFolder $rootFolder, private LoggerInterface $logger, ) { parent::__construct($appName, @@ -58,7 +60,8 @@ class GroupsController extends AUserDataOCSController { $userSession, $accountManager, $subAdminManager, - $l10nFactory + $l10nFactory, + $rootFolder, ); } diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php index 7f9ea26b79c..301ee47c0a6 100644 --- a/apps/provisioning_api/lib/Controller/UsersController.php +++ b/apps/provisioning_api/lib/Controller/UsersController.php @@ -31,6 +31,7 @@ use OCP\AppFramework\OCS\OCSForbiddenException; use OCP\AppFramework\OCS\OCSNotFoundException; use OCP\AppFramework\OCSController; use OCP\EventDispatcher\IEventDispatcher; +use OCP\Files\IRootFolder; use OCP\Group\ISubAdmin; use OCP\HintException; use OCP\IConfig; @@ -67,6 +68,7 @@ class UsersController extends AUserDataOCSController { IAccountManager $accountManager, ISubAdmin $subAdminManager, IFactory $l10nFactory, + IRootFolder $rootFolder, private IURLGenerator $urlGenerator, private LoggerInterface $logger, private NewUserMailHelper $newUserMailHelper, @@ -85,7 +87,8 @@ class UsersController extends AUserDataOCSController { $userSession, $accountManager, $subAdminManager, - $l10nFactory + $l10nFactory, + $rootFolder, ); $this->l10n = $l10nFactory->get($appName); |