feat: add public share options for workflow

This commit is contained in:
BennyKok
2024-01-14 23:35:25 +08:00
parent dafc8b168b
commit 18cfbce171
22 changed files with 1327 additions and 158 deletions
+9
View File
@@ -5,7 +5,9 @@ import { db } from "@/db/db";
import type { MachineType, WorkflowVersionType } from "@/db/schema";
import { machinesTable, workflowRunsTable } from "@/db/schema";
import type { APIKeyUserType } from "@/server/APIKeyBodyRequest";
import { getRunsData } from "@/server/getRunsData";
import { ComfyAPI_Run } from "@/types/ComfyAPI_Run";
import { auth } from "@clerk/nextjs";
import { and, eq } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import "server-only";
@@ -219,3 +221,10 @@ export const createRun = withServerPromise(
};
}
);
export async function checkStatus(run_id: string) {
const { userId } = auth();
if (!userId) throw new Error("User not found");
return await getRunsData(run_id);
}
+25 -1
View File
@@ -1,6 +1,7 @@
"use server";
import { db } from "@/db/db";
import type { DeploymentType } from "@/db/schema";
import { deploymentsTable, workflowTable } from "@/db/schema";
import { auth } from "@clerk/nextjs";
import { and, eq, isNull } from "drizzle-orm";
@@ -11,7 +12,7 @@ export async function createDeployments(
workflow_id: string,
version_id: string,
machine_id: string,
environment: "production" | "staging"
environment: DeploymentType["environment"]
) {
const { userId } = auth();
if (!userId) throw new Error("No user id");
@@ -80,3 +81,26 @@ export async function findAllDeployments() {
return deployments;
}
export async function findSharedDeployment(workflow_id: string) {
const deploymentData = await db.query.deploymentsTable.findFirst({
where: and(
eq(deploymentsTable.environment, "public-share"),
eq(deploymentsTable.id, workflow_id)
),
with: {
user: true,
machine: true,
workflow: {
columns: {
name: true,
org_id: true,
user_id: true,
},
},
version: true,
},
});
return deploymentData;
}
+72
View File
@@ -0,0 +1,72 @@
import { db } from "@/db/db";
import { workflowRunsTable } from "@/db/schema";
import type { APIKeyUserType } from "@/server/APIKeyBodyRequest";
import { replaceCDNUrl } from "@/server/replaceCDNUrl";
import { and, eq } from "drizzle-orm";
export async function getRunsData(run_id: string, user?: APIKeyUserType) {
const data = await db.query.workflowRunsTable.findFirst({
where: and(eq(workflowRunsTable.id, run_id)),
with: {
workflow: {
columns: {
org_id: true,
user_id: true,
},
},
outputs: {
columns: {
data: true,
},
},
},
});
if (!data) {
return null;
}
if (user) {
if (user.org_id) {
// is org api call, check org only
if (data.workflow.org_id != user.org_id) {
return null;
}
} else {
// is user api call, check user only
if (
data.workflow.user_id != user.user_id &&
data.workflow.org_id == null
) {
return null;
}
}
}
if (data) {
// Fill in the CDN url
if (data?.status === "success" && data?.outputs?.length > 0) {
for (let i = 0; i < data.outputs.length; i++) {
const output = data.outputs[i];
if (output.data?.images !== undefined) {
for (let j = 0; j < output.data?.images.length; j++) {
const element = output.data?.images[j];
element.url = replaceCDNUrl(
`${process.env.SPACES_ENDPOINT}/${process.env.SPACES_BUCKET}/outputs/runs/${data.id}/${element.filename}`
);
}
} else if (output.data?.files !== undefined) {
for (let j = 0; j < output.data?.files.length; j++) {
const element = output.data?.files[j];
element.url = replaceCDNUrl(
`${process.env.SPACES_ENDPOINT}/${process.env.SPACES_BUCKET}/outputs/runs/${data.id}/${element.filename}`
);
}
}
}
}
}
return data;
}
+2 -40
View File
@@ -2,9 +2,8 @@
import { RunOutputs } from "@/components/RunOutputs";
import { db } from "@/db/db";
import { workflowRunOutputs, workflowRunsTable } from "@/db/schema";
import type { APIKeyUserType } from "@/server/APIKeyBodyRequest";
import { and, eq } from "drizzle-orm";
import { workflowRunOutputs } from "@/db/schema";
import { eq } from "drizzle-orm";
export async function getRunsOutputDisplay(run_id: string) {
return <RunOutputs run_id={run_id} />;
@@ -17,40 +16,3 @@ export async function getRunsOutput(run_id: string) {
.from(workflowRunOutputs)
.where(eq(workflowRunOutputs.run_id, run_id));
}
export async function getRunsData(user: APIKeyUserType, run_id: string) {
const data = await db.query.workflowRunsTable.findFirst({
where: and(eq(workflowRunsTable.id, run_id)),
with: {
workflow: {
columns: {
org_id: true,
user_id: true,
},
},
outputs: {
columns: {
data: true,
},
},
},
});
if (!data) {
return null;
}
if (user.org_id) {
// is org api call, check org only
if (data.workflow.org_id != user.org_id) {
return null;
}
} else {
// is user api call, check user only
if (data.workflow.user_id != user.user_id && data.workflow.org_id == null) {
return null;
}
}
return data;
}