From f948fca78cdef5fc90bac2347012694ccf4e389f Mon Sep 17 00:00:00 2001 From: Karrix Date: Tue, 23 Jan 2024 01:58:05 +0800 Subject: [PATCH] add: add unit (per second) to lemonsqueezy after run, and sync to db table --- web/bun.lockb | Bin 498075 -> 498484 bytes web/drizzle/0033_fantastic_marvel_boy.sql | 13 + web/drizzle/0034_previous_viper.sql | 2 + web/drizzle/meta/0033_snapshot.json | 834 +++++++++++++++++ web/drizzle/meta/0034_snapshot.json | 842 ++++++++++++++++++ web/drizzle/meta/_journal.json | 14 + web/src/app/(app)/api/update-run/route.ts | 65 +- .../pricing/components/pricePlanList.tsx | 7 +- web/src/db/schema.ts | 120 +-- 9 files changed, 1831 insertions(+), 66 deletions(-) create mode 100644 web/drizzle/0033_fantastic_marvel_boy.sql create mode 100644 web/drizzle/0034_previous_viper.sql create mode 100644 web/drizzle/meta/0033_snapshot.json create mode 100644 web/drizzle/meta/0034_snapshot.json diff --git a/web/bun.lockb b/web/bun.lockb index c5cc14e81f695aabf0c4d68e96314844fb7b95d8..1af90ac5bb77bea12ee4d1cc2b7c653032569e37 100755 GIT binary patch delta 80747 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

