1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
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';
10 export const mapManifestToCollectionFilesTree = (manifest: KeepManifest): CollectionFilesTree =>
11 manifestToCollectionFiles(manifest)
12 .map(mapCollectionFileToTreeNode)
13 .reduce((tree, node) => setNode(node)(tree), createTree<CollectionFile>());
16 export const mapCollectionFileToTreeNode = (file: CollectionFile): TreeNode<CollectionFile> => ({
19 parent: file.parentId,
23 export const manifestToCollectionFiles = (manifest: KeepManifest): Array<CollectionDirectory | CollectionFile> => ([
24 ...mapManifestToDirectories(manifest),
25 ...mapManifestToFiles(manifest)
28 export const mapManifestToDirectories = (manifest: KeepManifest): CollectionDirectory[] =>
31 .map(mapStreamDirectory)
33 .reduce((all, splitted) => ([...all, ...splitted]), []),
34 directory => directory.id);
36 export const mapManifestToFiles = (manifest: KeepManifest): CollectionFile[] =>
38 .map(stream => stream.files.map(mapStreamFile(stream)))
39 .reduce((all, current) => ([...all, ...current]), []);
41 const splitDirectory = (directory: CollectionDirectory): CollectionDirectory[] => {
45 .map(mapPathComponentToDirectory);
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),
55 const joinPathComponents = (components: string[], index: number) =>
56 `/${components.slice(0, index).join('/')}`;
58 const mapStreamDirectory = (stream: KeepManifestStream): CollectionDirectory =>
59 createCollectionDirectory({
65 const mapStreamFile = (stream: KeepManifestStream) =>
66 (file: KeepManifestStreamFile): CollectionFile =>
67 createCollectionFile({
68 parentId: stream.name,
69 id: `${stream.name}/${file.name}`,