-- 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;