diff --git a/backend/src/ee/controllers/v1/secretApprovalRequestsController.ts b/backend/src/ee/controllers/v1/secretApprovalRequestsController.ts index 915df5d7c..93096e536 100644 --- a/backend/src/ee/controllers/v1/secretApprovalRequestsController.ts +++ b/backend/src/ee/controllers/v1/secretApprovalRequestsController.ts @@ -17,12 +17,12 @@ export const getSecretApprovalRequestCount = async (req: Request, res: Response) } = await validateRequest(reqValidator.getSecretApprovalRequestCount, req); if (!(req.authData.authPayload instanceof User)) return; - + const membership = await Membership.findOne({ user: req.authData.authPayload._id, workspace: new Types.ObjectId(workspaceId) }); - + if (!membership) throw UnauthorizedRequestError(); const approvalRequestCount = await SecretApprovalRequest.aggregate([ @@ -73,12 +73,12 @@ export const getSecretApprovalRequests = async (req: Request, res: Response) => } = await validateRequest(reqValidator.getSecretApprovalRequests, req); if (!(req.authData.authPayload instanceof User)) return; - + const membership = await Membership.findOne({ user: req.authData.authPayload._id, workspace: new Types.ObjectId(workspaceId) }); - + if (!membership) throw UnauthorizedRequestError(); const query = { @@ -168,13 +168,13 @@ export const getSecretApprovalRequestDetails = async (req: Request, res: Respons user: req.authData.authPayload._id, workspace: secretApprovalRequest.workspace }); - + if (!membership) throw UnauthorizedRequestError(); // allow to fetch only if its admin or is the committer or approver if ( membership.role !== "admin" && - secretApprovalRequest.committer !== membership.id && + !secretApprovalRequest.committer.equals(membership.id) && !secretApprovalRequest.policy.approvers.find( (approverId) => approverId.toString() === membership._id.toString() ) @@ -215,7 +215,7 @@ export const updateSecretApprovalReviewStatus = async (req: Request, res: Respon user: req.authData.authPayload._id, workspace: secretApprovalRequest.workspace }); - + if (!membership) throw UnauthorizedRequestError(); if ( @@ -257,7 +257,7 @@ export const mergeSecretApprovalRequest = async (req: Request, res: Response) => user: req.authData.authPayload._id, workspace: secretApprovalRequest.workspace }); - + if (!membership) throw UnauthorizedRequestError(); if ( @@ -307,7 +307,7 @@ export const updateSecretApprovalRequestStatus = async (req: Request, res: Respo user: req.authData.authPayload._id, workspace: secretApprovalRequest.workspace }); - + if (!membership) throw UnauthorizedRequestError(); if ( diff --git a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx index 959c714b4..f6a734522 100644 --- a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx +++ b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/SecretApprovalRequest.tsx @@ -63,7 +63,7 @@ export const SecretApprovalRequest = () => { (prev, curr) => ({ ...prev, [curr._id]: curr }), {} ); - const myMembershipId = members?.find(({ user }) => user._id === presentUser._id)?._id; + const myMembershipId = members?.find(({ user }) => user._id === presentUser?._id)?._id; const isSecretApprovalScreen = Boolean(selectedApproval); const handleGoBackSecretRequestDetail = () => { @@ -101,7 +101,7 @@ export const SecretApprovalRequest = () => { exit={{ opacity: 0, translateX: 30 }} className="rounded-md text-gray-300" > -
+
{ if (evt.key === "Enter") setStatusFilter("open"); }} className={ - statusFilter === "close" ? "text-gray-500 hover:text-gray-400 duration-100" : "" + statusFilter === "close" ? "text-gray-500 duration-100 hover:text-gray-400" : "" } > @@ -118,7 +118,7 @@ export const SecretApprovalRequest = () => {
{ {isSecretApprovalReqCountSuccess && secretApprovalRequestCount.closed} Closed
-
+
-
+
{isRequestListEmpty && (
@@ -246,9 +246,9 @@ export const SecretApprovalRequest = () => { >
- +
- +
))}
diff --git a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/components/SecretApprovalRequestAction.tsx b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/components/SecretApprovalRequestAction.tsx index 73d72b4a5..9ccd76e77 100644 --- a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/components/SecretApprovalRequestAction.tsx +++ b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/components/SecretApprovalRequestAction.tsx @@ -22,6 +22,7 @@ type Props = { isMergable?: boolean; status: "close" | "open"; approvals: number; + canApprove?: boolean; statusChangeByEmail: string; workspaceId: string; }; @@ -33,7 +34,8 @@ export const SecretApprovalRequestAction = ({ isMergable, approvals, statusChangeByEmail, - workspaceId + workspaceId, + canApprove }: Props) => { const { createNotification } = useNotificationContext(); const { mutateAsync: performSecretApprovalMerge, isLoading: isMerging } = @@ -83,11 +85,11 @@ export const SecretApprovalRequestAction = ({ if (!hasMerged && status === "open") { return ( -
-
+
+
{isMergable ? "Good to merge" : "Review required"} @@ -98,25 +100,31 @@ export const SecretApprovalRequestAction = ({
- - + {canApprove ? ( + <> + + + + ) : ( +
Only approvers can merge
+ )}
); @@ -124,9 +132,9 @@ export const SecretApprovalRequestAction = ({ if (hasMerged && status === "close") return ( -
-
- +
+
+ Change request merged @@ -138,9 +146,9 @@ export const SecretApprovalRequestAction = ({ ); return ( -
-
- +
+
+ Change request has been closed diff --git a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/components/SecretApprovalRequestChanges.tsx b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/components/SecretApprovalRequestChanges.tsx index b90e156bf..4818b3cca 100644 --- a/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/components/SecretApprovalRequestChanges.tsx +++ b/frontend/src/views/SecretApprovalPage/components/SecretApprovalRequest/components/SecretApprovalRequestChanges.tsx @@ -108,6 +108,7 @@ export const SecretApprovalRequestChanges = ({ ({ user: membershipUser }) => membershipUser.email === user.email ); const myMembershipId = myMembership?._id || ""; + const canApprove = secretApprovalRequestDetails?.policy?.approvers?.includes(myMembershipId); const reviewedMembers = secretApprovalRequestDetails?.reviewers?.reduce< Record >( @@ -164,30 +165,30 @@ export const SecretApprovalRequestChanges = ({ return (
-
+
-
+
{secretApprovalRequestDetails.status}
-
-
+
+
{generateCommitText(secretApprovalRequestDetails.commits)}
-
+
{committer?.user?.firstName} {committer?.user?.lastName} ({committer?.user?.email}) wants to change{" "} {secretApprovalRequestDetails.commits.length} secret values in - + {secretApprovalRequestDetails.environment} -
+
-
{secretApprovalRequestDetails.secretPath}
+
{secretApprovalRequestDetails.secretPath}
@@ -198,7 +199,7 @@ export const SecretApprovalRequestChanges = ({ leftIcon={hasApproved && } onClick={() => handleSecretApprovalStatusUpdate(ApprovalStatus.APPROVED)} isLoading={isApproving} - isDisabled={isApproving || hasApproved} + isDisabled={isApproving || hasApproved || !canApprove} > {hasApproved ? "Approved" : "Approve"} @@ -208,7 +209,7 @@ export const SecretApprovalRequestChanges = ({ leftIcon={hasRejected && } onClick={() => handleSecretApprovalStatusUpdate(ApprovalStatus.REJECTED)} isLoading={isRejecting} - isDisabled={isRejecting || hasRejected} + isDisabled={isRejecting || hasRejected || !canApprove} > {hasRejected ? "Rejected" : "Reject"} @@ -230,8 +231,9 @@ export const SecretApprovalRequestChanges = ({ ) )}
-
+
-
+
Reviewers
{secretApprovalRequestDetails?.policy?.approvers.map((requiredApproverId) => { @@ -252,7 +254,7 @@ export const SecretApprovalRequestChanges = ({ const status = reviewedMembers?.[requiredApproverId]; return (
@@ -278,7 +280,7 @@ export const SecretApprovalRequestChanges = ({ const status = reviewedMembers?.[reviewer.status]; return (