From 19ff045d2ebbb3cac5e63935336bf9f026d80cc2 Mon Sep 17 00:00:00 2001 From: Scott Wilson Date: Tue, 1 Jul 2025 16:13:14 -0700 Subject: [PATCH] improvement: address feedback --- .../v1/access-approval-request-router.ts | 4 +- .../v1/secret-approval-request-router.ts | 6 +- .../access-approval-request-dal.ts | 8 +- .../access-approval-request-service.ts | 3 +- .../access-approval-request-types.ts | 1 + .../secret-approval-request-dal.ts | 5 +- .../secret-approval-request-service.ts | 11 +- .../secret-approval-request-types.ts | 2 +- .../DeleteActionModal/DeleteActionModal.tsx | 4 +- .../src/hooks/api/accessApproval/queries.tsx | 13 +- .../src/hooks/api/accessApproval/types.ts | 1 + .../api/secretApprovalRequest/queries.tsx | 17 ++- .../hooks/api/secretApprovalRequest/types.ts | 1 + .../MinimizedOrgSidebar.tsx | 5 +- .../ApprovalPolicyList/ApprovalPolicyList.tsx | 55 ++----- .../components/RemoveApprovalPolicyModal.tsx | 135 ++++++++++++++++++ 16 files changed, 201 insertions(+), 70 deletions(-) create mode 100644 frontend/src/pages/secret-manager/SecretApprovalsPage/components/ApprovalPolicyList/components/RemoveApprovalPolicyModal.tsx diff --git a/backend/src/ee/routes/v1/access-approval-request-router.ts b/backend/src/ee/routes/v1/access-approval-request-router.ts index 8a6b2be88..7a70d6374 100644 --- a/backend/src/ee/routes/v1/access-approval-request-router.ts +++ b/backend/src/ee/routes/v1/access-approval-request-router.ts @@ -60,7 +60,8 @@ export const registerAccessApprovalRequestRouter = async (server: FastifyZodProv method: "GET", schema: { querystring: z.object({ - projectSlug: z.string().trim() + projectSlug: z.string().trim(), + policyId: z.string().trim().optional() }), response: { 200: z.object({ @@ -73,6 +74,7 @@ export const registerAccessApprovalRequestRouter = async (server: FastifyZodProv handler: async (req) => { const { count } = await server.services.accessApprovalRequest.getCount({ projectSlug: req.query.projectSlug, + policyId: req.query.policyId, actor: req.permission.type, actorId: req.permission.id, actorOrgId: req.permission.orgId, diff --git a/backend/src/ee/routes/v1/secret-approval-request-router.ts b/backend/src/ee/routes/v1/secret-approval-request-router.ts index e558062b1..d53124e52 100644 --- a/backend/src/ee/routes/v1/secret-approval-request-router.ts +++ b/backend/src/ee/routes/v1/secret-approval-request-router.ts @@ -94,7 +94,8 @@ export const registerSecretApprovalRequestRouter = async (server: FastifyZodProv }, schema: { querystring: z.object({ - workspaceId: z.string().trim() + workspaceId: z.string().trim(), + policyId: z.string().trim().optional() }), response: { 200: z.object({ @@ -112,7 +113,8 @@ export const registerSecretApprovalRequestRouter = async (server: FastifyZodProv actorId: req.permission.id, actorAuthMethod: req.permission.authMethod, actorOrgId: req.permission.orgId, - projectId: req.query.workspaceId + projectId: req.query.workspaceId, + policyId: req.query.policyId }); return { approvals }; } diff --git a/backend/src/ee/services/access-approval-request/access-approval-request-dal.ts b/backend/src/ee/services/access-approval-request/access-approval-request-dal.ts index 33e9f7a32..671d2c1de 100644 --- a/backend/src/ee/services/access-approval-request/access-approval-request-dal.ts +++ b/backend/src/ee/services/access-approval-request/access-approval-request-dal.ts @@ -220,7 +220,7 @@ export interface TAccessApprovalRequestDALFactory extends Omit; - getCount: ({ projectId }: { projectId: string }) => Promise<{ + getCount: ({ projectId }: { projectId: string; policyId?: string }) => Promise<{ pendingCount: number; finalizedCount: number; }>; @@ -702,7 +702,7 @@ export const accessApprovalRequestDALFactory = (db: TDbClient): TAccessApprovalR } }; - const getCount: TAccessApprovalRequestDALFactory["getCount"] = async ({ projectId }) => { + const getCount: TAccessApprovalRequestDALFactory["getCount"] = async ({ projectId, policyId }) => { try { const accessRequests = await db .replicaNode()(TableName.AccessApprovalRequest) @@ -723,8 +723,10 @@ export const accessApprovalRequestDALFactory = (db: TDbClient): TAccessApprovalR `${TableName.AccessApprovalRequest}.id`, `${TableName.AccessApprovalRequestReviewer}.requestId` ) - .where(`${TableName.Environment}.projectId`, projectId) + .where((qb) => { + if (policyId) void qb.where(`${TableName.AccessApprovalPolicy}.id`, policyId); + }) .select(selectAllTableCols(TableName.AccessApprovalRequest)) .select(db.ref("status").withSchema(TableName.AccessApprovalRequestReviewer).as("reviewerStatus")) .select(db.ref("reviewerUserId").withSchema(TableName.AccessApprovalRequestReviewer).as("reviewerUserId")) diff --git a/backend/src/ee/services/access-approval-request/access-approval-request-service.ts b/backend/src/ee/services/access-approval-request/access-approval-request-service.ts index 5a3af5aa5..9fa3e5651 100644 --- a/backend/src/ee/services/access-approval-request/access-approval-request-service.ts +++ b/backend/src/ee/services/access-approval-request/access-approval-request-service.ts @@ -560,6 +560,7 @@ export const accessApprovalRequestServiceFactory = ({ const getCount: TAccessApprovalRequestServiceFactory["getCount"] = async ({ projectSlug, + policyId, actor, actorAuthMethod, actorId, @@ -580,7 +581,7 @@ export const accessApprovalRequestServiceFactory = ({ throw new ForbiddenRequestError({ message: "You are not a member of this project" }); } - const count = await accessApprovalRequestDAL.getCount({ projectId: project.id }); + const count = await accessApprovalRequestDAL.getCount({ projectId: project.id, policyId }); return { count }; }; diff --git a/backend/src/ee/services/access-approval-request/access-approval-request-types.ts b/backend/src/ee/services/access-approval-request/access-approval-request-types.ts index 2550f2a96..9066aec8f 100644 --- a/backend/src/ee/services/access-approval-request/access-approval-request-types.ts +++ b/backend/src/ee/services/access-approval-request/access-approval-request-types.ts @@ -12,6 +12,7 @@ export type TVerifyPermission = { export type TGetAccessRequestCountDTO = { projectSlug: string; + policyId?: string; } & Omit; export type TReviewAccessRequestDTO = { diff --git a/backend/src/ee/services/secret-approval-request/secret-approval-request-dal.ts b/backend/src/ee/services/secret-approval-request/secret-approval-request-dal.ts index 5e1e546d6..ec6a17d97 100644 --- a/backend/src/ee/services/secret-approval-request/secret-approval-request-dal.ts +++ b/backend/src/ee/services/secret-approval-request/secret-approval-request-dal.ts @@ -290,7 +290,7 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => { } }; - const findProjectRequestCount = async (projectId: string, userId: string, tx?: Knex) => { + const findProjectRequestCount = async (projectId: string, userId: string, policyId?: string, tx?: Knex) => { try { const docs = await (tx || db) .with( @@ -309,6 +309,9 @@ export const secretApprovalRequestDALFactory = (db: TDbClient) => { `${TableName.SecretApprovalPolicy}.id` ) .where({ projectId }) + .where((qb) => { + if (policyId) void qb.where(`${TableName.SecretApprovalPolicy}.id`, policyId); + }) .andWhere( (bd) => void bd 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 49f336111..ddbb133c2 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 @@ -168,7 +168,14 @@ export const secretApprovalRequestServiceFactory = ({ microsoftTeamsService, folderCommitService }: TSecretApprovalRequestServiceFactoryDep) => { - const requestCount = async ({ projectId, actor, actorId, actorOrgId, actorAuthMethod }: TApprovalRequestCountDTO) => { + const requestCount = async ({ + projectId, + policyId, + actor, + actorId, + actorOrgId, + actorAuthMethod + }: TApprovalRequestCountDTO) => { if (actor === ActorType.SERVICE) throw new BadRequestError({ message: "Cannot use service token" }); await permissionService.getProjectPermission({ @@ -180,7 +187,7 @@ export const secretApprovalRequestServiceFactory = ({ actionProjectType: ActionProjectType.SecretManager }); - const count = await secretApprovalRequestDAL.findProjectRequestCount(projectId, actorId); + const count = await secretApprovalRequestDAL.findProjectRequestCount(projectId, actorId, policyId); return count; }; diff --git a/backend/src/ee/services/secret-approval-request/secret-approval-request-types.ts b/backend/src/ee/services/secret-approval-request/secret-approval-request-types.ts index 2fdb0bb9d..4d4273d27 100644 --- a/backend/src/ee/services/secret-approval-request/secret-approval-request-types.ts +++ b/backend/src/ee/services/secret-approval-request/secret-approval-request-types.ts @@ -84,7 +84,7 @@ export type TReviewRequestDTO = { comment?: string; } & Omit; -export type TApprovalRequestCountDTO = TProjectPermission; +export type TApprovalRequestCountDTO = TProjectPermission & { policyId?: string }; export type TListApprovalsDTO = { projectId: string; diff --git a/frontend/src/components/v2/DeleteActionModal/DeleteActionModal.tsx b/frontend/src/components/v2/DeleteActionModal/DeleteActionModal.tsx index 2fdb56c8c..245939fa4 100644 --- a/frontend/src/components/v2/DeleteActionModal/DeleteActionModal.tsx +++ b/frontend/src/components/v2/DeleteActionModal/DeleteActionModal.tsx @@ -20,6 +20,7 @@ type Props = { children?: ReactNode; deletionMessage?: ReactNode; buttonColorSchema?: "danger" | "primary" | "secondary" | "gray" | null; + isDisabled?: boolean; }; export const DeleteActionModal = ({ @@ -34,6 +35,7 @@ export const DeleteActionModal = ({ formContent, deletionMessage, buttonColorSchema = "danger", + isDisabled, children }: Props): JSX.Element => { const [inputData, setInputData] = useState(""); @@ -70,7 +72,7 @@ export const DeleteActionModal = ({