1+ import { NextRequest , NextResponse } from 'next/server'
2+ import { createLogger } from '@/lib/logs/console-logger'
3+ import { db } from '@/db'
4+ import { workflow as workflowTable } from '@/db/schema'
5+ import { eq } from 'drizzle-orm'
6+ import { generateWorkflowYaml } from '@/lib/workflows/yaml-generator'
7+ import { loadWorkflowFromNormalizedTables } from '@/lib/workflows/db-helpers'
8+
9+ const logger = createLogger ( 'GetUserWorkflowAPI' )
10+
11+ export async function POST ( request : NextRequest ) {
12+ try {
13+ const body = await request . json ( )
14+ const { workflowId, includeMetadata = false } = body
15+
16+ if ( ! workflowId ) {
17+ return NextResponse . json (
18+ { success : false , error : 'Workflow ID is required' } ,
19+ { status : 400 }
20+ )
21+ }
22+
23+ logger . info ( 'Fetching workflow for YAML generation' , { workflowId } )
24+
25+ // Fetch workflow from database
26+ const [ workflowRecord ] = await db
27+ . select ( )
28+ . from ( workflowTable )
29+ . where ( eq ( workflowTable . id , workflowId ) )
30+ . limit ( 1 )
31+
32+ if ( ! workflowRecord ) {
33+ return NextResponse . json (
34+ { success : false , error : `Workflow ${ workflowId } not found` } ,
35+ { status : 404 }
36+ )
37+ }
38+
39+ // Try to load from normalized tables first, fallback to JSON blob
40+ let workflowState : any = null
41+ let subBlockValues : Record < string , Record < string , any > > = { }
42+
43+ const normalizedData = await loadWorkflowFromNormalizedTables ( workflowId )
44+ if ( normalizedData ) {
45+ workflowState = {
46+ blocks : normalizedData . blocks ,
47+ edges : normalizedData . edges ,
48+ loops : normalizedData . loops ,
49+ parallels : normalizedData . parallels ,
50+ }
51+
52+ // Extract subblock values from normalized data
53+ Object . entries ( normalizedData . blocks ) . forEach ( ( [ blockId , block ] ) => {
54+ subBlockValues [ blockId ] = { }
55+ Object . entries ( ( block as any ) . subBlocks || { } ) . forEach ( ( [ subBlockId , subBlock ] ) => {
56+ if ( ( subBlock as any ) . value !== undefined ) {
57+ subBlockValues [ blockId ] [ subBlockId ] = ( subBlock as any ) . value
58+ }
59+ } )
60+ } )
61+ } else if ( workflowRecord . state ) {
62+ // Fallback to JSON blob
63+ workflowState = workflowRecord . state as any
64+ // For JSON blob, subblock values are embedded in the block state
65+ Object . entries ( ( workflowState . blocks as any ) || { } ) . forEach ( ( [ blockId , block ] ) => {
66+ subBlockValues [ blockId ] = { }
67+ Object . entries ( ( ( block as any ) . subBlocks || { } ) ) . forEach ( ( [ subBlockId , subBlock ] ) => {
68+ if ( ( subBlock as any ) . value !== undefined ) {
69+ subBlockValues [ blockId ] [ subBlockId ] = ( subBlock as any ) . value
70+ }
71+ } )
72+ } )
73+ }
74+
75+ if ( ! workflowState || ! workflowState . blocks ) {
76+ return NextResponse . json (
77+ { success : false , error : 'Workflow state is empty or invalid' } ,
78+ { status : 400 }
79+ )
80+ }
81+
82+ // Generate YAML using server-side function
83+ const yaml = generateWorkflowYaml ( workflowState , subBlockValues )
84+
85+ if ( ! yaml || yaml . trim ( ) === '' ) {
86+ return NextResponse . json (
87+ { success : false , error : 'Generated YAML is empty' } ,
88+ { status : 400 }
89+ )
90+ }
91+
92+ // Prepare response
93+ const response : any = {
94+ yaml,
95+ format : 'yaml' ,
96+ blockCount : Object . keys ( workflowState . blocks ) . length ,
97+ edgeCount : ( workflowState . edges || [ ] ) . length ,
98+ }
99+
100+ // Add metadata if requested
101+ if ( includeMetadata ) {
102+ response . metadata = {
103+ workflowId : workflowRecord . id ,
104+ name : workflowRecord . name ,
105+ description : workflowRecord . description ,
106+ workspaceId : workflowRecord . workspaceId ,
107+ createdAt : workflowRecord . createdAt ,
108+ updatedAt : workflowRecord . updatedAt ,
109+ }
110+ }
111+
112+ logger . info ( 'Successfully generated workflow YAML' , {
113+ workflowId,
114+ blockCount : response . blockCount ,
115+ yamlLength : yaml . length ,
116+ } )
117+
118+ return NextResponse . json ( {
119+ success : true ,
120+ output : response ,
121+ } )
122+ } catch ( error ) {
123+ logger . error ( 'Failed to get workflow YAML:' , error )
124+ return NextResponse . json (
125+ {
126+ success : false ,
127+ error : `Failed to get workflow YAML: ${ error instanceof Error ? error . message : 'Unknown error' } ` ,
128+ } ,
129+ { status : 500 }
130+ )
131+ }
132+ }
0 commit comments