diff options
author | Ferdinand Thiessen <opensource@fthiessen.de> | 2024-08-02 19:47:55 +0200 |
---|---|---|
committer | Ferdinand Thiessen <opensource@fthiessen.de> | 2024-08-05 14:02:57 +0200 |
commit | 55d77fec057bb1deabef1200c5c0c803feaa046a (patch) | |
tree | 8026a3c31cf5854c1c27ac2be14af0ed44fc12aa /apps/files_trashbin/src | |
parent | b5cd64e584ca9c91a11df204f3c040fdd2057a13 (diff) | |
download | nextcloud-server-55d77fec057bb1deabef1200c5c0c803feaa046a.tar.gz nextcloud-server-55d77fec057bb1deabef1200c5c0c803feaa046a.zip |
perf(files_trashbin): Only trigger one PROPFIND for trashbin view
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
Diffstat (limited to 'apps/files_trashbin/src')
-rw-r--r-- | apps/files_trashbin/src/services/client.ts | 23 | ||||
-rw-r--r-- | apps/files_trashbin/src/services/trashbin.ts | 59 |
2 files changed, 17 insertions, 65 deletions
diff --git a/apps/files_trashbin/src/services/client.ts b/apps/files_trashbin/src/services/client.ts index 7c842858ae4..5ee25a6a94f 100644 --- a/apps/files_trashbin/src/services/client.ts +++ b/apps/files_trashbin/src/services/client.ts @@ -3,27 +3,10 @@ * SPDX-License-Identifier: AGPL-3.0-or-later */ -import { createClient } from 'webdav' -import { generateRemoteUrl } from '@nextcloud/router' -import { getCurrentUser, getRequestToken, onRequestTokenUpdate } from '@nextcloud/auth' +import { getCurrentUser } from '@nextcloud/auth' +import { davGetClient } from '@nextcloud/files' // init webdav client export const rootPath = `/trashbin/${getCurrentUser()?.uid}/trash` -export const rootUrl = generateRemoteUrl('dav' + rootPath) -const client = createClient(rootUrl) -// set CSRF token header -const setHeaders = (token: string | null) => { - client.setHeaders({ - // Add this so the server knows it is an request from the browser - 'X-Requested-With': 'XMLHttpRequest', - // Inject user auth - requesttoken: token ?? '', - }) -} - -// refresh headers when request token changes -onRequestTokenUpdate(setHeaders) -setHeaders(getRequestToken()) - -export default client +export const client = davGetClient() diff --git a/apps/files_trashbin/src/services/trashbin.ts b/apps/files_trashbin/src/services/trashbin.ts index 1f9f66140ae..e0ad894d1fe 100644 --- a/apps/files_trashbin/src/services/trashbin.ts +++ b/apps/files_trashbin/src/services/trashbin.ts @@ -5,16 +5,13 @@ import type { FileStat, ResponseDataDetailed } from 'webdav' import type { ContentsWithRoot } from '@nextcloud/files' -import { File, Folder, davParsePermissions, getDavNameSpaces, getDavProperties } from '@nextcloud/files' -import { generateRemoteUrl, generateUrl } from '@nextcloud/router' -import { getCurrentUser } from '@nextcloud/auth' - -import client, { rootPath } from './client' +import { File, Folder, davResultToNode, getDavNameSpaces, getDavProperties } from '@nextcloud/files' +import { client, rootPath } from './client' +import { generateUrl } from '@nextcloud/router' const data = `<?xml version="1.0"?> <d:propfind ${getDavNameSpaces()}> <d:prop> - <nc:trashbin-filename /> <nc:trashbin-deletion-time /> <nc:trashbin-original-location /> <nc:trashbin-title /> @@ -24,52 +21,24 @@ const data = `<?xml version="1.0"?> </d:prop> </d:propfind>` -const resultToNode = function(node: FileStat): File | Folder { - const permissions = davParsePermissions(node.props?.permissions) - const owner = getCurrentUser()?.uid as string - const previewUrl = generateUrl('/apps/files_trashbin/preview?fileId={fileid}&x=32&y=32', node.props) - - const nodeData = { - id: node.props?.fileid as number || 0, - source: generateRemoteUrl('dav' + rootPath + node.filename), - // do not show the mtime column - // mtime: new Date(node.lastmod), - mime: node.mime as string, - size: node.props?.size as number || 0, - permissions, - owner, - root: rootPath, - attributes: { - ...node, - ...node.props, - // Override displayed name on the list - displayName: node.props?.['trashbin-filename'], - previewUrl, - }, - } - - delete nodeData.attributes.props - - return node.type === 'file' - ? new File(nodeData) - : new Folder(nodeData) +const resultToNode = (stat: FileStat): File | Folder => { + const node = davResultToNode(stat, rootPath) + node.attributes.previewUrl = generateUrl('/apps/files_trashbin/preview?fileId={fileid}&x=32&y=32', { fileid: node.fileid }) + return node } export const getContents = async (path = '/'): Promise<ContentsWithRoot> => { - // TODO: use only one request when webdav-client supports it - // @see https://github.com/perry-mitchell/webdav-client/pull/334 - const rootResponse = await client.stat(path, { - details: true, - data, - }) as ResponseDataDetailed<FileStat> - - const contentsResponse = await client.getDirectoryContents(path, { + const contentsResponse = await client.getDirectoryContents(`${rootPath}${path}`, { details: true, data, + includeSelf: true, }) as ResponseDataDetailed<FileStat[]> + const contents = contentsResponse.data.map(resultToNode) + const [folder] = contents.splice(contents.findIndex((node) => node.dirname === path), 1) + return { - folder: resultToNode(rootResponse.data) as Folder, - contents: contentsResponse.data.map(resultToNode), + folder: folder as Folder, + contents, } } |