From 18efc9a6de0ffc4d3ca657b9b2d55558bb215577 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Mon, 26 Aug 2024 19:53:17 +0400 Subject: [PATCH 01/12] Include more user details --- .../secret-approval-policy-dal.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/backend/src/ee/services/secret-approval-policy/secret-approval-policy-dal.ts b/backend/src/ee/services/secret-approval-policy/secret-approval-policy-dal.ts index daf6d0bd8..6d5168f26 100644 --- a/backend/src/ee/services/secret-approval-policy/secret-approval-policy-dal.ts +++ b/backend/src/ee/services/secret-approval-policy/secret-approval-policy-dal.ts @@ -20,7 +20,15 @@ export const secretApprovalPolicyDALFactory = (db: TDbClient) => { `${TableName.SecretApprovalPolicy}.id`, `${TableName.SecretApprovalPolicyApprover}.policyId` ) - .select(tx.ref("approverUserId").withSchema(TableName.SecretApprovalPolicyApprover)) + + .leftJoin(TableName.Users, `${TableName.SecretApprovalPolicyApprover}.approverUserId`, `${TableName.Users}.id`) + + .select( + tx.ref("approverUserId").withSchema(TableName.SecretApprovalPolicyApprover), + tx.ref("email").withSchema(TableName.Users).as("approverEmail"), + tx.ref("firstName").withSchema(TableName.Users).as("approverFirstName"), + tx.ref("lastName").withSchema(TableName.Users).as("approverLastName") + ) .select( tx.ref("name").withSchema(TableName.Environment).as("envName"), tx.ref("slug").withSchema(TableName.Environment).as("envSlug"), @@ -47,8 +55,11 @@ export const secretApprovalPolicyDALFactory = (db: TDbClient) => { { key: "approverUserId", label: "userApprovers" as const, - mapper: ({ approverUserId }) => ({ - userId: approverUserId + mapper: ({ approverUserId, approverEmail, approverFirstName, approverLastName }) => ({ + userId: approverUserId, + email: approverEmail, + firstName: approverFirstName, + lastName: approverLastName }) } ] From c2bd6f5ef303d3500e6cafa058e8737206f26ec7 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Mon, 26 Aug 2024 19:53:49 +0400 Subject: [PATCH 02/12] Feat: Send secret change request emails to approvers --- .../secret-approval-request-fns.ts | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 backend/src/ee/services/secret-approval-request/secret-approval-request-fns.ts diff --git a/backend/src/ee/services/secret-approval-request/secret-approval-request-fns.ts b/backend/src/ee/services/secret-approval-request/secret-approval-request-fns.ts new file mode 100644 index 000000000..39b07786c --- /dev/null +++ b/backend/src/ee/services/secret-approval-request/secret-approval-request-fns.ts @@ -0,0 +1,48 @@ +import { TSecretApprovalRequests } from "@app/db/schemas"; +import { getConfig } from "@app/lib/config/env"; +import { TProjectDALFactory } from "@app/services/project/project-dal"; +import { SmtpTemplates, TSmtpService } from "@app/services/smtp/smtp-service"; + +import { TSecretApprovalPolicyDALFactory } from "../secret-approval-policy/secret-approval-policy-dal"; + +type TSendApprovalEmails = { + secretApprovalPolicyDAL: Pick; + projectDAL: Pick; + smtpService: Pick; + projectId: string; + secretApprovalRequest: TSecretApprovalRequests; +}; + +export const sendApprovalEmailsFn = async ({ + secretApprovalPolicyDAL, + projectDAL, + smtpService, + projectId, + secretApprovalRequest +}: TSendApprovalEmails) => { + const cfg = getConfig(); + + const policy = await secretApprovalPolicyDAL.findById(secretApprovalRequest.policyId); + + const project = await projectDAL.findProjectWithOrg(projectId); + + // now we need to go through each of the reviewers and print out all the commits that they need to approve + for await (const reviewerUser of policy.userApprovers) { + if (reviewerUser) { + await smtpService.sendMail({ + recipients: [reviewerUser?.email as string], + subjectLine: "Infisical Secret Change Request", + + substitutions: { + firstName: reviewerUser.firstName, + projectName: project.name, + organizationName: project.organization.name, + approvalUrl: `${cfg.isDevelopmentMode ? "https" : "http"}://${cfg.SITE_URL}/project/${ + project.id + }/approval?requestId=${secretApprovalRequest.id}` + }, + template: SmtpTemplates.SecretApprovalRequestNeedsReview + }); + } + } +}; From 97b01ca5f8432eb1673e9402f78dd81c9512e604 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Mon, 26 Aug 2024 19:54:01 +0400 Subject: [PATCH 03/12] Feat: Send secret change request emails to approvers --- .../secret-approval-request-service.ts | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/backend/src/ee/services/secret-approval-request/secret-approval-request-service.ts b/backend/src/ee/services/secret-approval-request/secret-approval-request-service.ts index f6bb33168..80913c3d9 100644 --- a/backend/src/ee/services/secret-approval-request/secret-approval-request-service.ts +++ b/backend/src/ee/services/secret-approval-request/secret-approval-request-service.ts @@ -53,8 +53,10 @@ import { TUserDALFactory } from "@app/services/user/user-dal"; import { TLicenseServiceFactory } from "../license/license-service"; import { TPermissionServiceFactory } from "../permission/permission-service"; import { ProjectPermissionActions, ProjectPermissionSub } from "../permission/project-permission"; +import { TSecretApprovalPolicyDALFactory } from "../secret-approval-policy/secret-approval-policy-dal"; import { TSecretSnapshotServiceFactory } from "../secret-snapshot/secret-snapshot-service"; import { TSecretApprovalRequestDALFactory } from "./secret-approval-request-dal"; +import { sendApprovalEmailsFn } from "./secret-approval-request-fns"; import { TSecretApprovalRequestReviewerDALFactory } from "./secret-approval-request-reviewer-dal"; import { TSecretApprovalRequestSecretDALFactory } from "./secret-approval-request-secret-dal"; import { @@ -89,7 +91,10 @@ type TSecretApprovalRequestServiceFactoryDep = { smtpService: Pick; userDAL: Pick; projectEnvDAL: Pick; - projectDAL: Pick; + projectDAL: Pick< + TProjectDALFactory, + "checkProjectUpgradeStatus" | "findById" | "findProjectById" | "findProjectWithOrg" + >; secretQueueService: Pick; kmsService: Pick; secretV2BridgeDAL: Pick< @@ -98,6 +103,7 @@ type TSecretApprovalRequestServiceFactoryDep = { >; secretVersionV2BridgeDAL: Pick; secretVersionTagV2BridgeDAL: Pick; + secretApprovalPolicyDAL: Pick; licenseService: Pick; }; @@ -121,6 +127,7 @@ export const secretApprovalRequestServiceFactory = ({ smtpService, userDAL, projectEnvDAL, + secretApprovalPolicyDAL, kmsService, secretV2BridgeDAL, secretVersionV2BridgeDAL, @@ -1061,6 +1068,15 @@ export const secretApprovalRequestServiceFactory = ({ } return { ...doc, commits: approvalCommits }; }); + + await sendApprovalEmailsFn({ + projectDAL, + secretApprovalPolicyDAL, + secretApprovalRequest, + smtpService, + projectId + }); + return secretApprovalRequest; }; @@ -1311,8 +1327,17 @@ export const secretApprovalRequestServiceFactory = ({ tx ); } + return { ...doc, commits: approvalCommits }; }); + + await sendApprovalEmailsFn({ + projectDAL, + secretApprovalPolicyDAL, + secretApprovalRequest, + smtpService, + projectId + }); return secretApprovalRequest; }; From b00fff6922d748883225c12a04571af3f35f2a49 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Mon, 26 Aug 2024 19:54:15 +0400 Subject: [PATCH 04/12] Update index.ts --- backend/src/server/routes/index.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/backend/src/server/routes/index.ts b/backend/src/server/routes/index.ts index a15482226..7a1c405b3 100644 --- a/backend/src/server/routes/index.ts +++ b/backend/src/server/routes/index.ts @@ -845,6 +845,7 @@ export const registerRoutes = async ( secretQueueService, kmsService, secretV2BridgeDAL, + secretApprovalPolicyDAL, secretVersionV2BridgeDAL, secretVersionTagV2BridgeDAL, smtpService, From 41ab1972ce71a6748b855d57362a4e1ec1e88c2a Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Mon, 26 Aug 2024 19:54:48 +0400 Subject: [PATCH 05/12] Feat: Find project and include org dal --- backend/src/services/project/project-dal.ts | 29 +++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/backend/src/services/project/project-dal.ts b/backend/src/services/project/project-dal.ts index ce7f6324e..64500814f 100644 --- a/backend/src/services/project/project-dal.ts +++ b/backend/src/services/project/project-dal.ts @@ -279,6 +279,34 @@ export const projectDALFactory = (db: TDbClient) => { } }; + const findProjectWithOrg = async (projectId: string) => { + // we just need the project, and we need to include a new .organization field that includes the org from the orgId reference + + const project = await db(TableName.Project) + .where({ [`${TableName.Project}.id` as "id"]: projectId }) + + .join(TableName.Organization, `${TableName.Organization}.id`, `${TableName.Project}.orgId`) + + .select( + db.ref("id").withSchema(TableName.Organization).as("organizationId"), + db.ref("name").withSchema(TableName.Organization).as("organizationName") + ) + .select(selectAllTableCols(TableName.Project)) + .first(); + + if (!project) { + throw new BadRequestError({ message: "Project not found" }); + } + + return { + ...ProjectsSchema.parse(project), + organization: { + id: project.organizationId, + name: project.organizationName + } + }; + }; + return { ...projectOrm, findAllProjects, @@ -288,6 +316,7 @@ export const projectDALFactory = (db: TDbClient) => { findProjectById, findProjectByFilter, findProjectBySlug, + findProjectWithOrg, checkProjectUpgradeStatus }; }; From 2bcead03b0c8183a06fb0ef1b73d897615501b16 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Mon, 26 Aug 2024 19:55:04 +0400 Subject: [PATCH 06/12] Feat: Send secret change request emails to approvers --- backend/src/services/smtp/smtp-service.ts | 1 + ...ecretApprovalRequestNeedsReview.handlebars | 22 +++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 backend/src/services/smtp/templates/secretApprovalRequestNeedsReview.handlebars diff --git a/backend/src/services/smtp/smtp-service.ts b/backend/src/services/smtp/smtp-service.ts index 94d84b98c..d0e1e0774 100644 --- a/backend/src/services/smtp/smtp-service.ts +++ b/backend/src/services/smtp/smtp-service.ts @@ -25,6 +25,7 @@ export enum SmtpTemplates { UnlockAccount = "unlockAccount.handlebars", AccessApprovalRequest = "accessApprovalRequest.handlebars", AccessSecretRequestBypassed = "accessSecretRequestBypassed.handlebars", + SecretApprovalRequestNeedsReview = "secretApprovalRequestNeedsReview.handlebars", HistoricalSecretList = "historicalSecretLeakIncident.handlebars", NewDeviceJoin = "newDevice.handlebars", OrgInvite = "organizationInvitation.handlebars", diff --git a/backend/src/services/smtp/templates/secretApprovalRequestNeedsReview.handlebars b/backend/src/services/smtp/templates/secretApprovalRequestNeedsReview.handlebars new file mode 100644 index 000000000..9dd6fe747 --- /dev/null +++ b/backend/src/services/smtp/templates/secretApprovalRequestNeedsReview.handlebars @@ -0,0 +1,22 @@ + + + + + + Secret Change Approval Request + + + +

Hi {{firstName}},

+

New secret change requests are pending review.

+
+

You have a secret change request pending your review in project "{{projectName}}", in the "{{organizationName}}" + organization.

+ +

+ View the request and approve or deny it + here. +

+ + + \ No newline at end of file From 1655ca27d1fb261bce47f967e7c90e0a72777e93 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Mon, 26 Aug 2024 20:02:58 +0400 Subject: [PATCH 07/12] Fix: Creation of secret approval policies --- frontend/src/hooks/api/secretApproval/mutation.tsx | 10 +++++++++- .../components/AccessPolicyModal.tsx | 9 ++++----- 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/frontend/src/hooks/api/secretApproval/mutation.tsx b/frontend/src/hooks/api/secretApproval/mutation.tsx index 2ad79932b..ceebd3493 100644 --- a/frontend/src/hooks/api/secretApproval/mutation.tsx +++ b/frontend/src/hooks/api/secretApproval/mutation.tsx @@ -9,7 +9,15 @@ export const useCreateSecretApprovalPolicy = () => { const queryClient = useQueryClient(); return useMutation<{}, {}, TCreateSecretPolicyDTO>({ - mutationFn: async ({ environment, workspaceId, approvals, approvers, secretPath, name, enforcementLevel }) => { + mutationFn: async ({ + environment, + workspaceId, + approvals, + approvers, + secretPath, + name, + enforcementLevel + }) => { const { data } = await apiRequest.post("/api/v1/secret-approvals", { environment, workspaceId, diff --git a/frontend/src/views/SecretApprovalPage/components/ApprovalPolicyList/components/AccessPolicyModal.tsx b/frontend/src/views/SecretApprovalPage/components/ApprovalPolicyList/components/AccessPolicyModal.tsx index b9b0523ee..24a470bcc 100644 --- a/frontend/src/views/SecretApprovalPage/components/ApprovalPolicyList/components/AccessPolicyModal.tsx +++ b/frontend/src/views/SecretApprovalPage/components/ApprovalPolicyList/components/AccessPolicyModal.tsx @@ -45,11 +45,11 @@ const formSchema = z name: z.string().optional(), secretPath: z.string().optional(), approvals: z.number().min(1), - approverUserIds: z.string().array().min(1), + approvers: z.string().array().min(1), policyType: z.nativeEnum(PolicyType), enforcementLevel: z.nativeEnum(EnforcementLevel) }) - .refine((data) => data.approvals <= data.approverUserIds.length, { + .refine((data) => data.approvals <= data.approvers.length, { path: ["approvals"], message: "The number of approvals should be lower than the number of approvers." }); @@ -75,8 +75,7 @@ export const AccessPolicyForm = ({ ? { ...editValues, environment: editValues.environment.slug, - approverUserIds: - editValues?.userApprovers?.map((user) => user.userId) || editValues?.approvers + approvers: editValues?.userApprovers?.map((user) => user.userId) || editValues?.approvers } : undefined }); @@ -264,7 +263,7 @@ export const AccessPolicyForm = ({ /> ( Date: Mon, 26 Aug 2024 20:04:06 +0400 Subject: [PATCH 08/12] Feat: Open approval with ID in URL --- .../SecretApprovalRequest.tsx | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx index a1e21d849..87dc088ad 100644 --- a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx +++ b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx @@ -1,4 +1,4 @@ -import { Fragment, useState } from "react"; +import { Fragment, useEffect, useState } from "react"; import { faCheck, faCheckCircle, @@ -28,6 +28,7 @@ import { } from "@app/context"; import { useGetSecretApprovalRequestCount, + useGetSecretApprovalRequestDetails, useGetSecretApprovalRequests, useGetWorkspaceUsers } from "@app/hooks/api"; @@ -47,6 +48,7 @@ export const SecretApprovalRequest = () => { const [statusFilter, setStatusFilter] = useState<"open" | "close">("open"); const [envFilter, setEnvFilter] = useState(); const [committerFilter, setCommitterFilter] = useState(); + const [usingUrlRequestId, setUsingUrlRequestId] = useState(false); const { data: secretApprovalRequests, @@ -67,6 +69,24 @@ export const SecretApprovalRequest = () => { const { permission } = useProjectPermission(); const { data: members } = useGetWorkspaceUsers(workspaceId); const isSecretApprovalScreen = Boolean(selectedApproval); + const queryParams = new URLSearchParams(window.location.search); + const requestId = queryParams.get("requestId"); + + const { data: secretApprovalRequestDetails } = useGetSecretApprovalRequestDetails({ + id: requestId!, + options: { + enabled: !!requestId && !usingUrlRequestId + } + }); + + useEffect(() => { + if (!requestId || usingUrlRequestId) return; + + if (secretApprovalRequestDetails) { + setSelectedApproval(secretApprovalRequestDetails); + setUsingUrlRequestId(true); + } + }, [queryParams, secretApprovalRequestDetails]); const handleGoBackSecretRequestDetail = () => { setSelectedApproval(null); From c23f21d57ab302c7cc083704de0496463ef26252 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Mon, 26 Aug 2024 20:21:05 +0400 Subject: [PATCH 09/12] Update SecretApprovalRequest.tsx --- .../SecretApprovalRequest.tsx | 30 +++++++------------ 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx index 87dc088ad..d75be4f14 100644 --- a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx +++ b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx @@ -28,11 +28,10 @@ import { } from "@app/context"; import { useGetSecretApprovalRequestCount, - useGetSecretApprovalRequestDetails, useGetSecretApprovalRequests, useGetWorkspaceUsers } from "@app/hooks/api"; -import { ApprovalStatus, TSecretApprovalRequest } from "@app/hooks/api/types"; +import { ApprovalStatus } from "@app/hooks/api/types"; import { generateCommitText, @@ -42,7 +41,7 @@ import { export const SecretApprovalRequest = () => { const { currentWorkspace } = useWorkspace(); const workspaceId = currentWorkspace?.id || ""; - const [selectedApproval, setSelectedApproval] = useState(null); + const [selectedApprovalId, setSelectedApprovalId] = useState(null); // filters const [statusFilter, setStatusFilter] = useState<"open" | "close">("open"); @@ -68,28 +67,19 @@ export const SecretApprovalRequest = () => { const { user: userSession } = useUser(); const { permission } = useProjectPermission(); const { data: members } = useGetWorkspaceUsers(workspaceId); - const isSecretApprovalScreen = Boolean(selectedApproval); + const isSecretApprovalScreen = Boolean(selectedApprovalId); const queryParams = new URLSearchParams(window.location.search); const requestId = queryParams.get("requestId"); - const { data: secretApprovalRequestDetails } = useGetSecretApprovalRequestDetails({ - id: requestId!, - options: { - enabled: !!requestId && !usingUrlRequestId - } - }); - useEffect(() => { if (!requestId || usingUrlRequestId) return; - if (secretApprovalRequestDetails) { - setSelectedApproval(secretApprovalRequestDetails); - setUsingUrlRequestId(true); - } - }, [queryParams, secretApprovalRequestDetails]); + setSelectedApprovalId(requestId); + setUsingUrlRequestId(true); + }, [queryParams]); const handleGoBackSecretRequestDetail = () => { - setSelectedApproval(null); + setSelectedApprovalId(null); refetch({ refetchPage: (_page, index) => index === 0 }); }; @@ -108,7 +98,7 @@ export const SecretApprovalRequest = () => { > @@ -239,9 +229,9 @@ export const SecretApprovalRequest = () => { className="flex flex-col px-8 py-4 hover:bg-mineshaft-700" role="button" tabIndex={0} - onClick={() => setSelectedApproval(secretApproval)} + onClick={() => setSelectedApprovalId(secretApproval.id)} onKeyDown={(evt) => { - if (evt.key === "Enter") setSelectedApproval(secretApproval); + if (evt.key === "Enter") setSelectedApprovalId(secretApproval.id); }} >
From 8ddfe7b6e98fde1683e6d9966fd2f360ee4819cd Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Mon, 26 Aug 2024 20:53:43 +0400 Subject: [PATCH 10/12] Update secret-approval-request-fns.ts --- .../secret-approval-request-fns.ts | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/backend/src/ee/services/secret-approval-request/secret-approval-request-fns.ts b/backend/src/ee/services/secret-approval-request/secret-approval-request-fns.ts index 39b07786c..01b2451ac 100644 --- a/backend/src/ee/services/secret-approval-request/secret-approval-request-fns.ts +++ b/backend/src/ee/services/secret-approval-request/secret-approval-request-fns.ts @@ -28,21 +28,19 @@ export const sendApprovalEmailsFn = async ({ // now we need to go through each of the reviewers and print out all the commits that they need to approve for await (const reviewerUser of policy.userApprovers) { - if (reviewerUser) { - await smtpService.sendMail({ - recipients: [reviewerUser?.email as string], - subjectLine: "Infisical Secret Change Request", + await smtpService.sendMail({ + recipients: [reviewerUser?.email as string], + subjectLine: "Infisical Secret Change Request", - substitutions: { - firstName: reviewerUser.firstName, - projectName: project.name, - organizationName: project.organization.name, - approvalUrl: `${cfg.isDevelopmentMode ? "https" : "http"}://${cfg.SITE_URL}/project/${ - project.id - }/approval?requestId=${secretApprovalRequest.id}` - }, - template: SmtpTemplates.SecretApprovalRequestNeedsReview - }); - } + substitutions: { + firstName: reviewerUser.firstName, + projectName: project.name, + organizationName: project.organization.name, + approvalUrl: `${cfg.isDevelopmentMode ? "https" : "http"}://${cfg.SITE_URL}/project/${ + project.id + }/approval?requestId=${secretApprovalRequest.id}` + }, + template: SmtpTemplates.SecretApprovalRequestNeedsReview + }); } }; From 25a9e5f58a8d4aa3d64f22c3c1542cff9390e744 Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Mon, 26 Aug 2024 21:42:47 +0400 Subject: [PATCH 11/12] Update SecretApprovalRequest.tsx --- .../SecretApprovalRequest/SecretApprovalRequest.tsx | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx index d75be4f14..d761a7153 100644 --- a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx +++ b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx @@ -1,4 +1,5 @@ import { Fragment, useEffect, useState } from "react"; +import { useRouter } from "next/router"; import { faCheck, faCheckCircle, @@ -65,16 +66,17 @@ export const SecretApprovalRequest = () => { const { data: secretApprovalRequestCount, isSuccess: isSecretApprovalReqCountSuccess } = useGetSecretApprovalRequestCount({ workspaceId }); const { user: userSession } = useUser(); + const router = useRouter(); const { permission } = useProjectPermission(); const { data: members } = useGetWorkspaceUsers(workspaceId); const isSecretApprovalScreen = Boolean(selectedApprovalId); const queryParams = new URLSearchParams(window.location.search); - const requestId = queryParams.get("requestId"); + const { requestId } = router.query; useEffect(() => { if (!requestId || usingUrlRequestId) return; - setSelectedApprovalId(requestId); + setSelectedApprovalId(requestId as string); setUsingUrlRequestId(true); }, [queryParams]); From 51791036800ce23b8cc9737bbb854c4d9a5d65fc Mon Sep 17 00:00:00 2001 From: Daniel Hougaard Date: Mon, 26 Aug 2024 21:46:05 +0400 Subject: [PATCH 12/12] Update SecretApprovalRequest.tsx --- .../components/SecretApprovalRequest/SecretApprovalRequest.tsx | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx index d761a7153..0b62efad6 100644 --- a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx +++ b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx @@ -70,7 +70,6 @@ export const SecretApprovalRequest = () => { const { permission } = useProjectPermission(); const { data: members } = useGetWorkspaceUsers(workspaceId); const isSecretApprovalScreen = Boolean(selectedApprovalId); - const queryParams = new URLSearchParams(window.location.search); const { requestId } = router.query; useEffect(() => { @@ -78,7 +77,7 @@ export const SecretApprovalRequest = () => { setSelectedApprovalId(requestId as string); setUsingUrlRequestId(true); - }, [queryParams]); + }, [requestId]); const handleGoBackSecretRequestDetail = () => { setSelectedApprovalId(null);