Implement workflow creation using a Supabase Edge Function, addressing CORS issues and enhancing security. The frontend now calls the Edge Function, which handles the n8n API interaction and Supabase updates.
129 lines
3.3 KiB
TypeScript
129 lines
3.3 KiB
TypeScript
|
|
import { serve } from 'https://deno.land/std@0.177.0/http/server.ts'
|
|
|
|
interface RequestBody {
|
|
email: string
|
|
grupoId: number
|
|
apiKey: string
|
|
workflowData: {
|
|
name: string
|
|
nodes: any[]
|
|
connections: any
|
|
settings: any
|
|
}
|
|
}
|
|
|
|
serve(async (req) => {
|
|
try {
|
|
// Handle CORS preflight request
|
|
if (req.method === 'OPTIONS') {
|
|
return new Response(null, {
|
|
status: 204,
|
|
headers: {
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Methods': 'POST, OPTIONS',
|
|
'Access-Control-Allow-Headers': 'Content-Type, Authorization',
|
|
},
|
|
})
|
|
}
|
|
|
|
// Extract request body
|
|
const { email, grupoId, apiKey, workflowData }: RequestBody = await req.json()
|
|
|
|
if (!email || !grupoId || !apiKey) {
|
|
return new Response(
|
|
JSON.stringify({ error: 'Email, grupo ID e chave API são obrigatórios' }),
|
|
{
|
|
status: 400,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Access-Control-Allow-Origin': '*',
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
console.log(`Creating workflow for email: ${email}, group: ${grupoId}`)
|
|
|
|
// Make request to n8n API
|
|
const n8nResponse = await fetch('https://n8n.innova1001.com.br/api/v1/workflows', {
|
|
method: 'POST',
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'X-N8N-API-KEY': apiKey,
|
|
},
|
|
body: JSON.stringify(workflowData),
|
|
})
|
|
|
|
if (!n8nResponse.ok) {
|
|
const errorText = await n8nResponse.text()
|
|
console.error(`n8n API error: ${n8nResponse.status} - ${errorText}`)
|
|
return new Response(
|
|
JSON.stringify({
|
|
error: 'Error calling n8n API',
|
|
status: n8nResponse.status,
|
|
details: errorText
|
|
}),
|
|
{
|
|
status: n8nResponse.status,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Access-Control-Allow-Origin': '*',
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
const workflowResponse = await n8nResponse.json()
|
|
|
|
// Extract workflow ID from response
|
|
const workflowId = workflowResponse.id
|
|
|
|
if (!workflowId) {
|
|
console.error('No workflow ID in n8n response', workflowResponse)
|
|
return new Response(
|
|
JSON.stringify({ error: 'No workflow ID in response', details: workflowResponse }),
|
|
{
|
|
status: 500,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Access-Control-Allow-Origin': '*',
|
|
}
|
|
}
|
|
)
|
|
}
|
|
|
|
console.log(`Workflow created with ID: ${workflowId}`)
|
|
|
|
// Success response
|
|
return new Response(
|
|
JSON.stringify({
|
|
success: true,
|
|
workflow_id: workflowId,
|
|
message: 'Workflow created successfully',
|
|
details: workflowResponse
|
|
}),
|
|
{
|
|
status: 200,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Access-Control-Allow-Origin': '*',
|
|
}
|
|
}
|
|
)
|
|
} catch (error) {
|
|
console.error('Error in Edge Function:', error)
|
|
|
|
return new Response(
|
|
JSON.stringify({ error: 'Internal server error', details: error.message }),
|
|
{
|
|
status: 500,
|
|
headers: {
|
|
'Content-Type': 'application/json',
|
|
'Access-Control-Allow-Origin': '*',
|
|
}
|
|
}
|
|
)
|
|
}
|
|
})
|