Skip to content

Commit 2c267c0

Browse files
PlaneInABottletest
authored andcommitted
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 39c014a commit 2c267c0

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 {
@@ -32,36 +31,6 @@ const logger = createLogger('WorkflowDeployAPI')
3231
export const dynamic = 'force-dynamic'
3332
export const runtime = 'nodejs'
3433

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

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

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

355330
try {
356-
const { auth, error } = await validateLifecycleAdminAccess(request, id)
357-
if (error) {
358-
return createErrorResponse(error.message, error.status)
331+
const access = await validateWorkflowAccess(request, id, {
332+
requireDeployment: false,
333+
action: 'admin',
334+
})
335+
if (access.error) {
336+
return createErrorResponse(access.error.message, access.error.status)
359337
}
360338

339+
const auth = access.auth
340+
361341
const body = await request.json()
362342
const { isPublicApi } = body
363343

@@ -400,11 +380,17 @@ export async function DELETE(
400380
const { id } = await params
401381

402382
try {
403-
const { auth, error, workflow: workflowData } = await validateLifecycleAdminAccess(request, id)
404-
if (error) {
405-
return createErrorResponse(error.message, error.status)
383+
const access = await validateWorkflowAccess(request, id, {
384+
requireDeployment: false,
385+
action: 'admin',
386+
})
387+
if (access.error) {
388+
return createErrorResponse(access.error.message, access.error.status)
406389
}
407390

391+
const auth = access.auth
392+
const workflowData = access.workflow
393+
408394
const actorUserId = auth?.userId ?? null
409395
if (!actorUserId) {
410396
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
@@ -12,23 +12,6 @@ import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/
1212

1313
const logger = createLogger('RevertToDeploymentVersionAPI')
1414

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

@@ -40,18 +23,22 @@ export async function POST(
4023
const { id, version } = await params
4124

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

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

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)