feat(plugin): update deployment flow
This commit is contained in:
parent
d6707295cc
commit
157b126fbf
@ -102,6 +102,12 @@ const ext = {
|
|||||||
* @typedef {import('../../../web/types/litegraph.js').LGraphNode} LGraphNode
|
* @typedef {import('../../../web/types/litegraph.js').LGraphNode} LGraphNode
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
function showError(title, message) {
|
||||||
|
infoDialog.show(
|
||||||
|
`<h3 style="margin: 0px; color: red;">${title}</h3><br><span>${message}</span> `,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
function addButton() {
|
function addButton() {
|
||||||
const menu = document.querySelector(".comfy-menu");
|
const menu = document.querySelector(".comfy-menu");
|
||||||
|
|
||||||
@ -113,9 +119,46 @@ function addButton() {
|
|||||||
/** @type {LGraph} */
|
/** @type {LGraph} */
|
||||||
const graph = app.graph;
|
const graph = app.graph;
|
||||||
|
|
||||||
const title = deploy.querySelector("#button-title")
|
const snapshot = await fetch("/snapshot/get_current").then((x) => x.json());
|
||||||
|
console.log(snapshot);
|
||||||
|
|
||||||
|
if (!snapshot) {
|
||||||
|
showError(
|
||||||
|
"Error when deploying",
|
||||||
|
"Unable to generate snapshot, please install ComfyUI Manager",
|
||||||
|
);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const title = deploy.querySelector("#button-title");
|
||||||
|
|
||||||
|
let deployMeta = graph.findNodesByType("ComfyDeploy");
|
||||||
|
|
||||||
|
if (deployMeta.length == 0) {
|
||||||
|
const text = await inputDialog.input(
|
||||||
|
"Create your deployment",
|
||||||
|
"Workflow name",
|
||||||
|
);
|
||||||
|
if (!text) return
|
||||||
|
console.log(text);
|
||||||
|
app.graph.beforeChange();
|
||||||
|
var node = LiteGraph.createNode("ComfyDeploy");
|
||||||
|
node.configure({
|
||||||
|
widgets_values: [
|
||||||
|
text
|
||||||
|
]
|
||||||
|
});
|
||||||
|
node.pos = [0, 0];
|
||||||
|
app.graph.add(node);
|
||||||
|
app.graph.afterChange();
|
||||||
|
deployMeta=[node]
|
||||||
|
// return;
|
||||||
|
// showError(
|
||||||
|
// "Error when deploying",
|
||||||
|
// "Unable to to find ComfyDeploy node, please add it first.",
|
||||||
|
// );
|
||||||
|
}
|
||||||
|
|
||||||
const deployMeta = graph.findNodesByType("ComfyDeploy");
|
|
||||||
const deployMetaNode = deployMeta[0];
|
const deployMetaNode = deployMeta[0];
|
||||||
|
|
||||||
console.log(deployMetaNode);
|
console.log(deployMetaNode);
|
||||||
@ -132,10 +175,7 @@ function addButton() {
|
|||||||
// const endpoint = localStorage.getItem("endpoint") ?? "";
|
// const endpoint = localStorage.getItem("endpoint") ?? "";
|
||||||
// const apiKey = localStorage.getItem("apiKey");
|
// const apiKey = localStorage.getItem("apiKey");
|
||||||
|
|
||||||
const {
|
const { endpoint, apiKey } = getData();
|
||||||
endpoint,
|
|
||||||
apiKey,
|
|
||||||
} = getData();
|
|
||||||
|
|
||||||
if (!endpoint || !apiKey || apiKey === "" || endpoint === "") {
|
if (!endpoint || !apiKey || apiKey === "" || endpoint === "") {
|
||||||
configDialog.show();
|
configDialog.show();
|
||||||
@ -152,7 +192,7 @@ function addButton() {
|
|||||||
endpoint = endpoint.slice(0, -1);
|
endpoint = endpoint.slice(0, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
const apiRoute = endpoint + "/api/upload"
|
const apiRoute = endpoint + "/api/upload";
|
||||||
// const userId = apiKey
|
// const userId = apiKey
|
||||||
try {
|
try {
|
||||||
let data = await fetch(apiRoute, {
|
let data = await fetch(apiRoute, {
|
||||||
@ -162,10 +202,11 @@ function addButton() {
|
|||||||
workflow_id,
|
workflow_id,
|
||||||
workflow: prompt.workflow,
|
workflow: prompt.workflow,
|
||||||
workflow_api: prompt.output,
|
workflow_api: prompt.output,
|
||||||
|
snapshot: snapshot,
|
||||||
}),
|
}),
|
||||||
headers: {
|
headers: {
|
||||||
"Content-Type": "application/json",
|
"Content-Type": "application/json",
|
||||||
"Authorization": "Bearer " + apiKey,
|
Authorization: "Bearer " + apiKey,
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -185,7 +226,7 @@ function addButton() {
|
|||||||
graph.change();
|
graph.change();
|
||||||
|
|
||||||
infoDialog.show(
|
infoDialog.show(
|
||||||
`<span style="color:green;">Deployed successfully!</span> <br/> <br/> Workflow ID: ${data.workflow_id} <br/> Workflow Name: ${workflow_name} <br/> Workflow Version: ${data.version}`,
|
`<span style="color:green;">Deployed successfully!</span> <a style="color:white;" target="_blank" href=${endpoint}/workflows/${data.workflow_id}>View here -></a> <br/> <br/> Workflow ID: ${data.workflow_id} <br/> Workflow Name: ${workflow_name} <br/> Workflow Version: ${data.version} <br/>`,
|
||||||
);
|
);
|
||||||
|
|
||||||
setTimeout(() => {
|
setTimeout(() => {
|
||||||
@ -213,16 +254,15 @@ function addButton() {
|
|||||||
|
|
||||||
// set aspect ratio to square
|
// set aspect ratio to square
|
||||||
config.style.width = "20px";
|
config.style.width = "20px";
|
||||||
config.src = "https://api.iconify.design/material-symbols-light:settings.svg?color=%23888888";
|
config.src =
|
||||||
|
"https://api.iconify.design/material-symbols-light:settings.svg?color=%23888888";
|
||||||
config.onclick = (e) => {
|
config.onclick = (e) => {
|
||||||
e.preventDefault()
|
e.preventDefault();
|
||||||
e.stopPropagation()
|
e.stopPropagation();
|
||||||
configDialog.show();
|
configDialog.show();
|
||||||
};
|
};
|
||||||
|
|
||||||
deploy.append(
|
deploy.append(config);
|
||||||
config
|
|
||||||
)
|
|
||||||
|
|
||||||
deploy.style.order = "99";
|
deploy.style.order = "99";
|
||||||
|
|
||||||
@ -231,13 +271,13 @@ function addButton() {
|
|||||||
|
|
||||||
app.registerExtension(ext);
|
app.registerExtension(ext);
|
||||||
|
|
||||||
|
import { ComfyDialog, $el } from "../../scripts/ui.js";
|
||||||
import { ComfyDialog, $el } from '../../scripts/ui.js';
|
|
||||||
|
|
||||||
export class InfoDialog extends ComfyDialog {
|
export class InfoDialog extends ComfyDialog {
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
this.element.classList.add("comfy-normal-modal");
|
this.element.classList.add("comfy-normal-modal");
|
||||||
|
this.element.style.paddingBottom = "20px";
|
||||||
}
|
}
|
||||||
createButtons() {
|
createButtons() {
|
||||||
return [
|
return [
|
||||||
@ -254,7 +294,9 @@ export class InfoDialog extends ComfyDialog {
|
|||||||
}
|
}
|
||||||
|
|
||||||
show(html) {
|
show(html) {
|
||||||
|
this.textElement.style["white-space"] = "normal";
|
||||||
this.textElement.style.color = "white";
|
this.textElement.style.color = "white";
|
||||||
|
this.textElement.style.marginTop = "0px";
|
||||||
if (typeof html === "string") {
|
if (typeof html === "string") {
|
||||||
this.textElement.innerHTML = html;
|
this.textElement.innerHTML = html;
|
||||||
} else {
|
} else {
|
||||||
@ -265,10 +307,77 @@ export class InfoDialog extends ComfyDialog {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export const infoDialog = new InfoDialog()
|
export class InputDialog extends InfoDialog {
|
||||||
|
callback = undefined;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
|
||||||
|
createButtons() {
|
||||||
|
return [
|
||||||
|
$el(
|
||||||
|
"div",
|
||||||
|
{
|
||||||
|
type: "div",
|
||||||
|
style: {
|
||||||
|
display: "flex",
|
||||||
|
gap: "6px",
|
||||||
|
justifyContent: "flex-end",
|
||||||
|
width: "100%",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[
|
||||||
|
$el("button", {
|
||||||
|
type: "button",
|
||||||
|
textContent: "Save",
|
||||||
|
onclick: () => {
|
||||||
|
const input = this.textElement.querySelector("#input").value;
|
||||||
|
if (input.trim() === "") {
|
||||||
|
showError("Input validation", "Input cannot be empty");
|
||||||
|
} else {
|
||||||
|
this.callback?.(input);
|
||||||
|
this.close();
|
||||||
|
this.textElement.querySelector("#input").value = "";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
$el("button", {
|
||||||
|
type: "button",
|
||||||
|
textContent: "Close",
|
||||||
|
onclick: () => {
|
||||||
|
this.callback?.(undefined);
|
||||||
|
this.close()
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
input(title, message) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
this.callback = resolve;
|
||||||
|
this.show(`
|
||||||
|
<div style="width: 400px; display: flex; gap: 18px; flex-direction: column; overflow: unset">
|
||||||
|
<h3 style="margin: 0px;">${title}</h3>
|
||||||
|
<label>
|
||||||
|
${message}
|
||||||
|
<input id="input" style="margin-top: 8px; width: 100%; height:40px; padding: 0px 6px; box-sizing: border-box; outline-offset: -1px;">
|
||||||
|
</label>
|
||||||
|
</div>
|
||||||
|
`);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export const inputDialog = new InputDialog();
|
||||||
|
|
||||||
|
export const infoDialog = new InfoDialog();
|
||||||
|
|
||||||
function getData(environment) {
|
function getData(environment) {
|
||||||
const deployOption = environment || localStorage.getItem("comfy_deploy_env") || "cloud";
|
const deployOption =
|
||||||
|
environment || localStorage.getItem("comfy_deploy_env") || "cloud";
|
||||||
const data = localStorage.getItem("comfy_deploy_env_data_" + deployOption);
|
const data = localStorage.getItem("comfy_deploy_env_data_" + deployOption);
|
||||||
if (!data) {
|
if (!data) {
|
||||||
if (deployOption == "cloud")
|
if (deployOption == "cloud")
|
||||||
@ -289,12 +398,12 @@ function getData(environment) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export class ConfigDialog extends ComfyDialog {
|
export class ConfigDialog extends ComfyDialog {
|
||||||
|
|
||||||
container = null;
|
container = null;
|
||||||
|
|
||||||
constructor() {
|
constructor() {
|
||||||
super();
|
super();
|
||||||
this.element.classList.add("comfy-normal-modal");
|
this.element.classList.add("comfy-normal-modal");
|
||||||
|
this.element.style.paddingBottom = "20px";
|
||||||
|
|
||||||
this.container = document.createElement("div");
|
this.container = document.createElement("div");
|
||||||
this.element.querySelector(".comfy-modal-content").prepend(this.container);
|
this.element.querySelector(".comfy-modal-content").prepend(this.container);
|
||||||
@ -302,7 +411,9 @@ export class ConfigDialog extends ComfyDialog {
|
|||||||
|
|
||||||
createButtons() {
|
createButtons() {
|
||||||
return [
|
return [
|
||||||
$el("div", {
|
$el(
|
||||||
|
"div",
|
||||||
|
{
|
||||||
type: "div",
|
type: "div",
|
||||||
style: {
|
style: {
|
||||||
display: "flex",
|
display: "flex",
|
||||||
@ -322,8 +433,8 @@ export class ConfigDialog extends ComfyDialog {
|
|||||||
type: "button",
|
type: "button",
|
||||||
textContent: "Close",
|
textContent: "Close",
|
||||||
onclick: () => this.close(),
|
onclick: () => this.close(),
|
||||||
})
|
}),
|
||||||
]
|
],
|
||||||
),
|
),
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
@ -341,8 +452,11 @@ export class ConfigDialog extends ComfyDialog {
|
|||||||
const data = {
|
const data = {
|
||||||
endpoint,
|
endpoint,
|
||||||
apiKey,
|
apiKey,
|
||||||
}
|
};
|
||||||
localStorage.setItem("comfy_deploy_env_data_" + deployOption, JSON.stringify(data));
|
localStorage.setItem(
|
||||||
|
"comfy_deploy_env_data_" + deployOption,
|
||||||
|
JSON.stringify(data),
|
||||||
|
);
|
||||||
this.close();
|
this.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -355,18 +469,26 @@ export class ConfigDialog extends ComfyDialog {
|
|||||||
<div style="width: 400px; display: flex; gap: 18px; flex-direction: column;">
|
<div style="width: 400px; display: flex; gap: 18px; flex-direction: column;">
|
||||||
<h3 style="margin: 0px;">Comfy Deploy Config</h3>
|
<h3 style="margin: 0px;">Comfy Deploy Config</h3>
|
||||||
<label style="color: white; width: 100%;">
|
<label style="color: white; width: 100%;">
|
||||||
<select id="deployOption" style="margin-top: 8px; width: 100%; height:30px;" >
|
<select id="deployOption" style="margin: 8px 0px; width: 100%; height:30px; box-sizing: border-box;" >
|
||||||
<option value="cloud" ${data.environment === 'cloud' ? 'selected' : ''}>Cloud</option>
|
<option value="cloud" ${
|
||||||
<option value="local" ${data.environment === 'local' ? 'selected' : ''}>Local</option>
|
data.environment === "cloud" ? "selected" : ""
|
||||||
|
}>Cloud</option>
|
||||||
|
<option value="local" ${
|
||||||
|
data.environment === "local" ? "selected" : ""
|
||||||
|
}>Local</option>
|
||||||
</select>
|
</select>
|
||||||
</label>
|
</label>
|
||||||
<label style="color: white; width: 100%;">
|
<label style="color: white; width: 100%;">
|
||||||
Endpoint:
|
Endpoint:
|
||||||
<input id="endpoint" style="margin-top: 8px; width: 100%; height:30px;" type="text" value="${data.endpoint}">
|
<input id="endpoint" style="margin-top: 8px; width: 100%; height:40px; box-sizing: border-box; padding: 0px 6px;" type="text" value="${
|
||||||
|
data.endpoint
|
||||||
|
}">
|
||||||
</label>
|
</label>
|
||||||
<label style="color: white;">
|
<label style="color: white;">
|
||||||
API Key:
|
API Key:
|
||||||
<input id="apiKey" style="margin-top: 8px; width: 100%; height:30px;" type="password" value="${data.apiKey}">
|
<input id="apiKey" style="margin-top: 8px; width: 100%; height:40px; box-sizing: border-box; padding: 0px 6px;" type="password" value="${
|
||||||
|
data.apiKey
|
||||||
|
}">
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
`;
|
`;
|
||||||
@ -377,7 +499,7 @@ export class ConfigDialog extends ComfyDialog {
|
|||||||
});
|
});
|
||||||
|
|
||||||
const deployOption = this.container.querySelector("#deployOption");
|
const deployOption = this.container.querySelector("#deployOption");
|
||||||
const container = this.container
|
const container = this.container;
|
||||||
deployOption.addEventListener("change", function () {
|
deployOption.addEventListener("change", function () {
|
||||||
const selectedOption = this.value;
|
const selectedOption = this.value;
|
||||||
const data = getData(selectedOption);
|
const data = getData(selectedOption);
|
||||||
|
1
web/drizzle/0022_petite_bishop.sql
Normal file
1
web/drizzle/0022_petite_bishop.sql
Normal file
@ -0,0 +1 @@
|
|||||||
|
ALTER TABLE "comfyui_deploy"."workflow_versions" ADD COLUMN "snapshot" jsonb;
|
710
web/drizzle/meta/0022_snapshot.json
Normal file
710
web/drizzle/meta/0022_snapshot.json
Normal file
@ -0,0 +1,710 @@
|
|||||||
|
{
|
||||||
|
"id": "9153404d-9279-4f43-a61f-7f5efefc12b7",
|
||||||
|
"prevId": "5893c5f8-4466-4b51-b9b7-24756c37dced",
|
||||||
|
"version": "5",
|
||||||
|
"dialect": "pg",
|
||||||
|
"tables": {
|
||||||
|
"api_keys": {
|
||||||
|
"name": "api_keys",
|
||||||
|
"schema": "comfyui_deploy",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "gen_random_uuid()"
|
||||||
|
},
|
||||||
|
"key": {
|
||||||
|
"name": "key",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"name": "user_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"org_id": {
|
||||||
|
"name": "org_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"revoked": {
|
||||||
|
"name": "revoked",
|
||||||
|
"type": "boolean",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"api_keys_user_id_users_id_fk": {
|
||||||
|
"name": "api_keys_user_id_users_id_fk",
|
||||||
|
"tableFrom": "api_keys",
|
||||||
|
"tableTo": "users",
|
||||||
|
"columnsFrom": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {
|
||||||
|
"api_keys_key_unique": {
|
||||||
|
"name": "api_keys_key_unique",
|
||||||
|
"nullsNotDistinct": false,
|
||||||
|
"columns": [
|
||||||
|
"key"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"deployments": {
|
||||||
|
"name": "deployments",
|
||||||
|
"schema": "comfyui_deploy",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "gen_random_uuid()"
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"name": "user_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"workflow_version_id": {
|
||||||
|
"name": "workflow_version_id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"workflow_id": {
|
||||||
|
"name": "workflow_id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"machine_id": {
|
||||||
|
"name": "machine_id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"environment": {
|
||||||
|
"name": "environment",
|
||||||
|
"type": "deployment_environment",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"deployments_user_id_users_id_fk": {
|
||||||
|
"name": "deployments_user_id_users_id_fk",
|
||||||
|
"tableFrom": "deployments",
|
||||||
|
"tableTo": "users",
|
||||||
|
"columnsFrom": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
},
|
||||||
|
"deployments_workflow_version_id_workflow_versions_id_fk": {
|
||||||
|
"name": "deployments_workflow_version_id_workflow_versions_id_fk",
|
||||||
|
"tableFrom": "deployments",
|
||||||
|
"tableTo": "workflow_versions",
|
||||||
|
"columnsFrom": [
|
||||||
|
"workflow_version_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "no action",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
},
|
||||||
|
"deployments_workflow_id_workflows_id_fk": {
|
||||||
|
"name": "deployments_workflow_id_workflows_id_fk",
|
||||||
|
"tableFrom": "deployments",
|
||||||
|
"tableTo": "workflows",
|
||||||
|
"columnsFrom": [
|
||||||
|
"workflow_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
},
|
||||||
|
"deployments_machine_id_machines_id_fk": {
|
||||||
|
"name": "deployments_machine_id_machines_id_fk",
|
||||||
|
"tableFrom": "deployments",
|
||||||
|
"tableTo": "machines",
|
||||||
|
"columnsFrom": [
|
||||||
|
"machine_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "no action",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {}
|
||||||
|
},
|
||||||
|
"machines": {
|
||||||
|
"name": "machines",
|
||||||
|
"schema": "comfyui_deploy",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "gen_random_uuid()"
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"name": "user_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"org_id": {
|
||||||
|
"name": "org_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"endpoint": {
|
||||||
|
"name": "endpoint",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
},
|
||||||
|
"disabled": {
|
||||||
|
"name": "disabled",
|
||||||
|
"type": "boolean",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": false
|
||||||
|
},
|
||||||
|
"auth_token": {
|
||||||
|
"name": "auth_token",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"name": "type",
|
||||||
|
"type": "machine_type",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "'classic'"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"name": "status",
|
||||||
|
"type": "machine_status",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "'ready'"
|
||||||
|
},
|
||||||
|
"snapshot": {
|
||||||
|
"name": "snapshot",
|
||||||
|
"type": "jsonb",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"build_log": {
|
||||||
|
"name": "build_log",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"machines_user_id_users_id_fk": {
|
||||||
|
"name": "machines_user_id_users_id_fk",
|
||||||
|
"tableFrom": "machines",
|
||||||
|
"tableTo": "users",
|
||||||
|
"columnsFrom": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {}
|
||||||
|
},
|
||||||
|
"users": {
|
||||||
|
"name": "users",
|
||||||
|
"schema": "comfyui_deploy",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"username": {
|
||||||
|
"name": "username",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"default": "now()"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false,
|
||||||
|
"default": "now()"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {}
|
||||||
|
},
|
||||||
|
"workflow_run_outputs": {
|
||||||
|
"name": "workflow_run_outputs",
|
||||||
|
"schema": "comfyui_deploy",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "gen_random_uuid()"
|
||||||
|
},
|
||||||
|
"run_id": {
|
||||||
|
"name": "run_id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"data": {
|
||||||
|
"name": "data",
|
||||||
|
"type": "jsonb",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"workflow_run_outputs_run_id_workflow_runs_id_fk": {
|
||||||
|
"name": "workflow_run_outputs_run_id_workflow_runs_id_fk",
|
||||||
|
"tableFrom": "workflow_run_outputs",
|
||||||
|
"tableTo": "workflow_runs",
|
||||||
|
"columnsFrom": [
|
||||||
|
"run_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {}
|
||||||
|
},
|
||||||
|
"workflow_runs": {
|
||||||
|
"name": "workflow_runs",
|
||||||
|
"schema": "comfyui_deploy",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "gen_random_uuid()"
|
||||||
|
},
|
||||||
|
"workflow_version_id": {
|
||||||
|
"name": "workflow_version_id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"workflow_inputs": {
|
||||||
|
"name": "workflow_inputs",
|
||||||
|
"type": "jsonb",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"workflow_id": {
|
||||||
|
"name": "workflow_id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"machine_id": {
|
||||||
|
"name": "machine_id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"origin": {
|
||||||
|
"name": "origin",
|
||||||
|
"type": "workflow_run_origin",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "'api'"
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"name": "status",
|
||||||
|
"type": "workflow_run_status",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "'not-started'"
|
||||||
|
},
|
||||||
|
"ended_at": {
|
||||||
|
"name": "ended_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"workflow_runs_workflow_version_id_workflow_versions_id_fk": {
|
||||||
|
"name": "workflow_runs_workflow_version_id_workflow_versions_id_fk",
|
||||||
|
"tableFrom": "workflow_runs",
|
||||||
|
"tableTo": "workflow_versions",
|
||||||
|
"columnsFrom": [
|
||||||
|
"workflow_version_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "set null",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
},
|
||||||
|
"workflow_runs_workflow_id_workflows_id_fk": {
|
||||||
|
"name": "workflow_runs_workflow_id_workflows_id_fk",
|
||||||
|
"tableFrom": "workflow_runs",
|
||||||
|
"tableTo": "workflows",
|
||||||
|
"columnsFrom": [
|
||||||
|
"workflow_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
},
|
||||||
|
"workflow_runs_machine_id_machines_id_fk": {
|
||||||
|
"name": "workflow_runs_machine_id_machines_id_fk",
|
||||||
|
"tableFrom": "workflow_runs",
|
||||||
|
"tableTo": "machines",
|
||||||
|
"columnsFrom": [
|
||||||
|
"machine_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "set null",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {}
|
||||||
|
},
|
||||||
|
"workflows": {
|
||||||
|
"name": "workflows",
|
||||||
|
"schema": "comfyui_deploy",
|
||||||
|
"columns": {
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "gen_random_uuid()"
|
||||||
|
},
|
||||||
|
"user_id": {
|
||||||
|
"name": "user_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"org_id": {
|
||||||
|
"name": "org_id",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"name": {
|
||||||
|
"name": "name",
|
||||||
|
"type": "text",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"workflows_user_id_users_id_fk": {
|
||||||
|
"name": "workflows_user_id_users_id_fk",
|
||||||
|
"tableFrom": "workflows",
|
||||||
|
"tableTo": "users",
|
||||||
|
"columnsFrom": [
|
||||||
|
"user_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {}
|
||||||
|
},
|
||||||
|
"workflow_versions": {
|
||||||
|
"name": "workflow_versions",
|
||||||
|
"schema": "comfyui_deploy",
|
||||||
|
"columns": {
|
||||||
|
"workflow_id": {
|
||||||
|
"name": "workflow_id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"id": {
|
||||||
|
"name": "id",
|
||||||
|
"type": "uuid",
|
||||||
|
"primaryKey": true,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "gen_random_uuid()"
|
||||||
|
},
|
||||||
|
"workflow": {
|
||||||
|
"name": "workflow",
|
||||||
|
"type": "jsonb",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"workflow_api": {
|
||||||
|
"name": "workflow_api",
|
||||||
|
"type": "jsonb",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"version": {
|
||||||
|
"name": "version",
|
||||||
|
"type": "integer",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true
|
||||||
|
},
|
||||||
|
"snapshot": {
|
||||||
|
"name": "snapshot",
|
||||||
|
"type": "jsonb",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": false
|
||||||
|
},
|
||||||
|
"created_at": {
|
||||||
|
"name": "created_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
},
|
||||||
|
"updated_at": {
|
||||||
|
"name": "updated_at",
|
||||||
|
"type": "timestamp",
|
||||||
|
"primaryKey": false,
|
||||||
|
"notNull": true,
|
||||||
|
"default": "now()"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"indexes": {},
|
||||||
|
"foreignKeys": {
|
||||||
|
"workflow_versions_workflow_id_workflows_id_fk": {
|
||||||
|
"name": "workflow_versions_workflow_id_workflows_id_fk",
|
||||||
|
"tableFrom": "workflow_versions",
|
||||||
|
"tableTo": "workflows",
|
||||||
|
"columnsFrom": [
|
||||||
|
"workflow_id"
|
||||||
|
],
|
||||||
|
"columnsTo": [
|
||||||
|
"id"
|
||||||
|
],
|
||||||
|
"onDelete": "cascade",
|
||||||
|
"onUpdate": "no action"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"compositePrimaryKeys": {},
|
||||||
|
"uniqueConstraints": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"enums": {
|
||||||
|
"deployment_environment": {
|
||||||
|
"name": "deployment_environment",
|
||||||
|
"values": {
|
||||||
|
"staging": "staging",
|
||||||
|
"production": "production"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"machine_status": {
|
||||||
|
"name": "machine_status",
|
||||||
|
"values": {
|
||||||
|
"ready": "ready",
|
||||||
|
"building": "building",
|
||||||
|
"error": "error"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"machine_type": {
|
||||||
|
"name": "machine_type",
|
||||||
|
"values": {
|
||||||
|
"classic": "classic",
|
||||||
|
"runpod-serverless": "runpod-serverless",
|
||||||
|
"modal-serverless": "modal-serverless",
|
||||||
|
"comfy-deploy-serverless": "comfy-deploy-serverless"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workflow_run_origin": {
|
||||||
|
"name": "workflow_run_origin",
|
||||||
|
"values": {
|
||||||
|
"manual": "manual",
|
||||||
|
"api": "api"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"workflow_run_status": {
|
||||||
|
"name": "workflow_run_status",
|
||||||
|
"values": {
|
||||||
|
"not-started": "not-started",
|
||||||
|
"running": "running",
|
||||||
|
"uploading": "uploading",
|
||||||
|
"success": "success",
|
||||||
|
"failed": "failed"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"schemas": {
|
||||||
|
"comfyui_deploy": "comfyui_deploy"
|
||||||
|
},
|
||||||
|
"_meta": {
|
||||||
|
"schemas": {},
|
||||||
|
"tables": {},
|
||||||
|
"columns": {}
|
||||||
|
}
|
||||||
|
}
|
@ -155,6 +155,13 @@
|
|||||||
"when": 1704380757696,
|
"when": 1704380757696,
|
||||||
"tag": "0021_aromatic_sabra",
|
"tag": "0021_aromatic_sabra",
|
||||||
"breakpoints": true
|
"breakpoints": true
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"idx": 22,
|
||||||
|
"version": "5",
|
||||||
|
"when": 1704453649633,
|
||||||
|
"tag": "0022_petite_bishop",
|
||||||
|
"breakpoints": true
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
@ -1,6 +1,7 @@
|
|||||||
import { parseJWT } from "../../../../server/parseJWT";
|
import { parseJWT } from "../../../../server/parseJWT";
|
||||||
import { db } from "@/db/db";
|
import { db } from "@/db/db";
|
||||||
import {
|
import {
|
||||||
|
snapshotType,
|
||||||
workflowAPIType,
|
workflowAPIType,
|
||||||
workflowTable,
|
workflowTable,
|
||||||
workflowType,
|
workflowType,
|
||||||
@ -18,11 +19,11 @@ const corsHeaders = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const UploadRequest = z.object({
|
const UploadRequest = z.object({
|
||||||
// user_id: z.string(),
|
|
||||||
workflow_id: z.string().optional(),
|
workflow_id: z.string().optional(),
|
||||||
workflow_name: z.string().optional(),
|
workflow_name: z.string().min(1).optional(),
|
||||||
workflow: workflowType,
|
workflow: workflowType,
|
||||||
workflow_api: workflowAPIType,
|
workflow_api: workflowAPIType,
|
||||||
|
snapshot: snapshotType,
|
||||||
});
|
});
|
||||||
|
|
||||||
export async function OPTIONS(request: Request) {
|
export async function OPTIONS(request: Request) {
|
||||||
@ -64,6 +65,7 @@ export async function POST(request: Request) {
|
|||||||
workflow_api,
|
workflow_api,
|
||||||
workflow_id: _workflow_id,
|
workflow_id: _workflow_id,
|
||||||
workflow_name,
|
workflow_name,
|
||||||
|
snapshot,
|
||||||
} = data;
|
} = data;
|
||||||
|
|
||||||
let workflow_id = _workflow_id;
|
let workflow_id = _workflow_id;
|
||||||
@ -93,6 +95,7 @@ export async function POST(request: Request) {
|
|||||||
workflow,
|
workflow,
|
||||||
workflow_api,
|
workflow_api,
|
||||||
version: 1,
|
version: 1,
|
||||||
|
snapshot: snapshot,
|
||||||
})
|
})
|
||||||
.returning();
|
.returning();
|
||||||
version = data[0].version;
|
version = data[0].version;
|
||||||
@ -105,6 +108,7 @@ export async function POST(request: Request) {
|
|||||||
workflow: workflow,
|
workflow: workflow,
|
||||||
workflow_api,
|
workflow_api,
|
||||||
// version: sql`${workflowVersionTable.version} + 1`,
|
// version: sql`${workflowVersionTable.version} + 1`,
|
||||||
|
snapshot: snapshot,
|
||||||
version: sql`(
|
version: sql`(
|
||||||
SELECT COALESCE(MAX(version), 0) + 1
|
SELECT COALESCE(MAX(version), 0) + 1
|
||||||
FROM ${workflowVersionTable}
|
FROM ${workflowVersionTable}
|
||||||
|
@ -69,6 +69,7 @@ export const workflowVersionTable = dbSchema.table("workflow_versions", {
|
|||||||
workflow: jsonb("workflow").$type<z.infer<typeof workflowType>>(),
|
workflow: jsonb("workflow").$type<z.infer<typeof workflowType>>(),
|
||||||
workflow_api: jsonb("workflow_api").$type<z.infer<typeof workflowAPIType>>(),
|
workflow_api: jsonb("workflow_api").$type<z.infer<typeof workflowAPIType>>(),
|
||||||
version: integer("version").notNull(),
|
version: integer("version").notNull(),
|
||||||
|
snapshot: jsonb("snapshot").$type<z.infer<typeof snapshotType>>(),
|
||||||
|
|
||||||
created_at: timestamp("created_at").defaultNow().notNull(),
|
created_at: timestamp("created_at").defaultNow().notNull(),
|
||||||
updated_at: timestamp("updated_at").defaultNow().notNull(),
|
updated_at: timestamp("updated_at").defaultNow().notNull(),
|
||||||
@ -201,10 +202,21 @@ export const machinesTable = dbSchema.table("machines", {
|
|||||||
auth_token: text("auth_token"),
|
auth_token: text("auth_token"),
|
||||||
type: machinesType("type").notNull().default("classic"),
|
type: machinesType("type").notNull().default("classic"),
|
||||||
status: machinesStatus("status").notNull().default("ready"),
|
status: machinesStatus("status").notNull().default("ready"),
|
||||||
snapshot: jsonb("snapshot").$type<any>(),
|
snapshot: jsonb("snapshot").$type<z.infer<typeof snapshotType>>(),
|
||||||
build_log: text("build_log"),
|
build_log: text("build_log"),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
export const snapshotType = z.object({
|
||||||
|
comfyui: z.string(),
|
||||||
|
git_custom_nodes: z.record(
|
||||||
|
z.object({
|
||||||
|
hash: z.string(),
|
||||||
|
disabled: z.boolean(),
|
||||||
|
})
|
||||||
|
),
|
||||||
|
file_custom_nodes: z.array(z.any()),
|
||||||
|
});
|
||||||
|
|
||||||
export const insertMachineSchema = createInsertSchema(machinesTable, {
|
export const insertMachineSchema = createInsertSchema(machinesTable, {
|
||||||
name: (schema) => schema.name.default("My Machine"),
|
name: (schema) => schema.name.default("My Machine"),
|
||||||
endpoint: (schema) => schema.endpoint.default("http://127.0.0.1:8188"),
|
endpoint: (schema) => schema.endpoint.default("http://127.0.0.1:8188"),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user