Make file ids unique, fix bad file download url
authorMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Thu, 11 Oct 2018 15:11:39 +0000 (17:11 +0200)
committerMichal Klobukowski <michal.klobukowski@contractors.roche.com>
Thu, 11 Oct 2018 15:11:39 +0000 (17:11 +0200)
Feature #13862

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

src/services/collection-service/collection-service-files-response.ts
src/services/collection-service/collection-service.ts
src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts

index b8a7970d58d4310d8228b8d0c80fb04188614810..a4b527a23ab4f1d442d2bd2840f6dc7085cc9970 100644 (file)
@@ -26,7 +26,7 @@ export const sortFilesTree = (tree: Tree<CollectionDirectory | CollectionFile>)
 };
 
 export const extractFilesData = (document: Document) => {
-    const collectionUrlPrefix = /\/c=[0-9a-zA-Z\-]*/;
+    const collectionUrlPrefix = /\/c=([0-9a-zA-Z\-]*)/;
     return Array
         .from(document.getElementsByTagName('D:response'))
         .slice(1) // omit first element which is collection itself
@@ -35,13 +35,20 @@ export const extractFilesData = (document: Document) => {
             const size = parseInt(getTagValue(element, 'D:getcontentlength', '0'), 10);
             const url = getTagValue(element, 'D:href', '');
             const nameSuffix = `/${name || ''}`;
+            const collectionUuidMatch = collectionUrlPrefix.exec(url);
+            const collectionUuid = collectionUuidMatch ? collectionUuidMatch.pop() : '';
             const directory = url
                 .replace(collectionUrlPrefix, '')
                 .replace(nameSuffix, '');
 
+
             const data = {
                 url,
-                id: `${directory}/${name}`,
+                id: [
+                    collectionUuid ? collectionUuid : '',
+                    directory ? '/' + directory : '',
+                    '/' + name
+                ].join(''),
                 name,
                 path: directory,
             };
@@ -52,3 +59,6 @@ export const extractFilesData = (document: Document) => {
 
         });
 };
+
+export const getFileFullPath = ({ name, path }: CollectionFile | CollectionDirectory) =>
+    `${path}/${name}`;
index 138f16a1fead15e23210a443908ef290ff8acb3f..00ba85478bedcac9665a64087b913e3ef3a11e5d 100644 (file)
@@ -50,10 +50,15 @@ export class CollectionService extends TrashableResourceService<CollectionResour
         );
     }
 
-    private extendFileURL = (file: CollectionDirectory | CollectionFile) => ({
-        ...file,
-        url: this.webdavClient.defaults.baseURL + file.url + '?api_token=' + this.authService.getApiToken()
-    })
+    private extendFileURL = (file: CollectionDirectory | CollectionFile) => {
+        const baseUrl = this.webdavClient.defaults.baseURL.endsWith('/')
+            ? this.webdavClient.defaults.baseURL.slice(0, -1)
+            : this.webdavClient.defaults.baseURL;
+        return {
+            ...file,
+            url: baseUrl + file.url + '?api_token=' + this.authService.getApiToken()
+        };
+    }
 
     private async uploadFile(collectionUuid: string, file: File, fileId: number, onProgress: UploadProgress = () => { return; }) {
         const fileURL = `c=${collectionUuid}/${file.name}`;
index 0460c977972059994e8d8b142bbbd528d388111d..99ab6829fa4ff66f96d715691479f34e0297432d 100644 (file)
@@ -13,6 +13,7 @@ import { getNodeValue } from "~/models/tree";
 import { filterCollectionFilesBySelection } from './collection-panel-files-state';
 import { startSubmit, stopSubmit, reset } from 'redux-form';
 import { getDialog } from "~/store/dialog/dialog-reducer";
+import { getFileFullPath } from "~/services/collection-service/collection-service-files-response";
 
 export const collectionPanelFilesAction = unionize({
     SET_COLLECTION_FILES: ofType<CollectionFilesTree>(),
@@ -43,7 +44,8 @@ export const removeCollectionFiles = (filePaths: string[]) =>
 
 export const removeCollectionsSelectedFiles = () =>
     (dispatch: Dispatch, getState: () => RootState) => {
-        const paths = filterCollectionFilesBySelection(getState().collectionPanelFiles, true).map(file => file.id);
+        const paths = filterCollectionFilesBySelection(getState().collectionPanelFiles, true)
+            .map(getFileFullPath);
         dispatch<any>(removeCollectionFiles(paths));
     };
 
@@ -101,16 +103,19 @@ export const renameFile = (newName: string) =>
         const dialog = getDialog<RenameFileDialogData>(getState().dialog, RENAME_FILE_DIALOG);
         const currentCollection = getState().collectionPanel.item;
         if (dialog && currentCollection) {
-            dispatch(startSubmit(RENAME_FILE_DIALOG));
-            const oldPath = dialog.data.id;
-            const newPath = dialog.data.id.replace(dialog.data.name, newName);
-            try {
-                await services.collectionService.moveFile(currentCollection.uuid, oldPath, newPath);
-                dispatch<any>(loadCollectionFiles(currentCollection.uuid));
-                dispatch(dialogActions.CLOSE_DIALOG({ id: RENAME_FILE_DIALOG }));
-                dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'File name changed.', hideDuration: 2000 }));
-            } catch (e) {
-                dispatch(stopSubmit(RENAME_FILE_DIALOG, { name: 'Could not rename the file' }));
+            const file = getNodeValue(dialog.data.id)(getState().collectionPanelFiles);
+            if (file) {
+                dispatch(startSubmit(RENAME_FILE_DIALOG));
+                const oldPath = getFileFullPath(file);
+                const newPath = getFileFullPath({ ...file, name: newName });
+                try {
+                    await services.collectionService.moveFile(currentCollection.uuid, oldPath, newPath);
+                    dispatch<any>(loadCollectionFiles(currentCollection.uuid));
+                    dispatch(dialogActions.CLOSE_DIALOG({ id: RENAME_FILE_DIALOG }));
+                    dispatch(snackbarActions.OPEN_SNACKBAR({ message: 'File name changed.', hideDuration: 2000 }));
+                } catch (e) {
+                    dispatch(stopSubmit(RENAME_FILE_DIALOG, { name: 'Could not rename the file' }));
+                }
             }
         }
     };