From c730b6fff453fbd0374350ea67443a9e801faa19 Mon Sep 17 00:00:00 2001 From: Scott Wilson Date: Mon, 15 Sep 2025 17:58:40 -0700 Subject: [PATCH] improvements: address feedback --- .../app-connection-endpoints.ts | 2 +- .../app-connection/app-connection-service.ts | 60 ++++++++++--------- .../components/ExternalCaModal.tsx | 1 + 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/backend/src/server/routes/v1/app-connection-routers/app-connection-endpoints.ts b/backend/src/server/routes/v1/app-connection-routers/app-connection-endpoints.ts index 88e572426..720726c34 100644 --- a/backend/src/server/routes/v1/app-connection-routers/app-connection-endpoints.ts +++ b/backend/src/server/routes/v1/app-connection-routers/app-connection-endpoints.ts @@ -94,7 +94,7 @@ export const registerAppConnectionEndpoints = { - const project = await projectDAL.findProjectById(projectId); - - if (!project) throw new BadRequestError({ message: `Could not find project with ID ${projectId}` }); - - const { permission: projectPermission } = await permissionService.getProjectPermission({ - actor: actor.type, - actorId: actor.id, - projectId, - actorAuthMethod: actor.authMethod, - actorOrgId: actor.orgId, - actionProjectType: ActionProjectType.Any - }); - - ForbiddenError.from(projectPermission).throwUnlessCan( - ProjectPermissionAppConnectionActions.Connect, - ProjectPermissionSub.AppConnections - ); - + const listAvailableAppConnectionsForUser = async (app: AppConnection, actor: OrgServiceActor, projectId?: string) => { const { permission: orgPermission } = await permissionService.getOrgPermission( actor.type, actor.id, @@ -768,6 +750,37 @@ export const appConnectionServiceFactory = ({ actor.orgId ); + let availableProjectConnections: TAppConnections[] = []; + + if (projectId) { + const project = await projectDAL.findProjectById(projectId); + + if (!project) throw new BadRequestError({ message: `Could not find project with ID ${projectId}` }); + + const { permission: projectPermission } = await permissionService.getProjectPermission({ + actor: actor.type, + actorId: actor.id, + projectId, + actorAuthMethod: actor.authMethod, + actorOrgId: actor.orgId, + actionProjectType: ActionProjectType.Any + }); + + ForbiddenError.from(projectPermission).throwUnlessCan( + ProjectPermissionAppConnectionActions.Connect, + ProjectPermissionSub.AppConnections + ); + + const projectAppConnections = await appConnectionDAL.find({ app, projectId }); + + availableProjectConnections = projectAppConnections.filter((connection) => + projectPermission.can( + ProjectPermissionAppConnectionActions.Connect, + subject(ProjectPermissionSub.AppConnections, { connectionId: connection.id }) + ) + ); + } + const orgAppConnections = await appConnectionDAL.find({ app, orgId: actor.orgId, projectId: null }); const availableOrgConnections = orgAppConnections.filter((connection) => @@ -777,15 +790,6 @@ export const appConnectionServiceFactory = ({ ) ); - const projectAppConnections = await appConnectionDAL.find({ app, projectId }); - - const availableProjectConnections = projectAppConnections.filter((connection) => - projectPermission.can( - ProjectPermissionAppConnectionActions.Connect, - subject(ProjectPermissionSub.AppConnections, { connectionId: connection.id }) - ) - ); - return [...availableOrgConnections, ...availableProjectConnections].sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()) ) as Omit[]; diff --git a/frontend/src/pages/cert-manager/CertificateAuthoritiesPage/components/ExternalCaModal.tsx b/frontend/src/pages/cert-manager/CertificateAuthoritiesPage/components/ExternalCaModal.tsx index 5e7ab5cdd..121c32e5f 100644 --- a/frontend/src/pages/cert-manager/CertificateAuthoritiesPage/components/ExternalCaModal.tsx +++ b/frontend/src/pages/cert-manager/CertificateAuthoritiesPage/components/ExternalCaModal.tsx @@ -601,6 +601,7 @@ export const ExternalCaModal = ({ popUp, handlePopUpToggle }: Props) => { placeholder="Select connection..." getOptionLabel={(option) => option.name} getOptionValue={(option) => option.id} + components={{ Option: AppConnectionOption }} /> )}