//
// 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) =>
+const getResourceWritableBy = (state: ResourcesState, id: string, userUuid: string): string[] => {
+ if (!id) {
+ return [];
+ }
+
+ if (id === userUuid) {
+ return [userUuid];
+ }
+
+ const resource = (state[id] as ProjectResource);
+
+ if (!resource) {
+ return [];
+ }
+
+ const { writableBy } = resource;
+
+ return writableBy || getResourceWritableBy(state, resource.ownerUuid, userUuid);
+};
+
+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 = userUuid ? getResourceWritableBy(state, id, userUuid).indexOf(userUuid) > -1 : false;
+ }
+
+ 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
return newState;
};
-export const filterResources = (filter: (resource: ResourceTypes) => boolean) =>
+export const filterResources = (filter: (resource: Resource) => boolean) =>
(state: ResourcesState) =>
Object
.keys(state)