138 lines
3.3 KiB
TypeScript
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,
|
|
},
|
|
);
|
|
}
|