From 3085d384527ef92a4bc68776010107101f59f254 Mon Sep 17 00:00:00 2001 From: Paul Neubauer Date: Thu, 3 Nov 2022 12:58:56 +0100 Subject: [PATCH] [full-ci] Refactor webdav listFiles (#7880) * Refactor Webdav listFiles Co-authored-by: Benedikt Kulmann --- .../unreleased/enhancement-webdav-client | 1 + .../src/helpers/resource/actions/transfer.ts | 7 +++--- .../src/mixins/actions/rename.ts | 9 ++++--- .../src/mixins/actions/restore.ts | 9 ++++--- .../src/services/folder/loaderSpace.ts | 6 +++-- .../resource/resourcesTransfer.spec.ts | 7 +++++- .../tests/unit/mixins/actions/restore.spec.js | 2 +- packages/web-client/src/webdav/getFileInfo.ts | 2 +- packages/web-client/src/webdav/listFiles.ts | 25 +++++++++++-------- .../appDefaults/useAppFolderHandling.ts | 21 ++++++---------- 10 files changed, 48 insertions(+), 41 deletions(-) diff --git a/changelog/unreleased/enhancement-webdav-client b/changelog/unreleased/enhancement-webdav-client index d9bb9d7dfdf..a69cbfcfe9a 100644 --- a/changelog/unreleased/enhancement-webdav-client +++ b/changelog/unreleased/enhancement-webdav-client @@ -5,3 +5,4 @@ We've added webdav support to the `web-client` package. This wraps the existing handles the differentiation of public link and user-specific webdav requests internally. https://github.com/owncloud/web/pull/7430 +https://github.com/owncloud/web/pull/7880 \ No newline at end of file diff --git a/packages/web-app-files/src/helpers/resource/actions/transfer.ts b/packages/web-app-files/src/helpers/resource/actions/transfer.ts index 30db3eb9bb0..7c238a5171c 100644 --- a/packages/web-app-files/src/helpers/resource/actions/transfer.ts +++ b/packages/web-app-files/src/helpers/resource/actions/transfer.ts @@ -107,10 +107,9 @@ export class ResourceTransfer extends ConflictDialog { } const errors = [] - const targetFolderResources = await this.clientService.webdav.listFiles( - this.targetSpace, - this.targetFolder - ) + const targetFolderResources = ( + await this.clientService.webdav.listFiles(this.targetSpace, this.targetFolder) + ).children const resolvedConflicts = await this.resolveAllConflicts( this.resourcesToMove, diff --git a/packages/web-app-files/src/mixins/actions/rename.ts b/packages/web-app-files/src/mixins/actions/rename.ts index 7e37d59df80..61a2a47aad5 100644 --- a/packages/web-app-files/src/mixins/actions/rename.ts +++ b/packages/web-app-files/src/mixins/actions/rename.ts @@ -73,10 +73,11 @@ export default { let parentResources if (isSameResource(resources[0], this.currentFolder)) { const parentPath = dirname(this.currentFolder.path) - parentResources = await (this.$clientService.webdav as WebDAV).listFiles( - space || this.space, - { path: parentPath } - ) + parentResources = ( + await (this.$clientService.webdav as WebDAV).listFiles(space || this.space, { + path: parentPath + }) + ).children } const confirmAction = (newName) => { diff --git a/packages/web-app-files/src/mixins/actions/restore.ts b/packages/web-app-files/src/mixins/actions/restore.ts index 99c7e7c1bad..cd9ede50b69 100644 --- a/packages/web-app-files/src/mixins/actions/restore.ts +++ b/packages/web-app-files/src/mixins/actions/restore.ts @@ -68,10 +68,11 @@ export default { existingResources = existingResourcesCache[parentPath] } else { try { - existingResources = await this.$clientService.webdav.listFiles(this.space, { - path: parentPath - }) - existingResources = existingResources.slice(1) + existingResources = ( + await this.$clientService.webdav.listFiles(this.space, { + path: parentPath + }) + ).children } catch (error) { missingFolderPaths.push(parentPath) } diff --git a/packages/web-app-files/src/services/folder/loaderSpace.ts b/packages/web-app-files/src/services/folder/loaderSpace.ts index a8a9d91525f..79d600d145b 100644 --- a/packages/web-app-files/src/services/folder/loaderSpace.ts +++ b/packages/web-app-files/src/services/folder/loaderSpace.ts @@ -53,8 +53,10 @@ export class FolderLoaderSpace implements FolderLoader { try { store.commit('Files/CLEAR_CURRENT_FILES_LIST') - const resources = yield webdav.listFiles(space, { path, fileId }) - let currentFolder = resources.shift() + let { resource: currentFolder, children: resources } = yield webdav.listFiles(space, { + path, + fileId + }) replaceInvalidFileRoute({ space, resource: currentFolder, path, fileId }) if (path === '/') { diff --git a/packages/web-app-files/tests/unit/helpers/resource/resourcesTransfer.spec.ts b/packages/web-app-files/tests/unit/helpers/resource/resourcesTransfer.spec.ts index 7548c34e565..14db9ef0833 100644 --- a/packages/web-app-files/tests/unit/helpers/resource/resourcesTransfer.spec.ts +++ b/packages/web-app-files/tests/unit/helpers/resource/resourcesTransfer.spec.ts @@ -7,6 +7,7 @@ import { } from '../../../../src/helpers/resource' import { mockDeep, mockReset } from 'jest-mock-extended' import { buildSpace, Resource } from 'web-client/src/helpers' +import { ListFilesResult } from 'web-client/src/webdav/listFiles' const clientServiceMock = mockDeep() let resourcesToMove @@ -74,8 +75,12 @@ describe('resourcesTransfer', () => { it.each([TransferType.COPY, TransferType.MOVE])( 'should copy / move files without renaming them if no conflicts exist', async (action: TransferType) => { + const listFilesResult: ListFilesResult = { + resource: {} as Resource, + children: [] + } clientServiceMock.webdav.listFiles.mockReturnValueOnce( - new Promise((resolve) => resolve([] as Resource[])) + new Promise((resolve) => resolve(listFilesResult)) ) const resourcesTransfer = new ResourceTransfer( sourceSpace, diff --git a/packages/web-app-files/tests/unit/mixins/actions/restore.spec.js b/packages/web-app-files/tests/unit/mixins/actions/restore.spec.js index 077beb4fce3..45aa5772c74 100644 --- a/packages/web-app-files/tests/unit/mixins/actions/restore.spec.js +++ b/packages/web-app-files/tests/unit/mixins/actions/restore.spec.js @@ -117,7 +117,7 @@ function getWrapper({ $clientService: { webdav: { listFiles: jest.fn().mockImplementation(() => { - return [] + return { resource: {}, children: [] } }), restoreFile: jest.fn().mockImplementation(() => { if (resolveRestore) { diff --git a/packages/web-client/src/webdav/getFileInfo.ts b/packages/web-client/src/webdav/getFileInfo.ts index c3354740f76..53712b76cbe 100644 --- a/packages/web-client/src/webdav/getFileInfo.ts +++ b/packages/web-client/src/webdav/getFileInfo.ts @@ -17,7 +17,7 @@ export const GetFileInfoFactory = ( depth: 0, ...options }) - )[0] + ).resource } } } diff --git a/packages/web-client/src/webdav/listFiles.ts b/packages/web-client/src/webdav/listFiles.ts index 3c52c5c5056..6c4025089a7 100644 --- a/packages/web-client/src/webdav/listFiles.ts +++ b/packages/web-client/src/webdav/listFiles.ts @@ -1,11 +1,6 @@ -import { buildResource } from '../helpers/resource' +import { buildResource, Resource } from '../helpers/resource' import { DavProperties, DavProperty } from './constants' -import { - buildPublicSpaceResource, - isPublicSpaceResource, - Resource, - SpaceResource -} from '../helpers' +import { buildPublicSpaceResource, isPublicSpaceResource, SpaceResource } from '../helpers' import { WebDavOptions } from './types' import { urlJoin } from '../utils' @@ -20,7 +15,7 @@ export const ListFilesFactory = ({ sdk }: WebDavOptions) => { space: SpaceResource, { path, fileId }: { path?: string; fileId?: string | number } = {}, { depth = 1, davProperties }: ListFilesOptions = {} - ): Promise { + ): Promise { let webDavResources: any[] if (isPublicSpaceResource(space)) { webDavResources = await sdk.publicFiles.list( @@ -44,9 +39,13 @@ export const ListFilesFactory = ({ sdk }: WebDavOptions) => { }) if (!path) { const [rootFolder, ...children] = webDavResources - return [buildPublicSpaceResource(rootFolder), ...children.map(buildResource)] + return { + resource: buildPublicSpaceResource(rootFolder), + children: children.map(buildResource) + } as ListFilesResult } - return webDavResources.map(buildResource) + const resources = webDavResources.map(buildResource) + return { resource: resources[0], children: resources.slice(1) } as ListFilesResult } const listFilesCorrectedPath = async () => { @@ -64,7 +63,7 @@ export const ListFilesFactory = ({ sdk }: WebDavOptions) => { if (fileId && fileId !== resources[0].fileId) { return listFilesCorrectedPath() } - return resources + return { resource: resources[0], children: resources.slice(1) } as ListFilesResult } catch (e) { if (e.statusCode === 404 && fileId) { return listFilesCorrectedPath() @@ -74,3 +73,7 @@ export const ListFilesFactory = ({ sdk }: WebDavOptions) => { } } } +export interface ListFilesResult { + resource: Resource + children?: Resource[] +} diff --git a/packages/web-pkg/src/composables/appDefaults/useAppFolderHandling.ts b/packages/web-pkg/src/composables/appDefaults/useAppFolderHandling.ts index 7b04a33c83e..785495b1b1b 100644 --- a/packages/web-pkg/src/composables/appDefaults/useAppFolderHandling.ts +++ b/packages/web-pkg/src/composables/appDefaults/useAppFolderHandling.ts @@ -1,17 +1,12 @@ import { Store } from 'vuex' import { computed, Ref, ref, unref } from '@vue/composition-api' import { dirname } from 'path' - -import { ClientService } from '../../services' -import { MaybeRef } from '../../utils' - +import { ClientService, MaybeRef, useAppFileHandling } from 'web-pkg' import { Resource } from 'web-client' - import { FileContext } from './types' import { Route } from 'vue-router' -import { useAppFileHandling } from './useAppFileHandling' import { useFileRouteReplace } from '../router/useFileRouteReplace' -import { DavProperty } from '../../../../web-client/src/webdav/constants' +import { DavProperty } from 'web-client/src/webdav/constants' import { useAuthService } from '../authContext/useAuthService' interface AppFolderHandlingOptions { @@ -63,19 +58,19 @@ export function useAppFolderHandling({ }) const path = dirname(pathResource.path) - const resources = await webdav.listFiles(space, { + const { resource, children } = await webdav.listFiles(space, { path }) - if (resources[0].type === 'file') { + if (resource.type === 'file') { store.commit('Files/LOAD_FILES', { - currentFolder: resources[0], - files: [resources[0]] + currentFolder: resource, + files: [resource] }) } else { store.commit('Files/LOAD_FILES', { - currentFolder: resources[0], - files: resources.slice(1) + currentFolder: resource, + files: children }) } } catch (error) {