Skip to content

Commit 2ae8145

Browse files
improvement(migration): move credential selector automigration logic to server side (#3310)
* improvement(credentials): move client side automigration to server side * fix migration func * fix tests * address bugbot
1 parent e55d41f commit 2ae8145

File tree

6 files changed

+184
-47
lines changed

6 files changed

+184
-47
lines changed

apps/sim/app/api/workflows/[id]/deployed/route.ts

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,8 @@
1-
import { db, workflowDeploymentVersion } from '@sim/db'
21
import { createLogger } from '@sim/logger'
3-
import { and, desc, eq } from 'drizzle-orm'
42
import type { NextRequest, NextResponse } from 'next/server'
53
import { verifyInternalToken } from '@/lib/auth/internal'
64
import { generateRequestId } from '@/lib/core/utils/request'
5+
import { loadDeployedWorkflowState } from '@/lib/workflows/persistence/utils'
76
import { validateWorkflowPermissions } from '@/lib/workflows/utils'
87
import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/utils'
98

@@ -43,21 +42,21 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
4342
logger.debug(`[${requestId}] Internal API call for deployed workflow: ${id}`)
4443
}
4544

46-
const [active] = await db
47-
.select({ state: workflowDeploymentVersion.state })
48-
.from(workflowDeploymentVersion)
49-
.where(
50-
and(
51-
eq(workflowDeploymentVersion.workflowId, id),
52-
eq(workflowDeploymentVersion.isActive, true)
53-
)
54-
)
55-
.orderBy(desc(workflowDeploymentVersion.createdAt))
56-
.limit(1)
45+
let deployedState = null
46+
try {
47+
const data = await loadDeployedWorkflowState(id)
48+
deployedState = {
49+
blocks: data.blocks,
50+
edges: data.edges,
51+
loops: data.loops,
52+
parallels: data.parallels,
53+
variables: data.variables,
54+
}
55+
} catch {
56+
deployedState = null
57+
}
5758

