From 98e299c2ac9de79ffbade8a06424fe387a6a6152 Mon Sep 17 00:00:00 2001 From: Tuan Dang Date: Tue, 21 Nov 2023 17:11:53 +0700 Subject: [PATCH] Update rendering custo role slugs in ST V3 table / modal --- .../src/controllers/v3/secretsController.ts | 33 ++++++++++++------- .../controllers/v3/workspacesController.ts | 2 +- frontend/src/hooks/api/serviceTokens/types.ts | 4 +++ .../views/Project/MembersPage/MembersPage.tsx | 2 +- .../MemberListTab/MemberListTab.tsx | 1 + .../AddServiceTokenV3Modal.tsx | 6 +++- .../ServiceTokenV3Table.tsx | 10 ++++-- 7 files changed, 41 insertions(+), 17 deletions(-) diff --git a/backend/src/controllers/v3/secretsController.ts b/backend/src/controllers/v3/secretsController.ts index 3eb1b3245..e1e54d4d0 100644 --- a/backend/src/controllers/v3/secretsController.ts +++ b/backend/src/controllers/v3/secretsController.ts @@ -6,7 +6,13 @@ import { BotService } from "../../services"; import { containsGlobPatterns, repackageSecretToRaw } from "../../helpers/secrets"; import { encryptSymmetric128BitHexKeyUTF8 } from "../../utils/crypto"; import { getAllImportedSecrets } from "../../services/SecretImportService"; -import { Folder, IServiceTokenData, Membership, User } from "../../models"; +import { + Folder, + IServiceTokenData, + Membership, + ServiceTokenData, + User +} from "../../models"; import { getFolderByPath } from "../../services/FolderService"; import { BadRequestError } from "../../utils/errors"; import { validateRequest } from "../../helpers/validation"; @@ -190,17 +196,20 @@ export const getSecretsRaw = async (req: Request, res: Response) => { query: { include_imports: includeImports } } = validatedData; - // if the service token has single scope, it will get all secrets for that scope by default - const serviceTokenDetails: IServiceTokenData = req?.serviceTokenData; - if ( - serviceTokenDetails && - serviceTokenDetails.scopes.length == 1 && - !containsGlobPatterns(serviceTokenDetails.scopes[0].secretPath) - ) { - const scope = serviceTokenDetails.scopes[0]; - secretPath = scope.secretPath; - environment = scope.environment; - workspaceId = serviceTokenDetails.workspace.toString(); + if (req.authData.authPayload instanceof ServiceTokenData) { + + // if the service token has single scope, it will get all secrets for that scope by default + const serviceTokenDetails: IServiceTokenData = req?.serviceTokenData; + if ( + serviceTokenDetails && + serviceTokenDetails.scopes.length == 1 && + !containsGlobPatterns(serviceTokenDetails.scopes[0].secretPath) + ) { + const scope = serviceTokenDetails.scopes[0]; + secretPath = scope.secretPath; + environment = scope.environment; + workspaceId = serviceTokenDetails.workspace.toString(); + } } if (!environment || !workspaceId) diff --git a/backend/src/controllers/v3/workspacesController.ts b/backend/src/controllers/v3/workspacesController.ts index c47fdf619..4842ed3be 100644 --- a/backend/src/controllers/v3/workspacesController.ts +++ b/backend/src/controllers/v3/workspacesController.ts @@ -148,7 +148,7 @@ export const getWorkspaceServiceTokenData = async (req: Request, res: Response) const serviceTokenData = await ServiceTokenDataV3.find({ workspace: new Types.ObjectId(workspaceId) - }); + }).populate("customRole"); return res.status(200).send({ serviceTokenData diff --git a/frontend/src/hooks/api/serviceTokens/types.ts b/frontend/src/hooks/api/serviceTokens/types.ts index cfe4086fe..210ff7cd8 100644 --- a/frontend/src/hooks/api/serviceTokens/types.ts +++ b/frontend/src/hooks/api/serviceTokens/types.ts @@ -47,6 +47,10 @@ export type ServiceTokenDataV3 = { _id: string; name: string; role: string; + customRole?: { + name: string; + slug: string; + }; workspace: string; isActive: boolean; refreshTokenLastUsed?: string; diff --git a/frontend/src/views/Project/MembersPage/MembersPage.tsx b/frontend/src/views/Project/MembersPage/MembersPage.tsx index e14562c08..a9b10b607 100644 --- a/frontend/src/views/Project/MembersPage/MembersPage.tsx +++ b/frontend/src/views/Project/MembersPage/MembersPage.tsx @@ -2,7 +2,7 @@ import { motion } from "framer-motion"; import { Tab, TabList, TabPanel, Tabs } from "@app/components/v2"; -import { ProjectPermissionActions, ProjectPermissionSub, useWorkspace } from "@app/context"; +import { ProjectPermissionActions, ProjectPermissionSub } from "@app/context"; import { withProjectPermission } from "@app/hoc"; import { MemberListTab } from "./components/MemberListTab"; diff --git a/frontend/src/views/Project/MembersPage/components/MemberListTab/MemberListTab.tsx b/frontend/src/views/Project/MembersPage/components/MemberListTab/MemberListTab.tsx index c0499d243..758970e2d 100644 --- a/frontend/src/views/Project/MembersPage/components/MemberListTab/MemberListTab.tsx +++ b/frontend/src/views/Project/MembersPage/components/MemberListTab/MemberListTab.tsx @@ -74,6 +74,7 @@ export const MemberListTab = () => { orgId, workspaceId }); + const { data: wsKey } = useGetUserWsKey(workspaceId); const { data: members, isLoading: isMembersLoading } = useGetWorkspaceUsers(workspaceId); const { data: orgUsers } = useGetOrgUsers(orgId); diff --git a/frontend/src/views/Project/MembersPage/components/ServiceTokenTab/components/ServiceTokenV3Section/AddServiceTokenV3Modal.tsx b/frontend/src/views/Project/MembersPage/components/ServiceTokenTab/components/ServiceTokenV3Section/AddServiceTokenV3Modal.tsx index b00ba8392..cfe5937d7 100644 --- a/frontend/src/views/Project/MembersPage/components/ServiceTokenTab/components/ServiceTokenV3Section/AddServiceTokenV3Modal.tsx +++ b/frontend/src/views/Project/MembersPage/components/ServiceTokenTab/components/ServiceTokenV3Section/AddServiceTokenV3Modal.tsx @@ -151,6 +151,10 @@ export const AddServiceTokenV3Modal = ({ serviceTokenDataId: string; name: string; role: string; + customRole: { + name: string; + slug: string; + }; trustedIps: ServiceTokenV3TrustedIp[]; accessTokenTTL: number; isRefreshTokenRotationEnabled: boolean; @@ -161,7 +165,7 @@ export const AddServiceTokenV3Modal = ({ if (serviceTokenData) { reset({ name: serviceTokenData.name, - role: serviceTokenData.role, + role: serviceTokenData?.customRole?.slug ?? serviceTokenData.role, trustedIps: serviceTokenData.trustedIps.map(({ ipAddress, prefix diff --git a/frontend/src/views/Project/MembersPage/components/ServiceTokenTab/components/ServiceTokenV3Section/ServiceTokenV3Table.tsx b/frontend/src/views/Project/MembersPage/components/ServiceTokenTab/components/ServiceTokenV3Section/ServiceTokenV3Table.tsx index 6d1096587..2bfa23255 100644 --- a/frontend/src/views/Project/MembersPage/components/ServiceTokenTab/components/ServiceTokenV3Section/ServiceTokenV3Table.tsx +++ b/frontend/src/views/Project/MembersPage/components/ServiceTokenTab/components/ServiceTokenV3Section/ServiceTokenV3Table.tsx @@ -32,6 +32,10 @@ type Props = { serviceTokenDataId?: string; name?: string; role?: string; + customRole?: { + name: string; + slug: string; + }; trustedIps?: ServiceTokenV3TrustedIp[]; accessTokenTTL?: number; isRefreshTokenRotationEnabled?: boolean; @@ -46,7 +50,7 @@ export const ServiceTokenV3Table = ({ const { currentWorkspace } = useWorkspace(); const { data, isLoading } = useGetWorkspaceServiceTokenDataV3(currentWorkspace?._id || ""); const { mutateAsync: updateMutateAsync } = useUpdateServiceTokenV3(); - + const handleToggleServiceTokenDataStatus = async ({ serviceTokenDataId, isActive @@ -98,6 +102,7 @@ export const ServiceTokenV3Table = ({ name, isActive, role, + customRole, trustedIps, createdAt, expiresAt, @@ -127,7 +132,7 @@ export const ServiceTokenV3Table = ({ )} - {role} + {customRole?.slug ?? role} {trustedIps.map(({ _id: trustedIpId, @@ -156,6 +161,7 @@ export const ServiceTokenV3Table = ({ serviceTokenDataId: _id, name, role, + customRole, trustedIps, accessTokenTTL, isRefreshTokenRotationEnabled