20829: Check parent for editable status
[arvados.git] / src / store / resources / resources.ts
index 4fec02a5d5b9af8ed3b179dcb6f0aad727143093..3f71140497f7c5df566ef096fb75afc23afcbe0f 100644 (file)
@@ -2,16 +2,36 @@
 //
 // SPDX-License-Identifier: AGPL-3.0
 
-import { ResourceTypes } from "~/models/resource";
-import { ResourceKind } from '~/models/resource';
+import { Resource, EditableResource } from "models/resource";
+import { ResourceKind } from 'models/resource';
+import { ProjectResource } from "models/project";
+import { GroupResource } from "models/group";
 
-export type ResourcesState = { [key: string]: ResourceTypes };
+export type ResourcesState = { [key: string]: Resource };
 
-export const getResource = <T extends ResourceTypes = ResourceTypes>(id: string) =>
+export const getResourceWithEditableStatus = <T extends EditableResource & GroupResource>(id: string, userUuid?: string) =>
+    (state: ResourcesState): T | undefined => {
+        if (state[id] === undefined) { return; }
+
+        const resource = JSON.parse(JSON.stringify(state[id] as T));
+
+        if (resource) {
+            resource.isEditable = resource.canWrite;
+
+            if (!resource.isEditable && state[resource.ownerUuid]) {
+                const resourceOwner = JSON.parse(JSON.stringify(state[resource.ownerUuid] as T));
+                resource.isEditable = resourceOwner.canWrite;
+            }
+        }
+
+        return resource;
+    };
+
+export const getResource = <T extends Resource = Resource>(id: string) =>
     (state: ResourcesState): T | undefined =>
         state[id] as T;
 
-export const setResource = <T extends ResourceTypes>(id: string, data: T) =>
+export const setResource = <T extends Resource>(id: string, data: T) =>
     (state: ResourcesState) => ({
         ...state,
         [id]: data
@@ -24,7 +44,7 @@ export const deleteResource = (id: string) =>
         return newState;
     };
 
-export const filterResources = (filter: (resource: ResourceTypes) => boolean) =>
+export const filterResources = (filter: (resource: Resource) => boolean) =>
     (state: ResourcesState) =>
         Object
             .keys(state)