58-
const response = createSuccessResponse({
59-
deployedState: active?.state || null,
60-
})
59+
const response = createSuccessResponse({ deployedState })
6160
return addNoCacheHeaders(response)
6261
} catch (error: any) {
6362
logger.error(`[${requestId}] Error fetching deployed state: ${id}`, error)

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/credential-selector/credential-selector.tsx

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@ import { useCredentialSets } from '@/hooks/queries/credential-sets'
2424
import { useOAuthCredentials } from '@/hooks/queries/oauth-credentials'
2525
import { useOrganizations } from '@/hooks/queries/organization'
2626
import { useSubscriptionData } from '@/hooks/queries/subscription'
27-
import { useCollaborativeWorkflow } from '@/hooks/use-collaborative-workflow'
2827
import { useCredentialRefreshTriggers } from '@/hooks/use-credential-refresh-triggers'
2928
import { getMissingRequiredScopes } from '@/hooks/use-oauth-scope-status'
3029
import { useWorkflowRegistry } from '@/stores/workflows/registry/store'
@@ -55,7 +54,6 @@ export function CredentialSelector({
5554
const [isEditing, setIsEditing] = useState(false)
5655
const { activeWorkflowId } = useWorkflowRegistry()
5756
const [storeValue, setStoreValue] = useSubBlockValue<string | null>(blockId, subBlock.id)
58-
const { collaborativeSetSubblockValue } = useCollaborativeWorkflow()
5957

6058
const requiredScopes = subBlock.requiredScopes || []
6159
const label = subBlock.placeholder || 'Select credential'
@@ -136,11 +134,6 @@ export function CredentialSelector({
136134
if (!response.ok || cancelled) return
137135
const data = await response.json()
138136
if (!cancelled && data.credential?.displayName) {
139-
if (data.credential.id !== selectedId) {
140-
collaborativeSetSubblockValue(blockId, subBlock.id, data.credential.id, {
141-
skipDependsOn: true,
142-
})
143-
}
144137
setInaccessibleCredentialName(data.credential.displayName)
145138
}
146139
} catch {

apps/sim/app/workspace/[workspaceId]/w/[workflowId]/components/panel/components/editor/components/sub-block/components/tool-input/components/tools/credential-selector.tsx

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -114,9 +114,6 @@ export function ToolCredentialSelector({
114114
if (!response.ok || cancelled) return
115115
const data = await response.json()
116116
if (!cancelled && data.credential?.displayName) {
117-
if (data.credential.id !== selectedId) {
118-
onChangeRef.current(data.credential.id)
119-
}
120117
setInaccessibleCredentialName(data.credential.displayName)
121118
}
122119
} catch {

apps/sim/hooks/use-collaborative-workflow.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1232,12 +1232,7 @@ export function useCollaborativeWorkflow() {
12321232
)
12331233

12341234
const collaborativeSetSubblockValue = useCallback(
1235-
(
1236-
blockId: string,
1237-
subblockId: string,
1238-
value: any,
1239-
options?: { _visited?: Set<string>; skipDependsOn?: boolean }
1240-
) => {
1235+
(blockId: string, subblockId: string, value: any, options?: { _visited?: Set<string> }) => {
12411236
if (isApplyingRemoteChange.current) return
12421237

12431238
if (isBaselineDiffView) {
@@ -1263,8 +1258,6 @@ export function useCollaborativeWorkflow() {
12631258
})
12641259
}
12651260

1266-
if (options?.skipDependsOn) return
1267-
12681261
// Handle dependent subblock clearing (recursive calls)
12691262
try {
12701263
const visited = options?._visited || new Set<string>()

apps/sim/lib/workflows/persistence/utils.test.ts

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,9 @@ describe('Database Helpers', () => {
329329
if (callCount === 3) {
330330
return Promise.resolve(mockSubflowsFromDb)
331331
}
332+
if (callCount === 4) {
333+
return { limit: vi.fn().mockResolvedValue([{ workspaceId: 'test-workspace-id' }]) }
334+
}
332335
return Promise.resolve([])
333336
}),
334337
}),
@@ -431,6 +434,8 @@ describe('Database Helpers', () => {
431434
if (callCount === 1) return Promise.resolve(mockBlocksFromDb)
432435
if (callCount === 2) return Promise.resolve(mockEdgesFromDb)
433436
if (callCount === 3) return Promise.resolve(subflowsWithUnknownType)
437+
if (callCount === 4)
438+
return { limit: vi.fn().mockResolvedValue([{ workspaceId: 'test-workspace-id' }]) }
434439
return Promise.resolve([])
435440
}),
436441
}),
@@ -469,6 +474,8 @@ describe('Database Helpers', () => {
469474
if (callCount === 1) return Promise.resolve(malformedBlocks)
470475
if (callCount === 2) return Promise.resolve([])
471476
if (callCount === 3) return Promise.resolve([])
477+
if (callCount === 4)
478+
return { limit: vi.fn().mockResolvedValue([{ workspaceId: 'test-workspace-id' }]) }
472479
return Promise.resolve([])
473480
}),
474481
}),
@@ -851,6 +858,8 @@ describe('Database Helpers', () => {
851858
if (callCount === 1) return Promise.resolve(testBlocks)
852859
if (callCount === 2) return Promise.resolve([])
853860
if (callCount === 3) return Promise.resolve([])
861+
if (callCount === 4)
862+
return { limit: vi.fn().mockResolvedValue([{ workspaceId: 'test-workspace-id' }]) }
854863
return Promise.resolve([])
855864
}),
856865
}),
@@ -888,6 +897,8 @@ describe('Database Helpers', () => {
888897
where: vi.fn().mockImplementation(() => {
889898
callCount++
890899
if (callCount === 1) return Promise.resolve(blocksWithDefaultValues)
900+
if (callCount === 4)
901+
return { limit: vi.fn().mockResolvedValue([{ workspaceId: 'test-workspace-id' }]) }
891902
return Promise.resolve([])
892903
}),
893904
}),
@@ -957,6 +968,8 @@ describe('Database Helpers', () => {
957968
if (callCount === 1) return Promise.resolve([originalBlock, duplicatedBlock])
958969
if (callCount === 2) return Promise.resolve([])
959970
if (callCount === 3) return Promise.resolve([])
971+
if (callCount === 4)
972+
return { limit: vi.fn().mockResolvedValue([{ workspaceId: 'test-workspace-id' }]) }
960973
return Promise.resolve([])
961974
}),
962975
}),
@@ -1053,6 +1066,8 @@ describe('Database Helpers', () => {
10531066
where: vi.fn().mockImplementation(() => {
10541067
callCount++
10551068
if (callCount === 1) return Promise.resolve([basicBlock, advancedBlock])
1069+
if (callCount === 4)
1070+
return { limit: vi.fn().mockResolvedValue([{ workspaceId: 'test-workspace-id' }]) }
10561071
return Promise.resolve([])
10571072
}),
10581073
}),
@@ -1137,6 +1152,8 @@ describe('Database Helpers', () => {
11371152
},
11381153
])
11391154
}
1155+
if (callCount === 4)
1156+
return { limit: vi.fn().mockResolvedValue([{ workspaceId: 'test-workspace-id' }]) }
11401157
return Promise.resolve([])
11411158
}),
11421159
}),

0 commit comments

Comments
 (0)