perf: Use getFirstNodeById as it is cached

Signed-off-by: Julius Härtl <jus@bitgrid.net>
This commit is contained in:
Julius Härtl 2024-07-15 07:46:51 +02:00
parent 51077f201c
commit 2b02997fd1
No known key found for this signature in database
GPG key ID: 4C614C6ED2CDE6DF
11 changed files with 55 additions and 72 deletions

View file

@ -18,7 +18,7 @@ SPDX-FileCopyrightText = "2016 Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"
[[annotations]]
path = ["js/**.js.map", "js/**.js", "js/**.mjs", "js/**.mjs.map", "js/templates/**.handlebars", "emptyTemplates/**", "cypress/fixtures/**", "tests/features/**.feature"]
path = ["js/**.js.map", "js/**.js", "js/**.mjs", "js/**.mjs.map", "js/templates/**.handlebars", "emptyTemplates/**", "cypress/fixtures/**", "tests/features/**.feature", "tests/psalm-baseline.xml"]
precedence = "aggregate"
SPDX-FileCopyrightText = "2016 Nextcloud GmbH and Nextcloud contributors"
SPDX-License-Identifier = "AGPL-3.0-or-later"

View file

@ -93,13 +93,12 @@ class AssetsController extends Controller {
$this->userScopeService->setUserScope($asset->getUid());
$userFolder = $this->rootFolder->getUserFolder($asset->getUid());
$nodes = $userFolder->getById($asset->getFileid());
$node = $userFolder->getFirstNodeById($asset->getFileid());
if ($nodes === []) {
if ($node === null) {
return new DataResponse([], Http::STATUS_NOT_FOUND);
}
$node = array_pop($nodes);
if (!($node instanceof File)) {
return new DataResponse([], Http::STATUS_NOT_FOUND);
}

View file

@ -79,7 +79,7 @@ class DirectViewController extends Controller {
$folder = $this->rootFolder->getUserFolder($direct->getUid());
try {
$item = $folder->getById($direct->getFileid())[0];
$item = $folder->getFirstNodeById($direct->getFileid());
if (!($item instanceof Node)) {
throw new \Exception();
}
@ -126,8 +126,7 @@ class DirectViewController extends Controller {
$node = $share->getNode();
if ($node instanceof Folder) {
$nodes = $node->getById($direct->getFileid());
$node = array_shift($nodes);
$node = $node->getFirstNodeById($direct->getFileid());
if ($node === null) {
throw new NotFoundException();
}

View file

@ -142,8 +142,11 @@ class DocumentAPIController extends \OCP\AppFramework\OCSController {
#[Http\Attribute\NoAdminRequired]
public function openLocal(int $fileId): DataResponse {
try {
$files = $this->rootFolder->getUserFolder($this->userId)->getById($fileId);
$file = array_shift($files);
$file = $this->rootFolder->getUserFolder($this->userId)->getFirstNodeById($fileId);
if ($file === null) {
return new DataResponse([], Http::STATUS_NOT_FOUND);
}
$this->lockManager->unlock(new LockContext(
$file,
ILock::TYPE_APP,

View file

@ -408,8 +408,7 @@ class DocumentController extends Controller {
if ($path !== null) {
$node = $folder->get($path);
} else {
$nodes = $folder->getById($fileId);
$node = array_shift($nodes);
$node = $folder->getFirstNodeById($fileId);
}
if ($node instanceof File) {
@ -449,8 +448,7 @@ class DocumentController extends Controller {
if ($path !== null) {
$node = $node->get($path);
} else {
$nodes = $node->getById($fileId);
$node = array_shift($nodes);
$node = $node->getFirstNodeById($fileId);
}
if ($node instanceof File) {

View file

@ -94,13 +94,12 @@ class OCSController extends \OCP\AppFramework\OCSController {
public function createDirect($fileId) {
try {
$userFolder = $this->rootFolder->getUserFolder($this->userId);
$nodes = $userFolder->getById($fileId);
$node = $userFolder->getFirstNodeById($fileId);
if ($nodes === []) {
if ($node === null) {
throw new OCSNotFoundException();
}
$node = $nodes[0];
if ($node instanceof Folder) {
throw new OCSBadRequestException('Cannot view folder');
}

View file

@ -409,11 +409,10 @@ class WopiController extends Controller {
if ($isPutRelative) {
// the new file needs to be installed in the current user dir
$userFolder = $this->rootFolder->getUserFolder($wopi->getEditorUid());
$file = $userFolder->getById($fileId);
if (count($file) === 0) {
$file = $userFolder->getFirstNodeById($fileId);
if ($file === null) {
return new JSONResponse([], Http::STATUS_NOT_FOUND);
}
$file = $file[0];
$suggested = $this->request->getHeader('X-WOPI-SuggestedTarget');
$suggested = mb_convert_encoding($suggested, 'utf-8', 'utf-7');
@ -782,8 +781,7 @@ class WopiController extends Controller {
return $node;
}
$nodes = $node->getById($wopi->getFileid());
return array_shift($nodes);
return $node->getFirstNodeById($wopi->getFileid());
}
// Group folders requires an active user to be set in order to apply the proper acl permissions as for anonymous requests it requires share permissions for read access

View file

@ -66,8 +66,7 @@ class OfficeTargetReferenceProvider extends ADiscoverableReferenceProvider {
try {
$userFolder = $this->rootFolder->getUserFolder($this->userId);
$files = $userFolder->getById($fileId);
$file = array_shift($files);
$file = $userFolder->getFirstNodeById($fileId);
} catch (Exception $e) {
$this->logger->info('Failed to get file for office target reference: ' . $fileId, ['exception' => $e]);
return null;

View file

@ -162,9 +162,9 @@ class TemplateManager {
$templateDir = $this->getUserTemplateDir();
// finally get the template file
$files = $templateDir->getById($fileId);
if ($files !== []) {
return $files[0];
$file = $templateDir->getFirstNodeById($fileId);
if ($file !== null) {
return $file;
}
throw new NotFoundException();
@ -575,7 +575,7 @@ class TemplateManager {
} catch (NotFoundException $e) {
$userFolder = $this->rootFolder->getUserFolder($this->userId);
try {
$template = $userFolder->getById($templateId);
$template = $userFolder->getFirstNodeById($templateId);
} catch (NotFoundException $e) {
$this->logger->warning('Could not retrieve template source file', ['exception' => $e]);
return null;

View file

@ -154,7 +154,13 @@ class TokenManager {
}
}
/** @var File $file */
$file = $rootFolder->getById($fileId)[0];
$file = $rootFolder->getFirstNodeById($fileId);
// Check node readability (for storage wrapper overwrites like terms of services)
if ($file === null || !$file->isReadable()) {
throw new NotPermittedException();
}
// If its a public share, use the owner from the share, otherwise check the file object
if (is_null($owneruid)) {
$owner = $file->getOwner();
@ -166,11 +172,6 @@ class TokenManager {
}
}
// Check node readability (for storage wrapper overwrites like terms of services)
if (!$file->isReadable()) {
throw new NotPermittedException();
}
// Safeguard that users without required group permissions cannot create a token
if (!$this->permissionManager->isEnabledForUser($owneruid) && !$this->permissionManager->isEnabledForUser($editoruid)) {
throw new NotPermittedException();
@ -226,8 +227,7 @@ class TokenManager {
$owneruid = $userId;
$editoruid = $userId;
$rootFolder = $this->rootFolder->getUserFolder($editoruid);
$targetFile = $rootFolder->getById($targetFileId);
$targetFile = array_shift($targetFile);
$targetFile = $rootFolder->getFirstNodeById($targetFileId);
if (!$targetFile instanceof File) {
throw new NotFoundException();
}

View file

@ -1,12 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
- SPDX-FileCopyrightText: 2021 Nextcloud GmbH and Nextcloud contributors
- SPDX-License-Identifier: AGPL-3.0-or-later
-->
<files psalm-version="5.21.1@8c473e2437be8b6a8fd8f630f0f11a16b114c494">
<files psalm-version="5.24.0@462c80e31c34e58cc4f750c656be3927e80e550e">
<file src="lib/AppConfig.php">
<InvalidArgument>
<code>[]</code>
<code><![CDATA[[]]]></code>
</InvalidArgument>
<RedundantCondition>
<code><![CDATA[array_key_exists($key, self::APP_SETTING_TYPES) && self::APP_SETTING_TYPES[$key] === 'array']]></code>
@ -14,22 +10,22 @@
</file>
<file src="lib/Command/ActivateConfig.php">
<UndefinedClass>
<code>Command</code>
<code><![CDATA[Command]]></code>
</UndefinedClass>
</file>
<file src="lib/Command/ConvertToBigInt.php">
<UndefinedClass>
<code>Command</code>
<code><![CDATA[Command]]></code>
</UndefinedClass>
</file>
<file src="lib/Command/InstallDefaultFonts.php">
<UndefinedClass>
<code>Command</code>
<code><![CDATA[Command]]></code>
</UndefinedClass>
</file>
<file src="lib/Command/UpdateEmptyTemplates.php">
<UndefinedClass>
<code>Command</code>
<code><![CDATA[Command]]></code>
</UndefinedClass>
</file>
<file src="lib/Controller/DirectViewController.php">
@ -39,7 +35,7 @@
</file>
<file src="lib/Controller/DocumentAPIController.php">
<UndefinedClass>
<code>\OCA\Files\Helper</code>
<code><![CDATA[\OCA\Files\Helper]]></code>
</UndefinedClass>
</file>
<file src="lib/Controller/DocumentController.php">
@ -47,13 +43,13 @@
<code><![CDATA[$node->getId()]]></code>
</InvalidScalarArgument>
<RedundantCondition>
<code>$app !== ''</code>
<code><![CDATA[$app !== '']]></code>
</RedundantCondition>
</file>
<file src="lib/Controller/SettingsController.php">
<UndefinedClass>
<code>NullOutput</code>
<code>NullOutput</code>
<code><![CDATA[NullOutput]]></code>
<code><![CDATA[NullOutput]]></code>
</UndefinedClass>
</file>
<file src="lib/Controller/TemplatesController.php">
@ -61,27 +57,27 @@
<code><![CDATA[$this->fetchPreview($template, $x, $y, $a, $forceIcon, $mode)]]></code>
</InvalidReturnStatement>
<InvalidReturnType>
<code>DataResponse</code>
<code><![CDATA[DataResponse]]></code>
</InvalidReturnType>
<InvalidThrow>
<code>NotFoundResponse</code>
<code><![CDATA[NotFoundResponse]]></code>
</InvalidThrow>
</file>
<file src="lib/Controller/WopiController.php">
<NullArgument>
<code>null</code>
<code><![CDATA[null]]></code>
</NullArgument>
<TypeDoesNotContainType>
<code>$path === ''</code>
<code><![CDATA[$path === '']]></code>
</TypeDoesNotContainType>
<UndefinedInterfaceMethod>
<code>putContent</code>
<code>putContent</code>
<code><![CDATA[putContent]]></code>
<code><![CDATA[putContent]]></code>
</UndefinedInterfaceMethod>
</file>
<file src="lib/Helper.php">
<InvalidScalarArgument>
<code>$time</code>
<code><![CDATA[$time]]></code>
</InvalidScalarArgument>
</file>
<file src="lib/PermissionManager.php">
@ -91,7 +87,7 @@
</file>
<file src="lib/Preview/Office.php">
<MissingDependency>
<code>Image</code>
<code><![CDATA[Image]]></code>
</MissingDependency>
<UndefinedThisPropertyAssignment>
<code><![CDATA[$this->capabilitites]]></code>
@ -99,20 +95,20 @@
</file>
<file src="lib/Service/ConnectivityService.php">
<UndefinedClass>
<code>OutputInterface</code>
<code>OutputInterface</code>
<code><![CDATA[OutputInterface]]></code>
<code><![CDATA[OutputInterface]]></code>
</UndefinedClass>
</file>
<file src="lib/Service/FederationService.php">
<TypeDoesNotContainType>
<code>is_array($trustedList)</code>
<code><![CDATA[is_array($trustedList)]]></code>
</TypeDoesNotContainType>
<UndefinedClass>
<code>SharingExternalStorage</code>
<code><![CDATA[SharingExternalStorage]]></code>
</UndefinedClass>
<UndefinedInterfaceMethod>
<code>getRemote</code>
<code>getToken</code>
<code><![CDATA[getRemote]]></code>
<code><![CDATA[getToken]]></code>
</UndefinedInterfaceMethod>
</file>
<file src="lib/Template/CollaboraTemplateProvider.php">
@ -124,15 +120,7 @@
}, $collaboraTemplates)]]></code>
</InvalidReturnStatement>
<InvalidReturnType>
<code>array</code>
</InvalidReturnType>
</file>
<file src="lib/TemplateManager.php">
<InvalidReturnStatement>
<code>$template</code>
</InvalidReturnStatement>
<InvalidReturnType>
<code>?File</code>
<code><![CDATA[array]]></code>
</InvalidReturnType>
</file>
<file src="lib/WOPI/Parser.php">