Skip to content

Commit

Permalink
perf: use more optimized way to get user storage info in ocs user info
Browse files Browse the repository at this point in the history
Signed-off-by: Robin Appelman <[email protected]>
  • Loading branch information
icewind1991 committed Nov 25, 2024
1 parent 8995272 commit 62119fc
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 28 deletions.
58 changes: 35 additions & 23 deletions apps/provisioning_api/lib/Controller/AUserData.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
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;
Expand Down Expand Up @@ -56,6 +58,7 @@ public function __construct(
protected IAccountManager $accountManager,
protected ISubAdmin $subAdminManager,
protected IFactory $l10nFactory,
protected IRootFolder $rootFolder,
) {
parent::__construct($appName, $request);
}
Expand Down Expand Up @@ -119,7 +122,7 @@ protected function getUserData(string $userId, bool $includeScopes = false): ?ar
$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];

Expand Down Expand Up @@ -243,34 +246,45 @@ protected function getUserSubAdminGroupsData(string $userId): array {
}

/**
* @param string $userId
* @param IUser $user
* @return Provisioning_APIUserDetailsQuota

Check failure on line 250 in apps/provisioning_api/lib/Controller/AUserData.php

View workflow job for this annotation

GitHub Actions / static-code-analysis

InvalidReturnType

apps/provisioning_api/lib/Controller/AUserData.php:250:13: InvalidReturnType: The declared return type 'array{free?: float|int, quota?: float|int|string, relative?: float|int, total?: float|int, used?: float|int}' for OCA\Provisioning_API\Controller\AUserData::fillStorageInfo is incorrect, got 'array{free?: float|int<min, max>, quota?: 'none'|false|float|int<min, max>, relative?: 0|float, total?: float|int, used?: int}' (see https://psalm.dev/011)
* @throws OCSException
*/
protected function fillStorageInfo(string $userId): array {
protected function fillStorageInfo(IUser $user): array {
$userId = $user->getUID();

$quota = $user->getQuota();
if ($quota === 'none') {
$quota = FileInfo::SPACE_UNLIMITED;
} else {
$quota = OC_Helper::computerFileSize($quota);
}

try {
\OC_Util::tearDownFS();
\OC_Util::setupFS($userId);
$storage = OC_Helper::getStorageInfo('/', null, true, false);
$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 = $used;
}

$data = [
'free' => $storage['free'],
'used' => $storage['used'],
'total' => $storage['total'],
'relative' => $storage['relative'],
self::USER_FIELD_QUOTA => $storage['quota'],
'free' => $free,
'used' => $used,
'total' => $total,
'relative' => $relative,
self::USER_FIELD_QUOTA => $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);
}
$quota = $user->getQuota();
if ($quota !== 'none') {
$quota = OC_Helper::computerFileSize($quota);
}
$data = [
self::USER_FIELD_QUOTA => $quota !== false ? $quota : 'none',
self::USER_FIELD_QUOTA => $quota >= 0 ? $quota : 'none',
'used' => 0
];
} catch (\Exception $e) {
Expand All @@ -282,8 +296,6 @@ protected function fillStorageInfo(string $userId): array {
'exception' => $e,
]
);
/* In case the Exception left things in a bad state */
\OC_Util::tearDownFS();
return [];
}
return $data;

Check failure on line 301 in apps/provisioning_api/lib/Controller/AUserData.php

View workflow job for this annotation

GitHub Actions / static-code-analysis

InvalidReturnStatement

apps/provisioning_api/lib/Controller/AUserData.php:301:10: InvalidReturnStatement: The inferred type 'array{free?: float|int<min, max>, quota: 'none'|false|float|int<min, max>, relative?: 0|float, total?: float|int, used: int}' does not match the declared return type 'array{free?: float|int, quota?: float|int|string, relative?: float|int, total?: float|int, used?: float|int}' for OCA\Provisioning_API\Controller\AUserData::fillStorageInfo (see https://psalm.dev/128)
Expand Down
5 changes: 4 additions & 1 deletion apps/provisioning_api/lib/Controller/GroupsController.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@
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;
Expand Down Expand Up @@ -48,6 +49,7 @@ public function __construct(
IAccountManager $accountManager,
ISubAdmin $subAdminManager,
IFactory $l10nFactory,
IRootFolder $rootFolder,
private LoggerInterface $logger,
) {
parent::__construct($appName,
Expand All @@ -58,7 +60,8 @@ public function __construct(
$userSession,
$accountManager,
$subAdminManager,
$l10nFactory
$l10nFactory,
$rootFolder,
);
}

Expand Down
5 changes: 4 additions & 1 deletion apps/provisioning_api/lib/Controller/UsersController.php
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
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;
Expand Down Expand Up @@ -67,6 +68,7 @@ public function __construct(
IAccountManager $accountManager,
ISubAdmin $subAdminManager,
IFactory $l10nFactory,
IRootFolder $rootFolder,
private IURLGenerator $urlGenerator,
private LoggerInterface $logger,
private NewUserMailHelper $newUserMailHelper,
Expand All @@ -85,7 +87,8 @@ public function __construct(
$userSession,
$accountManager,
$subAdminManager,
$l10nFactory
$l10nFactory,
$rootFolder,
);

$this->l10n = $l10nFactory->get($appName);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1127,7 +1127,7 @@ public function testGetUserDataAsAdmin(): void {
$this->api
->expects($this->once())
->method('fillStorageInfo')
->with('UID')
->with($targetUser)
->willReturn(['DummyValue']);

$backend = $this->createMock(UserInterface::class);
Expand Down Expand Up @@ -1254,7 +1254,7 @@ public function testGetUserDataAsSubAdminAndUserIsAccessible(): void {
$this->api
->expects($this->once())
->method('fillStorageInfo')
->with('UID')
->with($targetUser)
->willReturn(['DummyValue']);

$backend = $this->createMock(UserInterface::class);
Expand Down Expand Up @@ -1429,7 +1429,7 @@ public function testGetUserDataAsSubAdminSelfLookup(): void {
$this->api
->expects($this->once())
->method('fillStorageInfo')
->with('UID')
->with($targetUser)
->willReturn(['DummyValue']);

$backend = $this->createMock(UserInterface::class);
Expand Down

0 comments on commit 62119fc

Please sign in to comment.