Files
enclava/frontend/src/app/api/workflows/import/route.ts
2025-08-24 17:46:15 +02:00

145 lines
4.1 KiB
TypeScript

import { NextRequest, NextResponse } from 'next/server'
const BACKEND_URL = process.env.INTERNAL_API_URL || 'http://enclava-backend:8000'
export async function POST(request: NextRequest) {
try {
const adminToken = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxIiwiZW1haWwiOiJhZG1pbkBleGFtcGxlLmNvbSIsImlzX3N1cGVydXNlciI6dHJ1ZSwicm9sZSI6InN1cGVyX2FkbWluIiwiZXhwIjoxNzg0Nzk2NDI2LjA0NDYxOX0.YOTlUY8nowkaLAXy5EKfnZEpbDgGCabru5R0jdq_DOQ'
const formData = await request.formData()
const file = formData.get('workflow_file') as File
if (!file) {
return NextResponse.json(
{ error: 'No file provided' },
{ status: 400 }
)
}
// Check file type
if (!file.name.endsWith('.json')) {
return NextResponse.json(
{ error: 'Only JSON files are supported' },
{ status: 400 }
)
}
// Check file size (max 10MB)
if (file.size > 10 * 1024 * 1024) {
return NextResponse.json(
{ error: 'File too large. Maximum size is 10MB' },
{ status: 400 }
)
}
// Read file content
const fileContent = await file.text()
let workflowData
try {
workflowData = JSON.parse(fileContent)
} catch (error) {
return NextResponse.json(
{ error: 'Invalid JSON format' },
{ status: 400 }
)
}
// Validate required fields
const requiredFields = ['name', 'description', 'steps']
for (const field of requiredFields) {
if (!workflowData[field]) {
return NextResponse.json(
{ error: `Missing required field: ${field}` },
{ status: 400 }
)
}
}
// Generate new ID if not provided
if (!workflowData.id) {
workflowData.id = `imported-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`
}
// Add import metadata
workflowData.metadata = {
...workflowData.metadata,
imported_at: new Date().toISOString(),
imported_from: file.name,
imported_by: 'user'
}
// Validate workflow through backend
const validateResponse = await fetch(`${BACKEND_URL}/api/modules/workflow/execute`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${adminToken}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
action: 'validate_workflow',
workflow_def: workflowData
})
})
if (!validateResponse.ok) {
const errorData = await validateResponse.json()
return NextResponse.json(
{
error: 'Workflow validation failed',
details: errorData.response?.errors || ['Unknown validation error'],
workflow_data: workflowData
},
{ status: 400 }
)
}
const validationResult = await validateResponse.json()
if (!validationResult.response?.valid) {
return NextResponse.json(
{
error: 'Workflow validation failed',
details: validationResult.response?.errors || ['Workflow is not valid'],
workflow_data: workflowData
},
{ status: 400 }
)
}
// Create workflow via backend
const createResponse = await fetch(`${BACKEND_URL}/api/modules/workflow/execute`, {
method: 'POST',
headers: {
'Authorization': `Bearer ${adminToken}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
action: 'create_workflow',
workflow_def: workflowData
})
})
if (!createResponse.ok) {
const errorData = await createResponse.text()
return NextResponse.json(
{ error: 'Failed to create workflow', details: errorData },
{ status: createResponse.status }
)
}
const createData = await createResponse.json()
return NextResponse.json({
success: true,
message: 'Workflow imported successfully',
workflow: createData.response?.workflow || workflowData,
validation_passed: true
})
} catch (error) {
console.error('Error importing workflow:', error)
return NextResponse.json(
{ error: 'Internal server error', details: error instanceof Error ? error.message : 'Unknown error' },
{ status: 500 }
)
}
}