80 lines
3.2 KiB
SQL
80 lines
3.2 KiB
SQL
-- Phase 7: Idle shutdown, credits, usage metering, plan quotas
|
|
|
|
CREATE TYPE "CreditTransactionType" AS ENUM ('GRANT', 'USAGE_DEBIT', 'ADJUSTMENT', 'EXPIRE');
|
|
|
|
ALTER TABLE "plans"
|
|
ADD COLUMN IF NOT EXISTS "maxServersPerUser" INTEGER,
|
|
ADD COLUMN IF NOT EXISTS "idleTimeoutMinutes" INTEGER NOT NULL DEFAULT 15,
|
|
ADD COLUMN IF NOT EXISTS "idleGraceAfterStartMinutes" INTEGER NOT NULL DEFAULT 3,
|
|
ADD COLUMN IF NOT EXISTS "idleCountdownSeconds" INTEGER NOT NULL DEFAULT 120,
|
|
ADD COLUMN IF NOT EXISTS "queuePriority" INTEGER NOT NULL DEFAULT 0,
|
|
ADD COLUMN IF NOT EXISTS "monthlyCreditGrant" INTEGER NOT NULL DEFAULT 0;
|
|
|
|
ALTER TABLE "game_servers"
|
|
ADD COLUMN IF NOT EXISTS "idleShutdownEnabled" BOOLEAN NOT NULL DEFAULT true,
|
|
ADD COLUMN IF NOT EXISTS "lastPlayerSeenAt" TIMESTAMPTZ(3),
|
|
ADD COLUMN IF NOT EXISTS "idleStopAt" TIMESTAMPTZ(3),
|
|
ADD COLUMN IF NOT EXISTS "runningSince" TIMESTAMPTZ(3),
|
|
ADD COLUMN IF NOT EXISTS "lastMeteredAt" TIMESTAMPTZ(3);
|
|
|
|
CREATE TABLE "credit_wallets" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"balance" INTEGER NOT NULL DEFAULT 0,
|
|
"periodStart" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMPTZ(3) NOT NULL,
|
|
|
|
CONSTRAINT "credit_wallets_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "credit_wallets_userId_key" ON "credit_wallets"("userId");
|
|
|
|
ALTER TABLE "credit_wallets"
|
|
ADD CONSTRAINT "credit_wallets_userId_fkey"
|
|
FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
CREATE TABLE "credit_transactions" (
|
|
"id" TEXT NOT NULL,
|
|
"walletId" TEXT NOT NULL,
|
|
"amount" INTEGER NOT NULL,
|
|
"type" "CreditTransactionType" NOT NULL,
|
|
"referenceType" TEXT,
|
|
"referenceId" TEXT,
|
|
"idempotencyKey" TEXT NOT NULL,
|
|
"metadata" JSONB,
|
|
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "credit_transactions_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "credit_transactions_idempotencyKey_key" ON "credit_transactions"("idempotencyKey");
|
|
CREATE INDEX "credit_transactions_walletId_createdAt_idx" ON "credit_transactions"("walletId", "createdAt");
|
|
|
|
ALTER TABLE "credit_transactions"
|
|
ADD CONSTRAINT "credit_transactions_walletId_fkey"
|
|
FOREIGN KEY ("walletId") REFERENCES "credit_wallets"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
CREATE TABLE "usage_records" (
|
|
"id" TEXT NOT NULL,
|
|
"serverId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"ramMb" INTEGER NOT NULL,
|
|
"durationSeconds" INTEGER NOT NULL,
|
|
"creditsCharged" INTEGER NOT NULL,
|
|
"periodStart" TIMESTAMPTZ(3) NOT NULL,
|
|
"periodEnd" TIMESTAMPTZ(3) NOT NULL,
|
|
"idempotencyKey" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMPTZ(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "usage_records_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
CREATE UNIQUE INDEX "usage_records_idempotencyKey_key" ON "usage_records"("idempotencyKey");
|
|
CREATE INDEX "usage_records_serverId_periodStart_idx" ON "usage_records"("serverId", "periodStart");
|
|
CREATE INDEX "usage_records_userId_periodStart_idx" ON "usage_records"("userId", "periodStart");
|
|
|
|
ALTER TABLE "usage_records"
|
|
ADD CONSTRAINT "usage_records_serverId_fkey"
|
|
FOREIGN KEY ("serverId") REFERENCES "game_servers"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|