refs #13989 Merge branch 'origin/13989-webdav-service'
[arvados-workbench2.git] / src / services / collection-files-service / collection-manifest-mapper.ts
index c2a8ae8e138050789cfde7fb6af258699cb8e3dc..c3fd43ead1d0d4c013e066f0331712710af9f38f 100644 (file)
@@ -2,10 +2,23 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { uniqBy } from 'lodash';
-import { KeepManifestStream, KeepManifestStreamFile, KeepManifest } from "../../models/keep-manifest";
-import { TreeNode, setNode, createTree } from '../../models/tree';
-import { CollectionFilesTree, CollectionFile, CollectionDirectory, createCollectionDirectory, createCollectionFile } from '../../models/collection-file';
+import { uniqBy, groupBy } from 'lodash';
+import { KeepManifestStream, KeepManifestStreamFile, KeepManifest } from "~/models/keep-manifest";
+import { TreeNode, setNode, createTree, getNodeDescendants, getNodeValue } from '~/models/tree';
+import { CollectionFilesTree, CollectionFile, CollectionDirectory, createCollectionDirectory, createCollectionFile, CollectionFileType } from '../../models/collection-file';
+
+export const mapCollectionFilesTreeToManifest = (tree: CollectionFilesTree): KeepManifest => {
+    const values = getNodeDescendants('')(tree).map(id => getNodeValue(id)(tree));
+    const files = values.filter(value => value && value.type === CollectionFileType.FILE) as CollectionFile[];
+    const fileGroups = groupBy(files, file => file.path);
+    return Object
+        .keys(fileGroups)
+        .map(dirName => ({
+            name: dirName,
+            locators: [],
+            files: fileGroups[dirName].map(mapCollectionFile)
+        }));
+};
 
 export const mapManifestToCollectionFilesTree = (manifest: KeepManifest): CollectionFilesTree =>
     manifestToCollectionFiles(manifest)
@@ -16,7 +29,7 @@ export const mapManifestToCollectionFilesTree = (manifest: KeepManifest): Collec
 export const mapCollectionFileToTreeNode = (file: CollectionFile): TreeNode<CollectionFile> => ({
     children: [],
     id: file.id,
-    parent: file.parentId,
+    parent: file.path,
     value: file
 });
 
@@ -47,7 +60,7 @@ const splitDirectory = (directory: CollectionDirectory): CollectionDirectory[] =
 
 const mapPathComponentToDirectory = (component: string, index: number, components: string[]): CollectionDirectory =>
     createCollectionDirectory({
-        parentId: index === 0 ? '' : joinPathComponents(components, index),
+        path: index === 0 ? '' : joinPathComponents(components, index),
         id: joinPathComponents(components, index + 1),
         name: component,
     });
@@ -55,9 +68,15 @@ const mapPathComponentToDirectory = (component: string, index: number, component
 const joinPathComponents = (components: string[], index: number) =>
     `/${components.slice(0, index).join('/')}`;
 
+const mapCollectionFile = (file: CollectionFile): KeepManifestStreamFile => ({
+    name: file.name,
+    position: '',
+    size: file.size
+});
+
 const mapStreamDirectory = (stream: KeepManifestStream): CollectionDirectory =>
     createCollectionDirectory({
-        parentId: '',
+        path: '',
         id: stream.name,
         name: stream.name,
     });
@@ -65,7 +84,7 @@ const mapStreamDirectory = (stream: KeepManifestStream): CollectionDirectory =>
 const mapStreamFile = (stream: KeepManifestStream) =>
     (file: KeepManifestStreamFile): CollectionFile =>
         createCollectionFile({
-            parentId: stream.name,
+            path: stream.name,
             id: `${stream.name}/${file.name}`,
             name: file.name,
             size: file.size,