From c7368eac0f9013dfcef7b8c5a8acab0f78c1f1c1 Mon Sep 17 00:00:00 2001
From: Tofik Hasanov
Date: Wed, 15 Apr 2026 10:41:32 -0400
Subject: [PATCH] fix(cloud-tests): sync connection state between pages and fix
reconnect flow
Three issues fixed:
1. Deleted connections still visible in cloud tests "manage connections" dialog:
- listConnections API now filters out soft-deleted (disconnected) connections
- ConnectIntegrationDialog filters disconnected connections as safety net
2. AWS credential updates not clearing reconnect banner:
- updateCredentials endpoint now sets reconnectedAt metadata for cloud providers
3. Reconnect button opens wrong flow (manage dialog instead of fresh setup):
- Reconnect now deletes all connections for the provider and redirects to
the integrations detail page for a clean re-setup
- New connections get createdAt after cutoff so warning banner disappears
Co-Authored-By: Claude Opus 4.6 (1M context)
---
.../controllers/connections.controller.ts | 36 ++++++++++--------
.../cloud-tests/components/ProviderTabs.tsx | 11 +++++-
.../cloud-tests/components/TestsLayout.tsx | 37 +++++++++++++++++++
.../integrations/ConnectIntegrationDialog.tsx | 4 +-
4 files changed, 70 insertions(+), 18 deletions(-)
diff --git a/apps/api/src/integration-platform/controllers/connections.controller.ts b/apps/api/src/integration-platform/controllers/connections.controller.ts
index e318dce508..f605b8e05e 100644
--- a/apps/api/src/integration-platform/controllers/connections.controller.ts
+++ b/apps/api/src/integration-platform/controllers/connections.controller.ts
@@ -262,7 +262,7 @@ export class ConnectionsController {
}
/**
- * List connections for an organization
+ * List connections for an organization (excludes soft-deleted/disconnected)
*/
@Get()
@RequirePermission('integration', 'read')
@@ -270,20 +270,22 @@ export class ConnectionsController {
const connections =
await this.connectionService.getOrganizationConnections(organizationId);
- return connections.map((c) => ({
- id: c.id,
- providerId: c.providerId,
- providerSlug: (c as any).provider?.slug,
- providerName: (c as any).provider?.name,
- status: c.status,
- authStrategy: c.authStrategy,
- lastSyncAt: c.lastSyncAt,
- nextSyncAt: c.nextSyncAt,
- errorMessage: c.errorMessage,
- variables: c.variables,
- metadata: c.metadata,
- createdAt: c.createdAt,
- }));
+ return connections
+ .filter((c) => c.status !== 'disconnected')
+ .map((c) => ({
+ id: c.id,
+ providerId: c.providerId,
+ providerSlug: (c as any).provider?.slug,
+ providerName: (c as any).provider?.name,
+ status: c.status,
+ authStrategy: c.authStrategy,
+ lastSyncAt: c.lastSyncAt,
+ nextSyncAt: c.nextSyncAt,
+ errorMessage: c.errorMessage,
+ variables: c.variables,
+ metadata: c.metadata,
+ createdAt: c.createdAt,
+ }));
}
/**
@@ -1178,6 +1180,10 @@ export class ConnectionsController {
if (Array.isArray(mergedCredentials.regions)) {
metaUpdates.regions = mergedCredentials.regions;
}
+ // Mark cloud credential updates as reconnections so reconnect banners clear
+ if (manifest.category === 'Cloud') {
+ metaUpdates.reconnectedAt = new Date().toISOString();
+ }
if (Object.keys(metaUpdates).length > 0) {
const existingMeta =
(connection.metadata as Record) ?? {};
diff --git a/apps/app/src/app/(app)/[orgId]/cloud-tests/components/ProviderTabs.tsx b/apps/app/src/app/(app)/[orgId]/cloud-tests/components/ProviderTabs.tsx
index b414cbd5ba..0df49c479e 100644
--- a/apps/app/src/app/(app)/[orgId]/cloud-tests/components/ProviderTabs.tsx
+++ b/apps/app/src/app/(app)/[orgId]/cloud-tests/components/ProviderTabs.tsx
@@ -23,11 +23,13 @@ interface ProviderTabsProps {
onConnectionTabChange: (providerType: string, connectionId: string) => void;
onRunScan: (connectionId?: string) => Promise;
onAddConnection: (providerType: string) => void;
+ onReconnect: (providerType: string) => void;
onConfigure: (provider: Provider) => void;
needsConfiguration: (provider: Provider) => boolean;
requiresReconnect: (provider: Provider) => boolean;
canRunScan?: boolean;
canAddConnection?: boolean;
+ isReconnecting?: boolean;
orgId: string;
}
@@ -235,11 +237,13 @@ export function ProviderTabs({
onConnectionTabChange,
onRunScan,
onAddConnection,
+ onReconnect,
onConfigure,
needsConfiguration,
requiresReconnect,
canRunScan,
canAddConnection,
+ isReconnecting,
orgId,
}: ProviderTabsProps) {
return (
@@ -328,7 +332,12 @@ export function ProviderTabs({
{canAddConnection !== false && (
-