diff --git a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.test.ts b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.test.ts index dd2f4fb1984..0ed9a961600 100644 --- a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.test.ts +++ b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.test.ts @@ -237,7 +237,7 @@ describe('Knowledge Connector By ID API Route', () => { .mockReturnValueOnce(mockDbChain) .mockResolvedValueOnce([{ id: 'doc-1', fileUrl: '/api/uploads/test.txt' }]) .mockReturnValueOnce(mockDbChain) - mockDbChain.limit.mockResolvedValueOnce([{ id: 'conn-456' }]) + mockDbChain.limit.mockResolvedValueOnce([{ id: 'conn-456', connectorType: 'jira' }]) mockDbChain.returning.mockResolvedValueOnce([{ id: 'conn-456' }]) const req = createMockRequest('DELETE') diff --git a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.ts b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.ts index 0d8212c98fd..d1b7e1054d7 100644 --- a/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.ts +++ b/apps/sim/app/api/knowledge/[id]/connectors/[connectorId]/route.ts @@ -292,7 +292,10 @@ export async function DELETE(request: NextRequest, { params }: RouteParams) { return NextResponse.json({ error: 'Connector not found' }, { status: 404 }) } - const connectorDocuments = await db.transaction(async (tx) => { + const { searchParams } = new URL(request.url) + const deleteDocuments = searchParams.get('deleteDocuments') === 'true' + + const { deletedDocs, docCount } = await db.transaction(async (tx) => { await tx.execute(sql`SELECT 1 FROM knowledge_connector WHERE id = ${connectorId} FOR UPDATE`) const docs = await tx @@ -306,10 +309,12 @@ export async function DELETE(request: NextRequest, { params }: RouteParams) { ) ) - const documentIds = docs.map((doc) => doc.id) - if (documentIds.length > 0) { - await tx.delete(embedding).where(inArray(embedding.documentId, documentIds)) - await tx.delete(document).where(inArray(document.id, documentIds)) + if (deleteDocuments) { + const documentIds = docs.map((doc) => doc.id) + if (documentIds.length > 0) { + await tx.delete(embedding).where(inArray(embedding.documentId, documentIds)) + await tx.delete(document).where(inArray(document.id, documentIds)) + } } const deletedConnectors = await tx @@ -328,16 +333,23 @@ export async function DELETE(request: NextRequest, { params }: RouteParams) { throw new Error('Connector not found') } - return docs + return { deletedDocs: deleteDocuments ? docs : [], docCount: docs.length } }) - await deleteDocumentStorageFiles(connectorDocuments, requestId) - - await cleanupUnusedTagDefinitions(knowledgeBaseId, requestId).catch((error) => { - logger.warn(`[${requestId}] Failed to cleanup tag definitions`, error) - }) + if (deleteDocuments) { + await Promise.all([ + deletedDocs.length > 0 + ? deleteDocumentStorageFiles(deletedDocs, requestId) + : Promise.resolve(), + cleanupUnusedTagDefinitions(knowledgeBaseId, requestId).catch((error) => { + logger.warn(`[${requestId}] Failed to cleanup tag definitions`, error) + }), + ]) + } - logger.info(`[${requestId}] Hard-deleted connector ${connectorId} and its documents`) + logger.info( + `[${requestId}] Deleted connector ${connectorId}${deleteDocuments ? ` and ${docCount} documents` : `, kept ${docCount} documents`}` + ) recordAudit({ workspaceId: writeCheck.knowledgeBase.workspaceId, @@ -349,7 +361,11 @@ export async function DELETE(request: NextRequest, { params }: RouteParams) { resourceId: connectorId, resourceName: existingConnector[0].connectorType, description: `Deleted connector from knowledge base "${writeCheck.knowledgeBase.name}"`, - metadata: { knowledgeBaseId, documentsDeleted: connectorDocuments.length }, + metadata: { + knowledgeBaseId, + documentsDeleted: deleteDocuments ? docCount : 0, + documentsKept: deleteDocuments ? 0 : docCount, + }, request, }) diff --git a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx index e7d9603da82..5144ce5d8ab 100644 --- a/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx +++ b/apps/sim/app/workspace/[workspaceId]/knowledge/[id]/components/add-connector-modal/add-connector-modal.tsx @@ -373,7 +373,7 @@ export function AddConnectorModal({ open, onOpenChange, knowledgeBaseId }: AddCo
{/* Auth: API key input or OAuth credential selection */} {isApiKeyMode ? ( -
+
) : ( -
+
{credentialsLoading ? (
@@ -442,7 +442,7 @@ export function AddConnectorModal({ open, onOpenChange, knowledgeBaseId }: AddCo canonicalId && (canonicalGroups.get(canonicalId)?.length ?? 0) === 2 return ( -
+