From aa1e667a72350040710937f0247dba63b822b475 Mon Sep 17 00:00:00 2001 From: shni Date: Sun, 5 Oct 2025 00:04:08 -0500 Subject: [PATCH] feat(database): add economy-related tables and relationships; implement wallet, shop, and item management structures --- .idea/compiler.xml | 6 + .../20251005045617_economy/migration.sql | 168 ++++++++++++++++++ .../migration.sql | 51 ++++++ 3 files changed, 225 insertions(+) create mode 100644 .idea/compiler.xml create mode 100644 prisma/migrations/20251005045617_economy/migration.sql create mode 100644 prisma/migrations/20251005050013_economy_wallet_shop/migration.sql diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..8ca546d --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/prisma/migrations/20251005045617_economy/migration.sql b/prisma/migrations/20251005045617_economy/migration.sql new file mode 100644 index 0000000..066b691 --- /dev/null +++ b/prisma/migrations/20251005045617_economy/migration.sql @@ -0,0 +1,168 @@ +-- CreateTable +CREATE TABLE "public"."EconomyItem" ( + "id" TEXT NOT NULL, + "key" TEXT NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + "category" TEXT, + "icon" TEXT, + "stackable" BOOLEAN NOT NULL DEFAULT true, + "maxPerInventory" INTEGER, + "guildId" TEXT, + "availableFrom" TIMESTAMP(3), + "availableTo" TIMESTAMP(3), + "usableFrom" TIMESTAMP(3), + "usableTo" TIMESTAMP(3), + "tags" TEXT[], + "props" JSONB, + "metadata" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "EconomyItem_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."InventoryEntry" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "guildId" TEXT NOT NULL, + "itemId" TEXT NOT NULL, + "quantity" INTEGER NOT NULL DEFAULT 0, + "state" JSONB, + "acquiredAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "InventoryEntry_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."ItemRecipe" ( + "id" TEXT NOT NULL, + "productItemId" TEXT NOT NULL, + "productQuantity" INTEGER NOT NULL DEFAULT 1, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ItemRecipe_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."RecipeIngredient" ( + "id" TEXT NOT NULL, + "recipeId" TEXT NOT NULL, + "itemId" TEXT NOT NULL, + "quantity" INTEGER NOT NULL, + + CONSTRAINT "RecipeIngredient_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."ShopOffer" ( + "id" TEXT NOT NULL, + "guildId" TEXT NOT NULL, + "itemId" TEXT NOT NULL, + "enabled" BOOLEAN NOT NULL DEFAULT true, + "price" JSONB NOT NULL, + "startAt" TIMESTAMP(3), + "endAt" TIMESTAMP(3), + "perUserLimit" INTEGER, + "stock" INTEGER, + "metadata" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ShopOffer_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."ItemMutation" ( + "id" TEXT NOT NULL, + "key" TEXT NOT NULL, + "name" TEXT NOT NULL, + "description" TEXT, + "effects" JSONB NOT NULL, + "metadata" JSONB, + "guildId" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "ItemMutation_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."InventoryItemMutation" ( + "id" TEXT NOT NULL, + "inventoryId" TEXT NOT NULL, + "mutationId" TEXT NOT NULL, + "appliedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "data" JSONB, + + CONSTRAINT "InventoryItemMutation_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "EconomyItem_guildId_idx" ON "public"."EconomyItem"("guildId"); + +-- CreateIndex +CREATE UNIQUE INDEX "EconomyItem_guildId_key_key" ON "public"."EconomyItem"("guildId", "key"); + +-- CreateIndex +CREATE INDEX "InventoryEntry_userId_guildId_idx" ON "public"."InventoryEntry"("userId", "guildId"); + +-- CreateIndex +CREATE UNIQUE INDEX "InventoryEntry_userId_guildId_itemId_key" ON "public"."InventoryEntry"("userId", "guildId", "itemId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ItemRecipe_productItemId_key" ON "public"."ItemRecipe"("productItemId"); + +-- CreateIndex +CREATE UNIQUE INDEX "RecipeIngredient_recipeId_itemId_key" ON "public"."RecipeIngredient"("recipeId", "itemId"); + +-- CreateIndex +CREATE INDEX "ShopOffer_guildId_idx" ON "public"."ShopOffer"("guildId"); + +-- CreateIndex +CREATE UNIQUE INDEX "ShopOffer_guildId_itemId_startAt_endAt_key" ON "public"."ShopOffer"("guildId", "itemId", "startAt", "endAt"); + +-- CreateIndex +CREATE UNIQUE INDEX "ItemMutation_guildId_key_key" ON "public"."ItemMutation"("guildId", "key"); + +-- CreateIndex +CREATE INDEX "InventoryItemMutation_inventoryId_idx" ON "public"."InventoryItemMutation"("inventoryId"); + +-- AddForeignKey +ALTER TABLE "public"."EconomyItem" ADD CONSTRAINT "EconomyItem_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."InventoryEntry" ADD CONSTRAINT "InventoryEntry_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."InventoryEntry" ADD CONSTRAINT "InventoryEntry_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."InventoryEntry" ADD CONSTRAINT "InventoryEntry_itemId_fkey" FOREIGN KEY ("itemId") REFERENCES "public"."EconomyItem"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ItemRecipe" ADD CONSTRAINT "ItemRecipe_productItemId_fkey" FOREIGN KEY ("productItemId") REFERENCES "public"."EconomyItem"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."RecipeIngredient" ADD CONSTRAINT "RecipeIngredient_recipeId_fkey" FOREIGN KEY ("recipeId") REFERENCES "public"."ItemRecipe"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."RecipeIngredient" ADD CONSTRAINT "RecipeIngredient_itemId_fkey" FOREIGN KEY ("itemId") REFERENCES "public"."EconomyItem"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ShopOffer" ADD CONSTRAINT "ShopOffer_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ShopOffer" ADD CONSTRAINT "ShopOffer_itemId_fkey" FOREIGN KEY ("itemId") REFERENCES "public"."EconomyItem"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ItemMutation" ADD CONSTRAINT "ItemMutation_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."InventoryItemMutation" ADD CONSTRAINT "InventoryItemMutation_inventoryId_fkey" FOREIGN KEY ("inventoryId") REFERENCES "public"."InventoryEntry"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."InventoryItemMutation" ADD CONSTRAINT "InventoryItemMutation_mutationId_fkey" FOREIGN KEY ("mutationId") REFERENCES "public"."ItemMutation"("id") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/prisma/migrations/20251005050013_economy_wallet_shop/migration.sql b/prisma/migrations/20251005050013_economy_wallet_shop/migration.sql new file mode 100644 index 0000000..f961fc1 --- /dev/null +++ b/prisma/migrations/20251005050013_economy_wallet_shop/migration.sql @@ -0,0 +1,51 @@ +-- CreateTable +CREATE TABLE "public"."EconomyWallet" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "guildId" TEXT NOT NULL, + "coins" INTEGER NOT NULL DEFAULT 0, + "metadata" JSONB, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "EconomyWallet_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "public"."ShopPurchase" ( + "id" TEXT NOT NULL, + "offerId" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "guildId" TEXT NOT NULL, + "qty" INTEGER NOT NULL DEFAULT 1, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "ShopPurchase_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE INDEX "EconomyWallet_guildId_idx" ON "public"."EconomyWallet"("guildId"); + +-- CreateIndex +CREATE UNIQUE INDEX "EconomyWallet_userId_guildId_key" ON "public"."EconomyWallet"("userId", "guildId"); + +-- CreateIndex +CREATE INDEX "ShopPurchase_offerId_idx" ON "public"."ShopPurchase"("offerId"); + +-- CreateIndex +CREATE INDEX "ShopPurchase_userId_guildId_idx" ON "public"."ShopPurchase"("userId", "guildId"); + +-- AddForeignKey +ALTER TABLE "public"."EconomyWallet" ADD CONSTRAINT "EconomyWallet_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."EconomyWallet" ADD CONSTRAINT "EconomyWallet_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ShopPurchase" ADD CONSTRAINT "ShopPurchase_offerId_fkey" FOREIGN KEY ("offerId") REFERENCES "public"."ShopOffer"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ShopPurchase" ADD CONSTRAINT "ShopPurchase_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "public"."ShopPurchase" ADD CONSTRAINT "ShopPurchase_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;