8a91a298a7
Define Prisma schema (Player, City, Good, InventoryItem, Transaction, Mission, WorldEvent), initial migration SQL, and seed script to populate cities and goods with base game data. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
179 lines
5.9 KiB
SQL
179 lines
5.9 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "MissionStatus" AS ENUM ('STARTED', 'COMPLETED', 'FAILED');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "MissionType" AS ENUM ('DELIVERY', 'THEFT', 'SMUGGLING', 'INTEL');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "EventType" AS ENUM ('MARKET_BOOM', 'POLICE_RAID', 'SHORTAGE', 'BLACKOUT');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "User" (
|
|
"id" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"passwordHash" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Player" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"displayName" TEXT NOT NULL,
|
|
"money" INTEGER NOT NULL DEFAULT 1000,
|
|
"reputation" INTEGER NOT NULL DEFAULT 0,
|
|
"level" INTEGER NOT NULL DEFAULT 1,
|
|
"experience" INTEGER NOT NULL DEFAULT 0,
|
|
"currentCityId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Player_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "City" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"riskLevel" INTEGER NOT NULL,
|
|
"policePressure" DOUBLE PRECISION NOT NULL DEFAULT 1.0,
|
|
"economyModifier" DOUBLE PRECISION NOT NULL DEFAULT 1.0,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "City_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Item" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"basePrice" INTEGER NOT NULL,
|
|
"rarity" INTEGER NOT NULL,
|
|
"illegalLevel" INTEGER NOT NULL,
|
|
"weight" INTEGER NOT NULL DEFAULT 1,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Item_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "InventoryItem" (
|
|
"playerId" TEXT NOT NULL,
|
|
"itemId" TEXT NOT NULL,
|
|
"quantity" INTEGER NOT NULL,
|
|
|
|
CONSTRAINT "InventoryItem_pkey" PRIMARY KEY ("playerId","itemId")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "MarketPrice" (
|
|
"cityId" TEXT NOT NULL,
|
|
"itemId" TEXT NOT NULL,
|
|
"buyPrice" INTEGER NOT NULL,
|
|
"sellPrice" INTEGER NOT NULL,
|
|
"demand" DOUBLE PRECISION NOT NULL DEFAULT 1.0,
|
|
"supply" DOUBLE PRECISION NOT NULL DEFAULT 1.0,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "MarketPrice_pkey" PRIMARY KEY ("cityId","itemId")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Mission" (
|
|
"id" TEXT NOT NULL,
|
|
"cityId" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"type" "MissionType" NOT NULL,
|
|
"difficulty" INTEGER NOT NULL,
|
|
"durationSeconds" INTEGER NOT NULL,
|
|
"rewardMoney" INTEGER NOT NULL,
|
|
"rewardXp" INTEGER NOT NULL,
|
|
"risk" DOUBLE PRECISION NOT NULL,
|
|
"requiredItemId" TEXT,
|
|
"requiredItemQuantity" INTEGER,
|
|
"expiresAt" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Mission_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "PlayerMission" (
|
|
"id" TEXT NOT NULL,
|
|
"playerId" TEXT NOT NULL,
|
|
"missionId" TEXT NOT NULL,
|
|
"status" "MissionStatus" NOT NULL DEFAULT 'STARTED',
|
|
"startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"completesAt" TIMESTAMP(3) NOT NULL,
|
|
"resolvedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "PlayerMission_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "WorldEvent" (
|
|
"id" TEXT NOT NULL,
|
|
"title" TEXT NOT NULL,
|
|
"description" TEXT NOT NULL,
|
|
"type" "EventType" NOT NULL,
|
|
"cityId" TEXT,
|
|
"priceModifier" DOUBLE PRECISION NOT NULL DEFAULT 1.0,
|
|
"policeModifier" DOUBLE PRECISION NOT NULL DEFAULT 1.0,
|
|
"startsAt" TIMESTAMP(3) NOT NULL,
|
|
"endsAt" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "WorldEvent_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Player_userId_key" ON "Player"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Player_displayName_key" ON "Player"("displayName");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "City_name_key" ON "City"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Item_name_key" ON "Item"("name");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Player" ADD CONSTRAINT "Player_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Player" ADD CONSTRAINT "Player_currentCityId_fkey" FOREIGN KEY ("currentCityId") REFERENCES "City"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "InventoryItem" ADD CONSTRAINT "InventoryItem_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "InventoryItem" ADD CONSTRAINT "InventoryItem_itemId_fkey" FOREIGN KEY ("itemId") REFERENCES "Item"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "MarketPrice" ADD CONSTRAINT "MarketPrice_cityId_fkey" FOREIGN KEY ("cityId") REFERENCES "City"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "MarketPrice" ADD CONSTRAINT "MarketPrice_itemId_fkey" FOREIGN KEY ("itemId") REFERENCES "Item"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Mission" ADD CONSTRAINT "Mission_cityId_fkey" FOREIGN KEY ("cityId") REFERENCES "City"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Mission" ADD CONSTRAINT "Mission_requiredItemId_fkey" FOREIGN KEY ("requiredItemId") REFERENCES "Item"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "PlayerMission" ADD CONSTRAINT "PlayerMission_playerId_fkey" FOREIGN KEY ("playerId") REFERENCES "Player"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "PlayerMission" ADD CONSTRAINT "PlayerMission_missionId_fkey" FOREIGN KEY ("missionId") REFERENCES "Mission"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "WorldEvent" ADD CONSTRAINT "WorldEvent_cityId_fkey" FOREIGN KEY ("cityId") REFERENCES "City"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|