q_9>%XkhN2uU*eyAnoPOpv9XQHcsS)jW3 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 delta 80409 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 diff --git a/web/drizzle/0033_fantastic_marvel_boy.sql b/web/drizzle/0033_fantastic_marvel_boy.sql new file mode 100644 index 0000000..088987b --- /dev/null +++ b/web/drizzle/0033_fantastic_marvel_boy.sql @@ -0,0 +1,13 @@ +CREATE TABLE IF NOT EXISTS "comfyui_deploy"."user_usage" ( + "id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL, + "user_id" text NOT NULL, + "usage_time" real DEFAULT 0 NOT NULL, + "created_at" timestamp DEFAULT now() NOT NULL, + "updated_at" timestamp DEFAULT now() NOT NULL +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "comfyui_deploy"."user_usage" ADD CONSTRAINT "user_usage_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "comfyui_deploy"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/web/drizzle/0034_previous_viper.sql b/web/drizzle/0034_previous_viper.sql new file mode 100644 index 0000000..5953e59 --- /dev/null +++ b/web/drizzle/0034_previous_viper.sql @@ -0,0 +1,2 @@ +ALTER TABLE "comfyui_deploy"."user_usage" RENAME COLUMN "updated_at" TO "ended_at";--> statement-breakpoint +ALTER TABLE "comfyui_deploy"."user_usage" ADD COLUMN "org_id" text; \ No newline at end of file diff --git a/web/drizzle/meta/0033_snapshot.json b/web/drizzle/meta/0033_snapshot.json new file mode 100644 index 0000000..2c75c2a --- /dev/null +++ b/web/drizzle/meta/0033_snapshot.json @@ -0,0 +1,834 @@ +{ + "id": "91bb0461-452a-4e59-abf4-8757fcd75a89", + "prevId": "1425ee00-66fb-4541-8da7-19b217944545", + "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 + }, + "org_id": { + "name": "org_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "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 + }, + "share_slug": { + "name": "share_slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "showcase_media": { + "name": "showcase_media", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "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": { + "deployments_share_slug_unique": { + "name": "deployments_share_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "share_slug" + ] + } + } + }, + "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 + }, + "models": { + "name": "models", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "gpu": { + "name": "gpu", + "type": "machine_gpu", + "primaryKey": false, + "notNull": false + }, + "build_machine_instance_id": { + "name": "build_machine_instance_id", + "type": "text", + "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": {} + }, + "user_usage": { + "name": "user_usage", + "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 + }, + "usage_time": { + "name": "usage_time", + "type": "real", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "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": { + "user_usage_user_id_users_id_fk": { + "name": "user_usage_user_id_users_id_fk", + "tableFrom": "user_usage", + "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()" + }, + "started_at": { + "name": "started_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "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", + "public-share": "public-share" + } + }, + "machine_gpu": { + "name": "machine_gpu", + "values": { + "T4": "T4", + "A10G": "A10G", + "A100": "A100" + } + }, + "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", + "public-share": "public-share" + } + }, + "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": {} + } +} \ No newline at end of file diff --git a/web/drizzle/meta/0034_snapshot.json b/web/drizzle/meta/0034_snapshot.json new file mode 100644 index 0000000..de5f69b --- /dev/null +++ b/web/drizzle/meta/0034_snapshot.json @@ -0,0 +1,842 @@ +{ + "id": "fad17dc9-86c5-4081-8e73-47c113f48936", + "prevId": "91bb0461-452a-4e59-abf4-8757fcd75a89", + "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 + }, + "org_id": { + "name": "org_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "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 + }, + "share_slug": { + "name": "share_slug", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "showcase_media": { + "name": "showcase_media", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "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": { + "deployments_share_slug_unique": { + "name": "deployments_share_slug_unique", + "nullsNotDistinct": false, + "columns": [ + "share_slug" + ] + } + } + }, + "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 + }, + "models": { + "name": "models", + "type": "jsonb", + "primaryKey": false, + "notNull": false + }, + "gpu": { + "name": "gpu", + "type": "machine_gpu", + "primaryKey": false, + "notNull": false + }, + "build_machine_instance_id": { + "name": "build_machine_instance_id", + "type": "text", + "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": {} + }, + "user_usage": { + "name": "user_usage", + "schema": "comfyui_deploy", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "org_id": { + "name": "org_id", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "usage_time": { + "name": "usage_time", + "type": "real", + "primaryKey": false, + "notNull": true, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "ended_at": { + "name": "ended_at", + "type": "timestamp", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_usage_user_id_users_id_fk": { + "name": "user_usage_user_id_users_id_fk", + "tableFrom": "user_usage", + "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()" + }, + "started_at": { + "name": "started_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false + } + }, + "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", + "public-share": "public-share" + } + }, + "machine_gpu": { + "name": "machine_gpu", + "values": { + "T4": "T4", + "A10G": "A10G", + "A100": "A100" + } + }, + "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", + "public-share": "public-share" + } + }, + "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": { + "\"comfyui_deploy\".\"user_usage\".\"updated_at\"": "\"comfyui_deploy\".\"user_usage\".\"ended_at\"" + } + } +} \ No newline at end of file diff --git a/web/drizzle/meta/_journal.json b/web/drizzle/meta/_journal.json index a262f43..abc42ef 100644 --- a/web/drizzle/meta/_journal.json +++ b/web/drizzle/meta/_journal.json @@ -232,6 +232,20 @@ "when": 1705806921697, "tag": "0032_shallow_vermin", "breakpoints": true + }, + { + "idx": 33, + "version": "5", + "when": 1705824362978, + "tag": "0033_fantastic_marvel_boy", + "breakpoints": true + }, + { + "idx": 34, + "version": "5", + "when": 1705840184127, + "tag": "0034_previous_viper", + "breakpoints": true } ] } \ No newline at end of file diff --git a/web/src/app/(app)/api/update-run/route.ts b/web/src/app/(app)/api/update-run/route.ts index e712eb1..e4b98db 100644 --- a/web/src/app/(app)/api/update-run/route.ts +++ b/web/src/app/(app)/api/update-run/route.ts @@ -1,6 +1,13 @@ import { parseDataSafe } from "../../../../lib/parseDataSafe"; import { db } from "@/db/db"; -import { workflowRunOutputs, workflowRunsTable } from "@/db/schema"; +import { + userUsageTable, + workflowRunOutputs, + workflowRunsTable, + workflowTable, +} from "@/db/schema"; +import { getDuration } from "@/lib/getRelativeTime"; +import { getSubscription, setUsage } from "@/server/linkToPricing"; import { eq } from "drizzle-orm"; import { NextResponse } from "next/server"; import { z } from "zod"; @@ -27,7 +34,6 @@ export async function POST(request: Request) { data: output_data, }); } else if (status) { - // console.log("status", status); const workflow_run = await db .update(workflowRunsTable) .set({ @@ -35,8 +41,15 @@ export async function POST(request: Request) { ended_at: status === "success" || status === "failed" ? new Date() : null, }) - .where(eq(workflowRunsTable.id, run_id)) - .returning(); + .where(eq(workflowRunsTable.id, run_id)); + + // get data from workflowRunsTable + const userUsageTime = await importUserUsageData(run_id); + + if (userUsageTime) { + // get the usage_time from userUsage + await addSubscriptionUnit(userUsageTime); + } } // const workflow_version = await db.query.workflowVersionTable.findFirst({ @@ -54,3 +67,47 @@ export async function POST(request: Request) { } ); } + +async function addSubscriptionUnit(userUsageTime: number) { + const subscription = await getSubscription(); + + // round up userUsageTime to the nearest integer + const roundedUsageTime = Math.ceil(userUsageTime); + + if (subscription) { + const usage = await setUsage( + subscription.data[0].attributes.first_subscription_item.id, + roundedUsageTime + ); + } +} + +async function importUserUsageData(run_id: string) { + const workflowRuns = await db.query.workflowRunsTable.findFirst({ + where: eq(workflowRunsTable.id, run_id), + }); + + if (!workflowRuns?.workflow_id) return; + + // find if workflowTable id column contains workflowRunsTable workflow_id + const workflow = await db.query.workflowTable.findFirst({ + where: eq(workflowTable.id, workflowRuns.workflow_id), + }); + + if (workflowRuns?.ended_at === null || workflow == null) return; + + const usageTime = parseFloat( + getDuration((workflowRuns?.ended_at - workflowRuns?.started_at) / 1000) + ); + + // add data to userUsageTable + const user_usage = await db.insert(userUsageTable).values({ + user_id: workflow.user_id, + created_at: workflowRuns.ended_at, + org_id: workflow.org_id, + ended_at: workflowRuns.ended_at, + usage_time: usageTime, + }); + + return usageTime; +} diff --git a/web/src/app/(app)/pricing/components/pricePlanList.tsx b/web/src/app/(app)/pricing/components/pricePlanList.tsx index d097741..19f255b 100644 --- a/web/src/app/(app)/pricing/components/pricePlanList.tsx +++ b/web/src/app/(app)/pricing/components/pricePlanList.tsx @@ -2,6 +2,7 @@ import { checkMarkIcon, crossMarkIcon } from "../const/Icon"; import { cn } from "@/lib/utils"; import { getPricing, + getSubscription, getSubscriptionItem, getUsage, setUsage, @@ -89,12 +90,14 @@ export default function PricingList() { // const currentUser = await getUserData(); const userUsage = await getUsage(); - const userSubscription = await getSubscriptionItem(); + const userSubscription = await getSubscription(); // const setUserUsage = await setUsage(236561, 10); // console.log(currentUser); - console.log(userSubscription); + console.log( + userSubscription.data[0].attributes.first_subscription_item.id + ); })(); }, []); diff --git a/web/src/db/schema.ts b/web/src/db/schema.ts index 4db5091..64df610 100644 --- a/web/src/db/schema.ts +++ b/web/src/db/schema.ts @@ -1,14 +1,14 @@ import { type InferSelectModel, relations } from "drizzle-orm"; import { - boolean, - integer, - jsonb, - pgEnum, - pgSchema, - text, - timestamp, - uuid, - real, + boolean, + integer, + jsonb, + pgEnum, + pgSchema, + text, + timestamp, + uuid, + real, } from "drizzle-orm/pg-core"; import { createInsertSchema } from "drizzle-zod"; import { z } from "zod"; @@ -131,30 +131,30 @@ export const machinesStatus = pgEnum("machine_status", [ // We still want to keep the workflow run record. export const workflowRunsTable = dbSchema.table("workflow_runs", { - id: uuid("id").primaryKey().defaultRandom().notNull(), - // when workflow version deleted, still want to keep this record - workflow_version_id: uuid("workflow_version_id").references( - () => workflowVersionTable.id, - { - onDelete: "set null", - }, - ), - workflow_inputs: - jsonb("workflow_inputs").$type>(), - workflow_id: uuid("workflow_id") - .notNull() - .references(() => workflowTable.id, { - onDelete: "cascade", - }), - // when machine deleted, still want to keep this record - machine_id: uuid("machine_id").references(() => machinesTable.id, { - onDelete: "set null", - }), - origin: workflowRunOrigin("origin").notNull().default("api"), - status: workflowRunStatus("status").notNull().default("not-started"), - ended_at: timestamp("ended_at"), - created_at: timestamp("created_at").defaultNow().notNull(), - started_at: timestamp("started_at"), + id: uuid("id").primaryKey().defaultRandom().notNull(), + // when workflow version deleted, still want to keep this record + workflow_version_id: uuid("workflow_version_id").references( + () => workflowVersionTable.id, + { + onDelete: "set null", + } + ), + workflow_inputs: + jsonb("workflow_inputs").$type>(), + workflow_id: uuid("workflow_id") + .notNull() + .references(() => workflowTable.id, { + onDelete: "cascade", + }), + // when machine deleted, still want to keep this record + machine_id: uuid("machine_id").references(() => machinesTable.id, { + onDelete: "set null", + }), + origin: workflowRunOrigin("origin").notNull().default("api"), + status: workflowRunStatus("status").notNull().default("not-started"), + ended_at: timestamp("ended_at"), + created_at: timestamp("created_at").defaultNow().notNull(), + started_at: timestamp("started_at"), }); export const workflowRunRelations = relations( @@ -258,31 +258,31 @@ export const showcaseMediaNullable = z .nullable(); export const deploymentsTable = dbSchema.table("deployments", { - id: uuid("id").primaryKey().defaultRandom().notNull(), - user_id: text("user_id") - .references(() => usersTable.id, { - onDelete: "cascade", - }) - .notNull(), - org_id: text("org_id"), - workflow_version_id: uuid("workflow_version_id") - .notNull() - .references(() => workflowVersionTable.id), - workflow_id: uuid("workflow_id") - .notNull() - .references(() => workflowTable.id, { - onDelete: "cascade", - }), - machine_id: uuid("machine_id") - .notNull() - .references(() => machinesTable.id), - share_slug: text("share_slug").unique(), - description: text("description"), - showcase_media: - jsonb("showcase_media").$type>(), - environment: deploymentEnvironment("environment").notNull(), - created_at: timestamp("created_at").defaultNow().notNull(), - updated_at: timestamp("updated_at").defaultNow().notNull(), + id: uuid("id").primaryKey().defaultRandom().notNull(), + user_id: text("user_id") + .references(() => usersTable.id, { + onDelete: "cascade", + }) + .notNull(), + org_id: text("org_id"), + workflow_version_id: uuid("workflow_version_id") + .notNull() + .references(() => workflowVersionTable.id), + workflow_id: uuid("workflow_id") + .notNull() + .references(() => workflowTable.id, { + onDelete: "cascade", + }), + machine_id: uuid("machine_id") + .notNull() + .references(() => machinesTable.id), + share_slug: text("share_slug").unique(), + description: text("description"), + showcase_media: + jsonb("showcase_media").$type>(), + environment: deploymentEnvironment("environment").notNull(), + created_at: timestamp("created_at").defaultNow().notNull(), + updated_at: timestamp("updated_at").defaultNow().notNull(), }); export const publicShareDeployment = z.object({ @@ -334,15 +334,15 @@ export const apiKeyTable = dbSchema.table("api_keys", { export const userUsageTable = dbSchema.table("user_usage", { id: uuid("id").primaryKey().defaultRandom().notNull(), + org_id: text("org_id"), user_id: text("user_id") .references(() => usersTable.id, { onDelete: "cascade", }) .notNull(), usage_time: real("usage_time").default(0).notNull(), - created_at: timestamp("created_at").defaultNow().notNull(), - updated_at: timestamp("updated_at").defaultNow().notNull(), + ended_at: timestamp("ended_at").defaultNow().notNull(), }); export type UserType = InferSelectModel;