Skip to content

Commit a264ee9

Browse files
author
test
committed
refactor: inline workflow access wrappers
Call validateWorkflowAccess directly in workflow deployment lifecycle routes and clean up the related test helper formatting raised in review.
1 parent f2a4847 commit a264ee9

File tree

4 files changed

+52
-94
lines changed

4 files changed

+52
-94
lines changed

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

Lines changed: 26 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import { and, desc, eq } from 'drizzle-orm'
44
import type { NextRequest } from 'next/server'
55
import { getAuditActorMetadata } from '@/lib/audit/actor-metadata'
66
import { AuditAction, AuditResourceType, recordAudit } from '@/lib/audit/log'
7-
import type { AuthResult } from '@/lib/auth/hybrid'
87
import { generateRequestId } from '@/lib/core/utils/request'
98
import { removeMcpToolsForWorkflow, syncMcpToolsForWorkflow } from '@/lib/mcp/workflow-mcp-sync'
109
import {
@@ -31,36 +30,6 @@ const logger = createLogger('WorkflowDeployAPI')
3130
export const dynamic = 'force-dynamic'
3231
export const runtime = 'nodejs'
3332

34-
type LifecycleAdminAccessResult = {
35-
error: { message: string; status: number } | null | undefined
36-
auth: AuthResult | null | undefined
37-
workflow: Awaited<ReturnType<typeof validateWorkflowAccess>>['workflow'] | null | undefined
38-
}
39-
40-
async function validateLifecycleAdminAccess(
41-
request: NextRequest,
42-
workflowId: string
43-
): Promise<LifecycleAdminAccessResult> {
44-
const hybridAccess = await validateWorkflowAccess(request, workflowId, {
45-
requireDeployment: false,
46-
action: 'admin',
47-
})
48-
49-
if (hybridAccess.error) {
50-
return {
51-
error: hybridAccess.error,
52-
auth: hybridAccess.auth,
53-
workflow: hybridAccess.workflow,
54-
}
55-
}
56-
57-
return {
58-
error: null,
59-
auth: hybridAccess.auth,
60-
workflow: hybridAccess.workflow,
61-
}
62-
}
63-
6433
export async function GET(request: NextRequest, { params }: { params: Promise<{ id: string }> }) {
6534
const requestId = generateRequestId()
6635
const { id } = await params
@@ -147,11 +116,17 @@ export async function POST(request: NextRequest, { params }: { params: Promise<{
147116
const { id } = await params
148117

149118
try {
150-
const { auth, error, workflow: workflowData } = await validateLifecycleAdminAccess(request, id)
151-
if (error) {
152-
return createErrorResponse(error.message, error.status)
119+
const access = await validateWorkflowAccess(request, id, {
120+
requireDeployment: false,
121+
action: 'admin',
122+
})
123+
if (access.error) {
124+
return createErrorResponse(access.error.message, access.error.status)
153125
}
154126

127+
const auth = access.auth
128+
const workflowData = access.workflow
129+
155130
const actorUserId: string | null = auth?.userId ?? null
156131
if (!actorUserId) {
157132
logger.warn(`[${requestId}] Unable to resolve actor user for workflow deployment: ${id}`)
@@ -340,11 +315,16 @@ export async function PATCH(request: NextRequest, { params }: { params: Promise<
340315
const { id } = await params
341316

342317
try {
343-
const { auth, error } = await validateLifecycleAdminAccess(request, id)
344-
if (error) {
345-
return createErrorResponse(error.message, error.status)
318+
const access = await validateWorkflowAccess(request, id, {
319+
requireDeployment: false,
320+
action: 'admin',
321+
})
322+
if (access.error) {
323+
return createErrorResponse(access.error.message, access.error.status)
346324
}
347325

326+
const auth = access.auth
327+
348328
const body = await request.json()
349329
const { isPublicApi } = body
350330

@@ -387,11 +367,17 @@ export async function DELETE(
387367
const { id } = await params
388368

389369
try {
390-
const { auth, error, workflow: workflowData } = await validateLifecycleAdminAccess(request, id)
391-
if (error) {
392-
return createErrorResponse(error.message, error.status)
370+
const access = await validateWorkflowAccess(request, id, {
371+
requireDeployment: false,
372+
action: 'admin',
373+
})
374+
if (access.error) {
375+
return createErrorResponse(access.error.message, access.error.status)
393376
}
394377

378+
const auth = access.auth
379+
const workflowData = access.workflow
380+
395381
const actorUserId = auth?.userId ?? null
396382
if (!actorUserId) {
397383
return createErrorResponse('Unable to determine undeploying user', 400)

apps/sim/app/api/workflows/[id]/deployments/[version]/revert/route.ts

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,6 @@ import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/
1313

1414
const logger = createLogger('RevertToDeploymentVersionAPI')
1515

16-
async function validateDeploymentVersionAdminAccess(request: NextRequest, workflowId: string) {
17-
const access = await validateWorkflowAccess(request, workflowId, {
18-
requireDeployment: false,
19-
action: 'admin',
20-
})
21-
22-
if (access.error) {
23-
return access
24-
}
25-
26-
return {
27-
error: null,
28-
auth: access.auth,
29-
workflow: access.workflow,
30-
}
31-
}
32-
3316
export const dynamic = 'force-dynamic'
3417
export const runtime = 'nodejs'
3518

@@ -41,18 +24,22 @@ export async function POST(
4124
const { id, version } = await params
4225

4326
try {
44-
const {
45-
auth,
46-
error,
47-
workflow: workflowRecord,
48-
} = await validateDeploymentVersionAdminAccess(request, id)
49-
if (error) {
50-
return createErrorResponse(error.message, error.status)
27+
const access = await validateWorkflowAccess(request, id, {
28+
requireDeployment: false,
29+
action: 'admin',
30+
})
31+
if (access.error) {
32+
return createErrorResponse(access.error.message, access.error.status)
5133
}
5234

35+
const auth = access.auth
36+
const workflowRecord = access.workflow
37+
5338
const actorUserId = auth?.userId
5439
if (!actorUserId) {
55-
logger.warn(`[${requestId}] Unable to resolve actor user for workflow deployment revert: ${id}`)
40+
logger.warn(
41+
`[${requestId}] Unable to resolve actor user for workflow deployment revert: ${id}`
42+
)
5643
return createErrorResponse('Unable to determine reverting user', 400)
5744
}
5845

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

Lines changed: 13 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,6 @@ import type { BlockState } from '@/stores/workflows/workflow/types'
2020

2121
const logger = createLogger('WorkflowDeploymentVersionAPI')
2222

23-
async function validateDeploymentVersionLifecycleAccess(
24-
request: NextRequest,
25-
workflowId: string,
26-
action: 'read' | 'write' | 'admin'
27-
) {
28-
const access = await validateWorkflowAccess(request, workflowId, {
29-
requireDeployment: false,
30-
action,
31-
})
32-
33-
if (access.error) {
34-
return access
35-
}
36-
37-
return {
38-
error: null,
39-
auth: access.auth,
40-
workflow: access.workflow,
41-
}
42-
}
43-
4423
const patchBodySchema = z
4524
.object({
4625
name: z
@@ -75,7 +54,10 @@ export async function GET(
7554
const { id, version } = await params
7655

7756
try {
78-
const access = await validateDeploymentVersionLifecycleAccess(request, id, 'read')
57+
const access = await validateWorkflowAccess(request, id, {
58+
requireDeployment: false,
59+
action: 'read',
60+
})
7961
if (access.error) {
8062
return createErrorResponse(access.error.message, access.error.status)
8163
}
@@ -129,15 +111,17 @@ export async function PATCH(
129111

130112
// Activation requires admin permission, other updates require write
131113
const requiredPermission = isActive ? 'admin' : 'write'
132-
const {
133-
auth,
134-
error,
135-
workflow: workflowData,
136-
} = await validateDeploymentVersionLifecycleAccess(request, id, requiredPermission)
137-
if (error) {
138-
return createErrorResponse(error.message, error.status)
114+
const access = await validateWorkflowAccess(request, id, {
115+
requireDeployment: false,
116+
action: requiredPermission,
117+
})
118+
if (access.error) {
119+
return createErrorResponse(access.error.message, access.error.status)
139120
}
140121

122+
const auth = access.auth
123+
const workflowData = access.workflow
124+
141125
const versionNum = Number(version)
142126
if (!Number.isFinite(versionNum)) {
143127
return createErrorResponse('Invalid version', 400)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ function mockGetSession(session: { user: { id: string } } | null) {
4040
} else {
4141
mockCheckHybridAuth.mockResolvedValue({ success: false })
4242
mockCheckSessionOrInternalAuth.mockResolvedValue({ success: false })
43+
4344
mockValidateWorkflowAccess.mockResolvedValue({
4445
error: { message: 'Unauthorized', status: 401 },
4546
})

0 commit comments

Comments
 (0)