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 = ({
-
-
}
- isDisabled={!isMergable}
- isLoading={isMerging}
- onClick={handleSecretApprovalRequestMerge}
- colorSchema="primary"
- variant="solid"
- >
- Merge
-
+ {canApprove ? (
+ <>
+
+
}
+ isDisabled={!isMergable}
+ isLoading={isMerging}
+ onClick={handleSecretApprovalRequestMerge}
+ colorSchema="primary"
+ variant="solid"
+ >
+ Merge
+
+ >
+ ) : (
+
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 (