273 lines
9.0 KiB
MySQL
273 lines
9.0 KiB
MySQL
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "UserStatus" AS ENUM ('PENDING_VERIFICATION', 'ACTIVE', 'SUSPENDED');
|
||
|
|
|
||
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "StaffRole" AS ENUM ('ADMIN', 'SUPPORT');
|
||
|
|
|
||
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "SubscriptionPlan" AS ENUM ('TRIAL', 'STARTER', 'PRO', 'ENTERPRISE');
|
||
|
|
|
||
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "SubscriptionTier" AS ENUM ('HUB_DASHBOARD', 'ADVANCED');
|
||
|
|
|
||
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "SubscriptionStatus" AS ENUM ('TRIAL', 'ACTIVE', 'CANCELED', 'PAST_DUE');
|
||
|
|
|
||
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "OrderStatus" AS ENUM ('PAYMENT_CONFIRMED', 'AWAITING_SERVER', 'SERVER_READY', 'DNS_PENDING', 'DNS_READY', 'PROVISIONING', 'FULFILLED', 'EMAIL_CONFIGURED', 'FAILED');
|
||
|
|
|
||
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "JobStatus" AS ENUM ('PENDING', 'CLAIMED', 'RUNNING', 'COMPLETED', 'FAILED', 'DEAD');
|
||
|
|
|
||
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "LogLevel" AS ENUM ('DEBUG', 'INFO', 'WARN', 'ERROR');
|
||
|
|
|
||
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "ServerConnectionStatus" AS ENUM ('PENDING', 'REGISTERED', 'ONLINE', 'OFFLINE');
|
||
|
|
|
||
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "CommandStatus" AS ENUM ('PENDING', 'SENT', 'EXECUTING', 'COMPLETED', 'FAILED');
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "users" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"email" TEXT NOT NULL,
|
||
|
|
"password_hash" TEXT NOT NULL,
|
||
|
|
"name" TEXT,
|
||
|
|
"company" TEXT,
|
||
|
|
"status" "UserStatus" NOT NULL DEFAULT 'PENDING_VERIFICATION',
|
||
|
|
"email_verified" TIMESTAMP(3),
|
||
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
||
|
|
|
||
|
|
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "staff" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"email" TEXT NOT NULL,
|
||
|
|
"password_hash" TEXT NOT NULL,
|
||
|
|
"name" TEXT NOT NULL,
|
||
|
|
"role" "StaffRole" NOT NULL DEFAULT 'SUPPORT',
|
||
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
||
|
|
|
||
|
|
CONSTRAINT "staff_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "subscriptions" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"user_id" TEXT NOT NULL,
|
||
|
|
"plan" "SubscriptionPlan" NOT NULL DEFAULT 'TRIAL',
|
||
|
|
"tier" "SubscriptionTier" NOT NULL DEFAULT 'HUB_DASHBOARD',
|
||
|
|
"token_limit" INTEGER NOT NULL DEFAULT 10000,
|
||
|
|
"tokens_used" INTEGER NOT NULL DEFAULT 0,
|
||
|
|
"trial_ends_at" TIMESTAMP(3),
|
||
|
|
"stripe_customer_id" TEXT,
|
||
|
|
"stripe_subscription_id" TEXT,
|
||
|
|
"status" "SubscriptionStatus" NOT NULL DEFAULT 'TRIAL',
|
||
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
||
|
|
|
||
|
|
CONSTRAINT "subscriptions_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "orders" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"user_id" TEXT NOT NULL,
|
||
|
|
"status" "OrderStatus" NOT NULL DEFAULT 'PAYMENT_CONFIRMED',
|
||
|
|
"tier" "SubscriptionTier" NOT NULL,
|
||
|
|
"domain" TEXT NOT NULL,
|
||
|
|
"tools" TEXT[],
|
||
|
|
"config_json" JSONB NOT NULL,
|
||
|
|
"server_ip" TEXT,
|
||
|
|
"server_password_encrypted" TEXT,
|
||
|
|
"ssh_port" INTEGER NOT NULL DEFAULT 22,
|
||
|
|
"portainer_url" TEXT,
|
||
|
|
"dashboard_url" TEXT,
|
||
|
|
"failure_reason" TEXT,
|
||
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
||
|
|
"server_ready_at" TIMESTAMP(3),
|
||
|
|
"provisioning_started_at" TIMESTAMP(3),
|
||
|
|
"completed_at" TIMESTAMP(3),
|
||
|
|
|
||
|
|
CONSTRAINT "orders_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "provisioning_logs" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"order_id" TEXT NOT NULL,
|
||
|
|
"level" "LogLevel" NOT NULL DEFAULT 'INFO',
|
||
|
|
"message" TEXT NOT NULL,
|
||
|
|
"step" TEXT,
|
||
|
|
"timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
|
||
|
|
CONSTRAINT "provisioning_logs_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "provisioning_jobs" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"order_id" TEXT NOT NULL,
|
||
|
|
"job_type" TEXT NOT NULL,
|
||
|
|
"status" "JobStatus" NOT NULL DEFAULT 'PENDING',
|
||
|
|
"priority" INTEGER NOT NULL DEFAULT 0,
|
||
|
|
"claimed_at" TIMESTAMP(3),
|
||
|
|
"claimed_by" TEXT,
|
||
|
|
"container_name" TEXT,
|
||
|
|
"attempt" INTEGER NOT NULL DEFAULT 1,
|
||
|
|
"max_attempts" INTEGER NOT NULL DEFAULT 3,
|
||
|
|
"next_retry_at" TIMESTAMP(3),
|
||
|
|
"config_snapshot" JSONB NOT NULL,
|
||
|
|
"runner_token_hash" TEXT,
|
||
|
|
"result" JSONB,
|
||
|
|
"error" TEXT,
|
||
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
||
|
|
"completed_at" TIMESTAMP(3),
|
||
|
|
|
||
|
|
CONSTRAINT "provisioning_jobs_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "job_logs" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"job_id" TEXT NOT NULL,
|
||
|
|
"level" "LogLevel" NOT NULL DEFAULT 'INFO',
|
||
|
|
"message" TEXT NOT NULL,
|
||
|
|
"step" TEXT,
|
||
|
|
"progress" INTEGER,
|
||
|
|
"timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
|
||
|
|
CONSTRAINT "job_logs_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "token_usage" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"user_id" TEXT NOT NULL,
|
||
|
|
"instance_id" TEXT,
|
||
|
|
"operation" TEXT NOT NULL,
|
||
|
|
"tokens_input" INTEGER NOT NULL,
|
||
|
|
"tokens_output" INTEGER NOT NULL,
|
||
|
|
"model" TEXT NOT NULL,
|
||
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
|
||
|
|
CONSTRAINT "token_usage_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "runner_tokens" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"token_hash" TEXT NOT NULL,
|
||
|
|
"name" TEXT NOT NULL,
|
||
|
|
"is_active" BOOLEAN NOT NULL DEFAULT true,
|
||
|
|
"last_used" TIMESTAMP(3),
|
||
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
|
||
|
|
CONSTRAINT "runner_tokens_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "server_connections" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"order_id" TEXT NOT NULL,
|
||
|
|
"registration_token" TEXT NOT NULL,
|
||
|
|
"hub_api_key" TEXT,
|
||
|
|
"orchestrator_url" TEXT,
|
||
|
|
"agent_version" TEXT,
|
||
|
|
"status" "ServerConnectionStatus" NOT NULL DEFAULT 'PENDING',
|
||
|
|
"registered_at" TIMESTAMP(3),
|
||
|
|
"last_heartbeat" TIMESTAMP(3),
|
||
|
|
"created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updated_at" TIMESTAMP(3) NOT NULL,
|
||
|
|
|
||
|
|
CONSTRAINT "server_connections_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "remote_commands" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"server_connection_id" TEXT NOT NULL,
|
||
|
|
"type" TEXT NOT NULL,
|
||
|
|
"payload" JSONB NOT NULL,
|
||
|
|
"status" "CommandStatus" NOT NULL DEFAULT 'PENDING',
|
||
|
|
"result" JSONB,
|
||
|
|
"error_message" TEXT,
|
||
|
|
"queued_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"sent_at" TIMESTAMP(3),
|
||
|
|
"executed_at" TIMESTAMP(3),
|
||
|
|
"completed_at" TIMESTAMP(3),
|
||
|
|
"initiated_by" TEXT,
|
||
|
|
|
||
|
|
CONSTRAINT "remote_commands_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE UNIQUE INDEX "staff_email_key" ON "staff"("email");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "provisioning_logs_order_id_timestamp_idx" ON "provisioning_logs"("order_id", "timestamp");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "provisioning_jobs_status_priority_created_at_idx" ON "provisioning_jobs"("status", "priority", "created_at");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "provisioning_jobs_order_id_idx" ON "provisioning_jobs"("order_id");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "job_logs_job_id_timestamp_idx" ON "job_logs"("job_id", "timestamp");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "token_usage_user_id_created_at_idx" ON "token_usage"("user_id", "created_at");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE UNIQUE INDEX "runner_tokens_token_hash_key" ON "runner_tokens"("token_hash");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE UNIQUE INDEX "server_connections_order_id_key" ON "server_connections"("order_id");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE UNIQUE INDEX "server_connections_registration_token_key" ON "server_connections"("registration_token");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE UNIQUE INDEX "server_connections_hub_api_key_key" ON "server_connections"("hub_api_key");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "remote_commands_server_connection_id_status_idx" ON "remote_commands"("server_connection_id", "status");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "remote_commands_status_queued_at_idx" ON "remote_commands"("status", "queued_at");
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "subscriptions" ADD CONSTRAINT "subscriptions_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "orders" ADD CONSTRAINT "orders_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "provisioning_logs" ADD CONSTRAINT "provisioning_logs_order_id_fkey" FOREIGN KEY ("order_id") REFERENCES "orders"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "provisioning_jobs" ADD CONSTRAINT "provisioning_jobs_order_id_fkey" FOREIGN KEY ("order_id") REFERENCES "orders"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "job_logs" ADD CONSTRAINT "job_logs_job_id_fkey" FOREIGN KEY ("job_id") REFERENCES "provisioning_jobs"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "token_usage" ADD CONSTRAINT "token_usage_user_id_fkey" FOREIGN KEY ("user_id") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "server_connections" ADD CONSTRAINT "server_connections_order_id_fkey" FOREIGN KEY ("order_id") REFERENCES "orders"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "remote_commands" ADD CONSTRAINT "remote_commands_server_connection_id_fkey" FOREIGN KEY ("server_connection_id") REFERENCES "server_connections"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|