Use webdav to retrieve list of files
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Fri, 10 Aug 2018 07:18:56 +0000 (09:18 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Fri, 10 Aug 2018 07:18:56 +0000 (09:18 +0200)
Feature #13990

Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski@contractors.roche.com>

src/index.tsx
src/models/collection-file.ts
src/services/collection-service/collection-service.ts
src/store/collection-panel/collection-panel-action.ts

index 49cb06460de0bde23f25a3d02dbae745c7eedf7c..1296748b53ca9dc6cc258d33003e4f6477ae8f3e 100644 (file)
@@ -43,7 +43,6 @@ fetchConfig()
 
         store.dispatch(initAuth());
         store.dispatch(getProjectList(services.authService.getUuid()));
-        console.log(services.webdavClient);
         const TokenComponent = (props: any) => <ApiToken authService={services.authService} {...props}/>;
         const WorkbenchComponent = (props: any) => <Workbench authService={services.authService} {...props}/>;
 
index a4b656c51397c80bbd0319b73bf7f18d6d12323b..d74ada6008b982fe40daca7e601fbfbb99f1ea57 100644 (file)
@@ -2,7 +2,7 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { Tree } from './tree';
+import { Tree, createTree, setNode } from './tree';
 
 export type CollectionFilesTree = Tree<CollectionDirectory | CollectionFile>;
 
@@ -13,6 +13,7 @@ export enum CollectionFileType {
 
 export interface CollectionDirectory {
     path: string;
+    url: string;
     id: string;
     name: string;
     type: CollectionFileType.DIRECTORY;
@@ -20,6 +21,7 @@ export interface CollectionDirectory {
 
 export interface CollectionFile {
     path: string;
+    url: string;
     id: string;
     name: string;
     size: number;
@@ -34,6 +36,7 @@ export const createCollectionDirectory = (data: Partial<CollectionDirectory>): C
     id: '',
     name: '',
     path: '',
+    url: '',
     type: CollectionFileType.DIRECTORY,
     ...data
 });
@@ -42,7 +45,21 @@ export const createCollectionFile = (data: Partial<CollectionFile>): CollectionF
     id: '',
     name: '',
     path: '',
+    url: '',
     size: 0,
     type: CollectionFileType.FILE,
     ...data
 });
+
+export const createCollectionFilesTree = (data: Array<CollectionDirectory | CollectionFile>) => {
+    const directories = data.filter(item => item.type === CollectionFileType.DIRECTORY);
+    directories.sort((a, b) => a.path.localeCompare(b.path));
+    const files = data.filter(item => item.type === CollectionFileType.FILE);
+    return [...directories, ...files]
+        .reduce((tree, item) => setNode({
+            children: [],
+            id: item.id,
+            parent: item.path,
+            value: item
+        })(tree), createTree<CollectionDirectory | CollectionFile>());
+};
\ No newline at end of file
index c97307ea196f4e12c77461b81f4e6e1b2249f985..c23cb1e9bc5b69a0bd24c852bd60b3bfb3ea8120 100644 (file)
@@ -7,7 +7,7 @@ import { CollectionResource } from "../../models/collection";
 import axios, { AxiosInstance } from "axios";
 import { KeepService } from "../keep-service/keep-service";
 import { FilterBuilder } from "../../common/api/filter-builder";
-import { CollectionFile, createCollectionFile } from "../../models/collection-file";
+import { CollectionFile, createCollectionFile, createCollectionDirectory, createCollectionFilesTree } from "../../models/collection-file";
 import { parseKeepManifestText, stringifyKeepManifest } from "../collection-files-service/collection-manifest-parser";
 import * as _ from "lodash";
 import { KeepManifestStream } from "../../models/keep-manifest";
@@ -24,7 +24,7 @@ export class CollectionService extends CommonResourceService<CollectionResource>
     async files(uuid: string) {
         const request = await this.webdavClient.propfind(`/c=${uuid}`);
         if (request.responseXML != null) {
-            return this.extractFilesData(request.responseXML);
+            return createCollectionFilesTree(this.extractFilesData(request.responseXML));
         }
         return Promise.reject();
     }
@@ -32,16 +32,13 @@ export class CollectionService extends CommonResourceService<CollectionResource>
     extractFilesData(document: Document) {
         return Array
             .from(document.getElementsByTagName('D:response'))
-            .filter(element => {
-                const [resourceTypeElement] = Array.from(element.getElementsByTagName('D:resourcetype'));
-                return resourceTypeElement && resourceTypeElement.innerHTML === '';
-            })
+            .slice(1)
             .map(element => {
                 const [displayNameElement] = Array.from(element.getElementsByTagName('D:displayname'));
                 const name = displayNameElement ? displayNameElement.innerHTML : undefined;
 
                 const [sizeElement] = Array.from(element.getElementsByTagName('D:getcontentlength'));
-                const size = sizeElement ? sizeElement.innerHTML : undefined;
+                const size = sizeElement ? parseInt(sizeElement.innerHTML, 10) : 0;
 
                 const [hrefElement] = Array.from(element.getElementsByTagName('D:href'));
                 const pathname = hrefElement ? hrefElement.innerHTML : undefined;
@@ -49,16 +46,22 @@ export class CollectionService extends CommonResourceService<CollectionResource>
 
                 const href = this.webdavClient.defaults.baseUrl + pathname + '?api_token=' + this.authService.getApiToken();
 
-                return {
-                    directory,
-                    href,
+                const data = {
+                    url: href,
+                    id: `${directory}/${name}`,
                     name,
-                    size,
+                    path: directory,
                 };
 
+                const [resourceTypeElement] = Array.from(element.getElementsByTagName('D:resourcetype'));
+                return resourceTypeElement && resourceTypeElement.innerHTML === ''
+                    ? createCollectionFile({ ...data, size })
+                    : createCollectionDirectory(data);
+
             });
     }
 
+
     private readFile(file: File): Promise<ArrayBuffer> {
         return new Promise<ArrayBuffer>(resolve => {
             const reader = new FileReader();
index 5fe09fbc03322bb647aa624e470efbecd382081d..e1b3a376e32cbb56173b9159cc94e0f5cd8f0f1f 100644 (file)
@@ -36,8 +36,7 @@ export const loadCollection = (uuid: string, kind: ResourceKind) =>
             .get(uuid)
             .then(item => {
                 dispatch(collectionPanelActions.LOAD_COLLECTION_SUCCESS({ item }));
-                services.collectionService.files(item.uuid).then(console.log);
-                return services.collectionFilesService.getFiles(item.uuid);
+                return services.collectionService.files(item.uuid);
             })
             .then(files => {
                 dispatch(collectionPanelFilesAction.SET_COLLECTION_FILES(files));