Merge branch 'main' into 15768-multi-select-operations Arvados-DCO-1.1-Signed-off...
[arvados-workbench2.git] / src / store / resources / resources.ts
1 // Copyright (C) The Arvados Authors. All rights reserved.
2 //
3 // SPDX-License-Identifier: AGPL-3.0
4
5 import { Resource, EditableResource } from "models/resource";
6 import { ResourceKind } from 'models/resource';
7 import { ProjectResource } from "models/project";
8 import { GroupResource } from "models/group";
9
10 export type ResourcesState = { [key: string]: Resource };
11
12 export const getResourceWithEditableStatus = <T extends GroupResource & EditableResource>(id: string, userUuid?: string) =>
13     (state: ResourcesState): T | undefined => {
14         if (state[id] === undefined) { return; }
15
16         const resource = JSON.parse(JSON.stringify(state[id])) as T;
17
18         if (resource) {
19             if (resource.canWrite === undefined) {
20                 resource.isEditable = (state[resource.ownerUuid] as GroupResource)?.canWrite;
21             } else {
22                 resource.isEditable = resource.canWrite;
23             }
24         }
25
26         return resource;
27     };
28
29 export const getResource = <T extends Resource = Resource>(id: string) =>
30     (state: ResourcesState): T | undefined =>
31         state[id] as T;
32
33 export const setResource = <T extends Resource>(id: string, data: T) =>
34     (state: ResourcesState) => ({
35         ...state,
36         [id]: data
37     });
38
39 export const deleteResource = (id: string) =>
40     (state: ResourcesState) => {
41         const newState = { ...state };
42         delete newState[id];
43         return newState;
44     };
45
46 export const filterResources = (filter: (resource: Resource) => boolean) =>
47     (state: ResourcesState) =>
48         Object
49             .keys(state)
50             .reduce((resources, id) => {
51                 const resource = getResource(id)(state);
52                 return resource
53                     ? [...resources, resource]
54                     : resources;
55             }, [])
56             .filter(filter);
57
58 export const filterResourcesByKind = (kind: ResourceKind) =>
59     (state: ResourcesState) =>
60         filterResources(resource => resource.kind === kind)(state);