Fix: Multiple approvers acceptance bug

This commit is contained in:
Daniel Hougaard
2024-05-07 17:30:35 +02:00
parent da5278f6bf
commit 32a110e0ca
2 changed files with 46 additions and 26 deletions
@@ -274,8 +274,8 @@ export const accessApprovalRequestServiceFactory = ({
const approvedReviews = allReviews.filter((r) => r.status === ApprovalStatus.APPROVED); const approvedReviews = allReviews.filter((r) => r.status === ApprovalStatus.APPROVED);
// If all approvers have approved the request, update the privilege to approved // approvals is the required number of approvals. If the number of approved reviews is equal to the number of required approvals, then the request is approved.
if (approvedReviews.length === policy.approvers.length) { if (approvedReviews.length === policy.approvals) {
if (accessApprovalRequest.isTemporary && !accessApprovalRequest.temporaryRange) { if (accessApprovalRequest.isTemporary && !accessApprovalRequest.temporaryRange) {
throw new BadRequestError({ message: "Temporary range is required for temporary access" }); throw new BadRequestError({ message: "Temporary range is required for temporary access" });
} }
@@ -284,27 +284,33 @@ export const accessApprovalRequestServiceFactory = ({
if (!accessApprovalRequest.isTemporary && !accessApprovalRequest.temporaryRange) { if (!accessApprovalRequest.isTemporary && !accessApprovalRequest.temporaryRange) {
// Permanent access // Permanent access
const privilege = await additionalPrivilegeDAL.create({ const privilege = await additionalPrivilegeDAL.create(
projectMembershipId: accessApprovalRequest.requestedBy, {
slug: `requested-privilege-${slugify(alphaNumericNanoId(12))}`, projectMembershipId: accessApprovalRequest.requestedBy,
permissions: JSON.stringify(accessApprovalRequest.permissions) slug: `requested-privilege-${slugify(alphaNumericNanoId(12))}`,
}); permissions: JSON.stringify(accessApprovalRequest.permissions)
},
tx
);
privilegeId = privilege.id; privilegeId = privilege.id;
} else { } else {
// Temporary access // Temporary access
const relativeTempAllocatedTimeInMs = ms(accessApprovalRequest.temporaryRange!); const relativeTempAllocatedTimeInMs = ms(accessApprovalRequest.temporaryRange!);
const startTime = new Date(); const startTime = new Date();
const privilege = await additionalPrivilegeDAL.create({ const privilege = await additionalPrivilegeDAL.create(
projectMembershipId: accessApprovalRequest.requestedBy, {
slug: `requested-privilege-${slugify(alphaNumericNanoId(12))}`, projectMembershipId: accessApprovalRequest.requestedBy,
permissions: JSON.stringify(accessApprovalRequest.permissions), slug: `requested-privilege-${slugify(alphaNumericNanoId(12))}`,
isTemporary: true, permissions: JSON.stringify(accessApprovalRequest.permissions),
temporaryMode: ProjectUserAdditionalPrivilegeTemporaryMode.Relative, isTemporary: true,
temporaryRange: accessApprovalRequest.temporaryRange!, temporaryMode: ProjectUserAdditionalPrivilegeTemporaryMode.Relative,
temporaryAccessStartTime: startTime, temporaryRange: accessApprovalRequest.temporaryRange!,
temporaryAccessEndTime: new Date(new Date(startTime).getTime() + relativeTempAllocatedTimeInMs) temporaryAccessStartTime: startTime,
}); temporaryAccessEndTime: new Date(new Date(startTime).getTime() + relativeTempAllocatedTimeInMs)
},
tx
);
privilegeId = privilege.id; privilegeId = privilege.id;
} }
@@ -342,12 +342,14 @@ export const AccessApprovalRequest = ({
displayData = { label: "Access Granted", colorClass: "bg-green/20 text-green" }; displayData = { label: "Access Granted", colorClass: "bg-green/20 text-green" };
else if (isRejectedByAnyone) else if (isRejectedByAnyone)
displayData = { label: "Rejected", colorClass: "bg-red/20 text-red" }; displayData = { label: "Rejected", colorClass: "bg-red/20 text-red" };
else if (userReviewStatus === ApprovalStatus.APPROVED) else if (userReviewStatus === ApprovalStatus.APPROVED) {
displayData = { displayData = {
label: `Pending ${request.policy.approvals - request.reviewers.length} reviews`, label: `Pending ${request.policy.approvals - request.reviewers.length} review${
request.policy.approvals - request.reviewers.length > 1 ? "s" : ""
}`,
colorClass: "bg-yellow/20 text-yellow" colorClass: "bg-yellow/20 text-yellow"
}; };
else if (!isReviewedByUser) } else if (!isReviewedByUser)
displayData = { displayData = {
label: "Review Required", label: "Review Required",
colorClass: "bg-yellow/20 text-yellow" colorClass: "bg-yellow/20 text-yellow"
@@ -499,14 +501,21 @@ export const AccessApprovalRequest = ({
return ( return (
<div <div
aria-disabled={details.isReviewedByUser || details.isRejectedByAnyone} aria-disabled={
details.isReviewedByUser || details.isRejectedByAnyone || details.isAccepted
}
key={request.id} key={request.id}
className="flex w-full cursor-pointer px-8 py-4 hover:bg-mineshaft-700 aria-disabled:opacity-80" className="flex w-full cursor-pointer px-8 py-4 hover:bg-mineshaft-700 aria-disabled:opacity-80"
role="button" role="button"
tabIndex={0} tabIndex={0}
onClick={() => { onClick={() => {
if (!details.isApprover) return; if (
if (details.isReviewedByUser || details.isRejectedByAnyone) return; !details.isApprover ||
details.isReviewedByUser ||
details.isRejectedByAnyone ||
details.isAccepted
)
return;
setSelectedRequest({ setSelectedRequest({
...request, ...request,
@@ -515,8 +524,13 @@ export const AccessApprovalRequest = ({
handlePopUpOpen("reviewRequest"); handlePopUpOpen("reviewRequest");
}} }}
onKeyDown={(evt) => { onKeyDown={(evt) => {
if (!details.isApprover) return; if (
if (details.isReviewedByUser || details.isRejectedByAnyone) return; !details.isApprover ||
details.isAccepted ||
details.isReviewedByUser ||
details.isRejectedByAnyone
)
return;
if (evt.key === "Enter") { if (evt.key === "Enter") {
setSelectedRequest({ setSelectedRequest({
...request, ...request,
@@ -543,7 +557,7 @@ export const AccessApprovalRequest = ({
</> </>
)} )}
</div> </div>
<div className=""> <div>
{details.isApprover && ( {details.isApprover && (
<DisplayBadge <DisplayBadge
text={details.displayData.label} text={details.displayData.label}