Merge branch 'master' into 13905-restoring-correct-tree-state-and-panel-item-highligh...
[arvados.git] / src / services / collection-files-service / collection-manifest-mapper.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { uniqBy } from 'lodash';
6 import { KeepManifestStream, KeepManifestStreamFile, KeepManifest } from "../../models/keep-manifest";
7 import { TreeNode, setNode, createTree } from '../../models/tree';
8 import { CollectionFilesTree, CollectionFile, CollectionDirectory, createCollectionDirectory, createCollectionFile } from '../../models/collection-file';
9
10 export const mapManifestToCollectionFilesTree = (manifest: KeepManifest): CollectionFilesTree =>
11     manifestToCollectionFiles(manifest)
12         .map(mapCollectionFileToTreeNode)
13         .reduce((tree, node) => setNode(node)(tree), createTree<CollectionFile>());
14
15
16 export const mapCollectionFileToTreeNode = (file: CollectionFile): TreeNode<CollectionFile> => ({
17     children: [],
18     id: file.id,
19     parent: file.parentId,
20     value: file
21 });
22
23 export const manifestToCollectionFiles = (manifest: KeepManifest): Array<CollectionDirectory | CollectionFile> => ([
24     ...mapManifestToDirectories(manifest),
25     ...mapManifestToFiles(manifest)
26 ]);
27
28 export const mapManifestToDirectories = (manifest: KeepManifest): CollectionDirectory[] =>
29     uniqBy(
30         manifest
31             .map(mapStreamDirectory)
32             .map(splitDirectory)
33             .reduce((all, splitted) => ([...all, ...splitted]), []),
34         directory => directory.id);
35
36 export const mapManifestToFiles = (manifest: KeepManifest): CollectionFile[] =>
37     manifest
38         .map(stream => stream.files.map(mapStreamFile(stream)))
39         .reduce((all, current) => ([...all, ...current]), []);
40
41 const splitDirectory = (directory: CollectionDirectory): CollectionDirectory[] => {
42     return directory.name
43         .split('/')
44         .slice(1)
45         .map(mapPathComponentToDirectory);
46 };
47
48 const mapPathComponentToDirectory = (component: string, index: number, components: string[]): CollectionDirectory =>
49     createCollectionDirectory({
50         parentId: index === 0 ? '' : joinPathComponents(components, index),
51         id: joinPathComponents(components, index + 1),
52         name: component,
53     });
54
55 const joinPathComponents = (components: string[], index: number) =>
56     `/${components.slice(0, index).join('/')}`;
57
58 const mapStreamDirectory = (stream: KeepManifestStream): CollectionDirectory =>
59     createCollectionDirectory({
60         parentId: '',
61         id: stream.name,
62         name: stream.name,
63     });
64
65 const mapStreamFile = (stream: KeepManifestStream) =>
66     (file: KeepManifestStreamFile): CollectionFile =>
67         createCollectionFile({
68             parentId: stream.name,
69             id: `${stream.name}/${file.name}`,
70             name: file.name,
71             size: file.size,
72         });
73