]> source.dussan.org Git - nextcloud-server.git/commitdiff
perf(files_trashbin): Only trigger one PROPFIND for trashbin view
authorFerdinand Thiessen <opensource@fthiessen.de>
Fri, 2 Aug 2024 17:47:55 +0000 (19:47 +0200)
committerFerdinand Thiessen <opensource@fthiessen.de>
Mon, 5 Aug 2024 12:02:57 +0000 (14:02 +0200)
Signed-off-by: Ferdinand Thiessen <opensource@fthiessen.de>
apps/files_trashbin/src/services/client.ts
apps/files_trashbin/src/services/trashbin.ts

index 7c842858ae4019bc4404bcdd4447e7e5122fc03e..5ee25a6a94f47cc880e5f23680f4ddbc9203d71e 100644 (file)
@@ -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()
index 1f9f66140ae376352d63eb09ecab835b378e2f65..e0ad894d1fe92408320f05325608d611ec17b945 100644 (file)
@@ -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,
        }
 }