feat(rbac): grouped folder and imports permission into secret permission

This commit is contained in:
Akhil Mohan
2023-09-13 22:30:56 +05:30
parent c3c16f4e42
commit 2333675262
15 changed files with 110 additions and 174 deletions
@@ -24,7 +24,7 @@ import { useWorkspace } from "@app/context";
import { TFormSchema } from "./ProjectRoleModifySection.utils";
type Props = {
formName: "secrets" | "folders" | "secret-imports";
formName: "secrets";
isNonEditable?: boolean;
setValue: UseFormSetValue<TFormSchema>;
control: Control<TFormSchema>;
@@ -6,9 +6,7 @@ import {
faArrowLeft,
faBook,
faCog,
faFolder,
faKey,
faLink,
faLock,
faMagnifyingGlass,
faNetworkWired,
@@ -244,32 +242,10 @@ export const ProjectRoleModifySection = ({ role, onGoBack }: Props) => {
setValue={setValue}
icon={faLock}
title="Secrets"
subtitle="Secret management control"
subtitle="Create, modify and remove secrets, folders and secret imports"
formName="secrets"
/>
</div>
<div>
<MultiEnvProjectPermission
isNonEditable={isNonEditable}
control={control}
setValue={setValue}
icon={faFolder}
title="Folders"
subtitle="Folder management control"
formName="folders"
/>
</div>
<div>
<MultiEnvProjectPermission
isNonEditable={isNonEditable}
control={control}
setValue={setValue}
icon={faLink}
title="Secret Imports"
subtitle="Secret import management control"
formName="secret-imports"
/>
</div>
<div key="permission-ws">
<WsProjectPermission
control={control}
@@ -23,7 +23,6 @@ const multiEnvPermissionSchema = z
.optional();
const PERMISSION_ACTIONS = ["read", "create", "edit", "delete"] as const;
const MULTI_ENV_KEY = ["secrets", "folders", "secret-imports"] as const;
export const formSchema = z.object({
name: z.string().trim(),
@@ -32,8 +31,6 @@ export const formSchema = z.object({
permissions: z
.object({
secrets: z.record(multiEnvPermissionSchema).optional(),
folders: z.record(multiEnvPermissionSchema).optional(),
"secret-imports": z.record(multiEnvPermissionSchema).optional(),
member: generalPermissionSchema,
role: generalPermissionSchema,
integrations: generalPermissionSchema,
@@ -92,7 +89,7 @@ export const rolePermission2Form = (permissions: TProjectPermission[] = []) => {
const { subject, action } = permission;
if (!formVal?.[subject]) formVal[subject] = {};
if (["secrets", "folders", "secret-imports"].includes(subject)) {
if (subject === "secrets") {
multiEnvApi2Form(formVal[subject], permission);
} else {
// everything else follows same pattern
@@ -107,7 +104,7 @@ export const rolePermission2Form = (permissions: TProjectPermission[] = []) => {
const multiEnvForm2Api = (
permissions: TProjectPermission[],
formVal: Record<string, { secretPath?: string } & { [key: string]: boolean }>,
subject: (typeof MULTI_ENV_KEY)[number]
subject: "secrets"
) => {
if (!formVal) return;
@@ -147,12 +144,8 @@ export const formRolePermission2API = (formVal: TFormSchema["permissions"]) => {
// other than workspace everything else follows same
// if in future there is a different follow the above on how workspace is done
Object.entries(formVal || {}).forEach(([rule, actions]) => {
if (MULTI_ENV_KEY.includes(rule as (typeof MULTI_ENV_KEY)[number])) {
multiEnvForm2Api(
permissions,
JSON.parse(JSON.stringify(actions || {})),
rule as (typeof MULTI_ENV_KEY)[number]
);
if (rule === "secrets") {
multiEnvForm2Api(permissions, JSON.parse(JSON.stringify(actions || {})), rule);
} else {
Object.entries(actions).forEach(([action, isAllowed]) => {
if (isAllowed) {