1 // Copyright (C) The Arvados Authors. All rights reserved.
3 // SPDX-License-Identifier: AGPL-3.0
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 import { extractUuidObjectType, ResourceObjectType } from "~/models/resource";
10 import { GroupClass } from '~/models/group';
12 export type ResourcesState = { [key: string]: Resource };
14 const getResourceWritableBy = (state: ResourcesState, id: string, userUuid: string): string[] => {
19 if (id === userUuid) {
23 const resource = (state[id] as ProjectResource);
29 const { writableBy } = resource;
31 return writableBy || getResourceWritableBy(state, resource.ownerUuid, userUuid);
34 export const getResourceWithEditableStatus = <T extends EditableResource & GroupResource>(id: string, userUuid?: string) =>
35 (state: ResourcesState): T | undefined => {
36 if (state[id] === undefined) { return; }
38 const resource = JSON.parse(JSON.stringify(state[id] as T));
41 const objectType = extractUuidObjectType(resource.uuid);
43 case ResourceObjectType.GROUP:
44 // filter groups are read-only for now
45 if (resource.groupClass === GroupClass.FILTER) {
46 resource.isEditable = false;
50 resource.isEditable = userUuid ? getResourceWritableBy(state, id, userUuid).indexOf(userUuid) > -1 : false;
56 export const getResource = <T extends Resource = Resource>(id: string) =>
57 (state: ResourcesState): T | undefined =>
60 export const setResource = <T extends Resource>(id: string, data: T) =>
61 (state: ResourcesState) => ({
66 export const deleteResource = (id: string) =>
67 (state: ResourcesState) => {
68 const newState = { ...state };
73 export const filterResources = (filter: (resource: Resource) => boolean) =>
74 (state: ResourcesState) =>
77 .reduce((resources, id) => {
78 const resource = getResource(id)(state);
80 ? [...resources, resource]
85 export const filterResourcesByKind = (kind: ResourceKind) =>
86 (state: ResourcesState) =>
87 filterResources(resource => resource.kind === kind)(state);