[ARVADOS-WORKBENCH2] created: 1.2.0-605-g9e53e34

Git user git at public.curoverse.com
Thu Oct 11 11:12:03 EDT 2018


        at  9e53e34ec65cdd0934aa46465ff4ac758c013529 (commit)


commit 9e53e34ec65cdd0934aa46465ff4ac758c013529
Author: Michal Klobukowski <michal.klobukowski at contractors.roche.com>
Date:   Thu Oct 11 17:11:39 2018 +0200

    Make file ids unique, fix bad file download url
    
    Feature #13862
    
    Arvados-DCO-1.1-Signed-off-by: Michal Klobukowski <michal.klobukowski at contractors.roche.com>

diff --git a/src/services/collection-service/collection-service-files-response.ts b/src/services/collection-service/collection-service-files-response.ts
index b8a7970..a4b527a 100644
--- a/src/services/collection-service/collection-service-files-response.ts
+++ b/src/services/collection-service/collection-service-files-response.ts
@@ -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}`;
diff --git a/src/services/collection-service/collection-service.ts b/src/services/collection-service/collection-service.ts
index 138f16a..00ba854 100644
--- a/src/services/collection-service/collection-service.ts
+++ b/src/services/collection-service/collection-service.ts
@@ -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}`;
diff --git a/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts b/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts
index 0460c97..99ab682 100644
--- a/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts
+++ b/src/store/collection-panel/collection-panel-files/collection-panel-files-actions.ts
@@ -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' }));
+                }
             }
         }
     };

-----------------------------------------------------------------------


hooks/post-receive
-- 




More information about the arvados-commits mailing list