138 lines
3.3 KiB
TypeScript

import { snapshotType, workflowAPIType, workflowType } from "@/db/schema";
import { parseDataSafe } from "@/lib/parseDataSafe";
import { NextResponse } from "next/server";
import { z } from "zod";
import {
createNewWorkflow,
createNewWorkflowVersion,
} from "../../../../server/createNewWorkflow";
import { parseJWT } from "../../../../server/parseJWT";
// This is will be deprecated
const corsHeaders = {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type, Authorization",
};
const UploadRequest = z.object({
workflow_id: z.string().optional(),
workflow_name: z.string().min(1).optional(),
workflow: workflowType,
workflow_api: workflowAPIType,
snapshot: snapshotType,
});
export async function OPTIONS(request: Request) {
return new Response(null, {
status: 204,
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, PUT, DELETE, OPTIONS",
"Access-Control-Allow-Headers": "Content-Type, Authorization",
},
});
}
export async function POST(request: Request) {
const token = request.headers.get("Authorization")?.split(" ")?.[1]; // Assuming token is sent as "Bearer your_token"
const userData = token ? parseJWT(token) : undefined;
if (!userData) {
return new NextResponse("Invalid or expired token", {
status: 401,
headers: corsHeaders,
});
}
const { user_id, org_id } = userData;
if (!user_id) return new NextResponse("Invalid user_id", { status: 401 });
const [data, error] = await parseDataSafe(
UploadRequest,
request,
corsHeaders,
);
if (!data || error) return error;
const {
// user_id,
workflow,
workflow_api,
workflow_id: _workflow_id,
workflow_name,
snapshot,
} = data;
let workflow_id = _workflow_id;
let version = -1;
// Case 1 new workflow
try {
if ((!workflow_id || workflow_id.length === 0) && workflow_name) {
// Create a new parent workflow
const { workflow_id: _workflow_id, version: _version } =
await createNewWorkflow({
user_id: user_id,
org_id: org_id,
workflow_name: workflow_name,
workflowData: {
workflow,
workflow_api,
snapshot,
},
});
workflow_id = _workflow_id;
version = _version;
} else if (workflow_id) {
// Case 2 update workflow
const { version: _version } = await createNewWorkflowVersion({
workflow_id: workflow_id,
workflowData: {
workflow,
workflow_api,
snapshot,
},
});
version = _version;
} else {
return NextResponse.json(
{
error: "Invalid request, missing either workflow_id or name",
},
{
status: 500,
statusText: "Invalid request",
headers: corsHeaders,
},
);
}
} catch (error: any) {
return NextResponse.json(
{
error: error.toString(),
},
{
status: 500,
statusText: "Invalid request",
headers: corsHeaders,
},
);
}
return NextResponse.json(
{
workflow_id: workflow_id,
version: version,
},
{
status: 200,
headers: corsHeaders,
},
);
}