Skip to content

Commit 03acfe9

Browse files
wanglamHailong-am
authored andcommitted
Feat remove management permission mode in acl permission (opensearch-project#195)
* feat: remove management permission mode and clearify library permission mode usage Signed-off-by: Lin Wang <[email protected]> * address PR comments and add annotations Signed-off-by: Lin Wang <[email protected]> --------- Signed-off-by: Lin Wang <[email protected]>
1 parent 4cad0d5 commit 03acfe9

File tree

6 files changed

+147
-124
lines changed

6 files changed

+147
-124
lines changed

src/core/utils/constants.ts

-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ export const WORKSPACE_PATH_PREFIX = '/w';
1010
export enum WorkspacePermissionMode {
1111
Read = 'read',
1212
Write = 'write',
13-
Management = 'management',
1413
LibraryRead = 'library_read',
1514
LibraryWrite = 'library_write',
1615
}

src/plugins/workspace/public/components/workspace_creator/workspace_permission_setting_panel.tsx

+97-64
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6-
import React, { useCallback, useMemo, useRef } from 'react';
6+
import React, { useCallback, useMemo } from 'react';
77
import {
88
EuiDescribedFormGroup,
99
EuiFlexGroup,
@@ -25,57 +25,61 @@ export type WorkspacePermissionSetting = (
2525
type: 'user' | 'group';
2626
userId?: string;
2727
group?: string;
28-
modes: Array<
29-
| WorkspacePermissionMode.LibraryRead
30-
| WorkspacePermissionMode.LibraryWrite
31-
| WorkspacePermissionMode.Management
32-
>;
28+
modes: WorkspacePermissionMode[];
3329
};
3430

31+
enum PermissionModeId {
32+
Read = 'read',
33+
ReadAndWrite = 'read+write',
34+
Admin = 'admin',
35+
}
36+
3537
const permissionModeOptions = [
3638
{
37-
id: WorkspacePermissionMode.LibraryRead,
38-
label: 'View',
39+
id: PermissionModeId.Read,
40+
label: 'Read',
3941
iconType: 'eye',
4042
},
4143
{
42-
id: WorkspacePermissionMode.LibraryWrite,
43-
label: 'Edit',
44+
id: PermissionModeId.ReadAndWrite,
45+
label: 'Read + Write',
4446
iconType: 'pencil',
4547
},
4648
{
47-
id: WorkspacePermissionMode.Management,
49+
id: PermissionModeId.Admin,
4850
label: 'Management',
4951
iconType: 'visTimelion',
5052
},
5153
];
5254

55+
const optionIdToWorkspacePermissionModesMap: {
56+
[key: string]: WorkspacePermissionMode[];
57+
} = {
58+
[PermissionModeId.Read]: [WorkspacePermissionMode.LibraryRead, WorkspacePermissionMode.Read],
59+
[PermissionModeId.ReadAndWrite]: [
60+
WorkspacePermissionMode.LibraryWrite,
61+
WorkspacePermissionMode.Read,
62+
],
63+
[PermissionModeId.Admin]: [WorkspacePermissionMode.LibraryWrite, WorkspacePermissionMode.Write],
64+
};
65+
5366
const permissionTypeOptions = [
5467
{ value: 'user' as const, inputDisplay: 'User' },
5568
{ value: 'group' as const, inputDisplay: 'Group' },
5669
];
5770

58-
const isWorkspacePermissionMode = (
59-
test: string
60-
): test is
61-
| WorkspacePermissionMode.LibraryRead
62-
| WorkspacePermissionMode.LibraryWrite
63-
| WorkspacePermissionMode.Management =>
64-
test === WorkspacePermissionMode.LibraryRead ||
65-
test === WorkspacePermissionMode.LibraryWrite ||
66-
test === WorkspacePermissionMode.Management;
71+
const generateWorkspacePermissionItemKey = (
72+
item: Partial<WorkspacePermissionSetting>,
73+
index?: number
74+
) => [item.type, item.userId, item.group, ...(item.modes ?? []), index].filter(Boolean).join('-');
6775

6876
interface WorkspacePermissionSettingInputProps {
6977
index: number;
7078
deletable: boolean;
7179
type?: 'user' | 'group';
7280
userId?: string;
7381
group?: string;
74-
modes?: Array<
75-
| WorkspacePermissionMode.LibraryRead
76-
| WorkspacePermissionMode.LibraryWrite
77-
| WorkspacePermissionMode.Management
78-
>;
82+
modes?: WorkspacePermissionMode[];
7983
onTypeChange: (type: 'user' | 'group', index: number) => void;
8084
onGroupOrUserIdChange: (
8185
groupOrUserId:
@@ -85,11 +89,7 @@ interface WorkspacePermissionSettingInputProps {
8589
index: number
8690
) => void;
8791
onPermissionModesChange: (
88-
WorkspacePermissionMode: Array<
89-
| WorkspacePermissionMode.LibraryRead
90-
| WorkspacePermissionMode.LibraryWrite
91-
| WorkspacePermissionMode.Management
92-
>,
92+
WorkspacePermissionMode: WorkspacePermissionMode[],
9393
index: number
9494
) => void;
9595
onDelete: (index: number) => void;
@@ -111,16 +111,16 @@ const WorkspacePermissionSettingInput = ({
111111
() => (group || userId ? [{ label: (group || userId) as string }] : []),
112112
[group, userId]
113113
);
114-
const permissionModesIdToSelectMap = useMemo(
115-
() => ({
116-
[WorkspacePermissionMode.LibraryRead]: !!modes?.includes(WorkspacePermissionMode.LibraryRead),
117-
[WorkspacePermissionMode.LibraryWrite]: !!modes?.includes(
118-
WorkspacePermissionMode.LibraryWrite
119-
),
120-
[WorkspacePermissionMode.Management]: !!modes?.includes(WorkspacePermissionMode.Management),
121-
}),
122-
[modes]
123-
);
114+
const permissionModesSelectedId = useMemo(() => {
115+
if (!modes) {
116+
return undefined;
117+
}
118+
for (const key in optionIdToWorkspacePermissionModesMap) {
119+
if (optionIdToWorkspacePermissionModesMap[key].every((mode) => modes?.includes(mode))) {
120+
return key;
121+
}
122+
}
123+
}, [modes]);
124124

125125
const handleTypeChange = useCallback(
126126
(newType: 'user' | 'group') => {
@@ -154,16 +154,13 @@ const WorkspacePermissionSettingInput = ({
154154
[index, type, onGroupOrUserIdChange]
155155
);
156156

157-
const handlePermissionStateChange = useCallback(
157+
const handlePermissionModeOptionChange = useCallback(
158158
(id: string) => {
159-
if (isWorkspacePermissionMode(id)) {
160-
onPermissionModesChange(
161-
modes?.includes(id) ? modes.filter((value) => value !== id) : [...(modes ?? []), id],
162-
index
163-
);
159+
if (optionIdToWorkspacePermissionModesMap[id]) {
160+
onPermissionModesChange([...optionIdToWorkspacePermissionModesMap[id]], index);
164161
}
165162
},
166-
[index, modes, onPermissionModesChange]
163+
[index, onPermissionModesChange]
167164
);
168165

169166
const handleDelete = useCallback(() => {
@@ -195,11 +192,11 @@ const WorkspacePermissionSettingInput = ({
195192
<EuiFlexItem grow={false}>
196193
<EuiButtonGroup
197194
legend="Permission Modes"
198-
type="multi"
195+
type="single"
199196
options={permissionModeOptions}
200-
onChange={handlePermissionStateChange}
201197
isIconOnly
202-
idToSelectedMap={permissionModesIdToSelectMap}
198+
idSelected={permissionModesSelectedId}
199+
onChange={handlePermissionModeOptionChange}
203200
/>
204201
</EuiFlexItem>
205202
<EuiFlexItem grow={false}>
@@ -227,63 +224,99 @@ export const WorkspacePermissionSettingPanel = ({
227224
onChange,
228225
firstRowDeletable,
229226
}: WorkspacePermissionSettingPanelProps) => {
230-
const valueRef = useRef(value);
231-
valueRef.current = value;
227+
const transformedValue = useMemo(() => {
228+
if (!value) {
229+
return [];
230+
}
231+
const result: Array<Partial<WorkspacePermissionSetting>> = [];
232+
/**
233+
* One workspace permission setting may includes multi setting options,
234+
* for loop the workspace permission setting array to separate it to multi rows.
235+
**/
236+
for (let i = 0; i < value.length; i++) {
237+
const valueItem = value[i];
238+
// Incomplete workspace permission setting don't need to separate to multi rows
239+
if (
240+
!valueItem.modes ||
241+
!valueItem.type ||
242+
(valueItem.type === 'user' && !valueItem.userId) ||
243+
(valueItem.type === 'group' && !valueItem.group)
244+
) {
245+
result.push(valueItem);
246+
continue;
247+
}
248+
/**
249+
* For loop the option id to workspace permission modes map,
250+
* if one settings includes all permission modes in a specific option,
251+
* add these permission modes to the result array.
252+
*/
253+
for (const key in optionIdToWorkspacePermissionModesMap) {
254+
if (!Object.prototype.hasOwnProperty.call(optionIdToWorkspacePermissionModesMap, key)) {
255+
continue;
256+
}
257+
const modesForCertainPermissionId = optionIdToWorkspacePermissionModesMap[key];
258+
if (modesForCertainPermissionId.every((mode) => valueItem.modes?.includes(mode))) {
259+
result.push({ ...valueItem, modes: modesForCertainPermissionId });
260+
}
261+
}
262+
}
263+
return result;
264+
}, [value]);
232265

233266
const handleAddNewOne = useCallback(() => {
234-
onChange?.([...(valueRef.current ?? []), {}]);
235-
}, [onChange]);
267+
onChange?.([...(transformedValue ?? []), {}]);
268+
}, [onChange, transformedValue]);
236269

237270
const handleDelete = useCallback(
238271
(index: number) => {
239-
onChange?.((valueRef.current ?? []).filter((_item, itemIndex) => itemIndex !== index));
272+
onChange?.((transformedValue ?? []).filter((_item, itemIndex) => itemIndex !== index));
240273
},
241-
[onChange]
274+
[onChange, transformedValue]
242275
);
243276

244277
const handlePermissionModesChange = useCallback<
245278
WorkspacePermissionSettingInputProps['onPermissionModesChange']
246279
>(
247280
(modes, index) => {
248281
onChange?.(
249-
(valueRef.current ?? []).map((item, itemIndex) =>
282+
(transformedValue ?? []).map((item, itemIndex) =>
250283
index === itemIndex ? { ...item, modes } : item
251284
)
252285
);
253286
},
254-
[onChange]
287+
[onChange, transformedValue]
255288
);
256289

257290
const handleTypeChange = useCallback<WorkspacePermissionSettingInputProps['onTypeChange']>(
258291
(type, index) => {
259292
onChange?.(
260-
(valueRef.current ?? []).map((item, itemIndex) =>
293+
(transformedValue ?? []).map((item, itemIndex) =>
261294
index === itemIndex ? { ...item, type } : item
262295
)
263296
);
264297
},
265-
[onChange]
298+
[onChange, transformedValue]
266299
);
267300

268301
const handleGroupOrUserIdChange = useCallback<
269302
WorkspacePermissionSettingInputProps['onGroupOrUserIdChange']
270303
>(
271304
(userOrGroupIdWithType, index) => {
272305
onChange?.(
273-
(valueRef.current ?? []).map((item, itemIndex) =>
306+
(transformedValue ?? []).map((item, itemIndex) =>
274307
index === itemIndex
275308
? { ...userOrGroupIdWithType, ...(item.modes ? { modes: item.modes } : {}) }
276309
: item
277310
)
278311
);
279312
},
280-
[onChange]
313+
[onChange, transformedValue]
281314
);
282315

283316
return (
284317
<EuiDescribedFormGroup title={<h3>Users, User Groups & Groups</h3>}>
285-
{value?.map((item, index) => (
286-
<React.Fragment key={index}>
318+
{transformedValue?.map((item, index) => (
319+
<React.Fragment key={generateWorkspacePermissionItemKey(item, index)}>
287320
<EuiFormRow isInvalid={!!errors?.[index]} error={errors?.[index]}>
288321
<WorkspacePermissionSettingInput
289322
{...item}

src/plugins/workspace/public/workspace_client.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ type WorkspaceRoutePermissionItem = {
3333
modes: Array<
3434
| WorkspacePermissionMode.LibraryRead
3535
| WorkspacePermissionMode.LibraryWrite
36-
| WorkspacePermissionMode.Management
36+
| WorkspacePermissionMode.Read
37+
| WorkspacePermissionMode.Write
3738
>;
3839
} & ({ type: 'user'; userId: string } | { type: 'group'; group: string });
3940

src/plugins/workspace/server/routes/index.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ const workspacePermissionMode = schema.oneOf([
2121
schema.literal(WorkspacePermissionMode.Write),
2222
schema.literal(WorkspacePermissionMode.LibraryRead),
2323
schema.literal(WorkspacePermissionMode.LibraryWrite),
24-
schema.literal(WorkspacePermissionMode.Management),
24+
schema.literal(WorkspacePermissionMode.Read),
25+
schema.literal(WorkspacePermissionMode.Write),
2526
]);
2627

2728
const workspacePermission = schema.oneOf([
@@ -187,7 +188,12 @@ export function registerRoutes({
187188
permissions.push({
188189
type: 'user',
189190
userId: authInfo.user_name,
190-
modes: [WorkspacePermissionMode.Management],
191+
modes: [WorkspacePermissionMode.LibraryWrite],
192+
});
193+
permissions.push({
194+
type: 'user',
195+
userId: authInfo.user_name,
196+
modes: [WorkspacePermissionMode.Write],
191197
});
192198
}
193199

0 commit comments

Comments
 (0)