v3.13.0-dev.1

This commit is contained in:
Shnimlz
2025-11-24 16:16:01 -06:00
parent 5d1b2b2f53
commit a5fbc573d0
503 changed files with 111351 additions and 104656 deletions

View File

@@ -0,0 +1,144 @@
-- CreateTable
CREATE TABLE "public"."Guild" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"prefix" TEXT NOT NULL DEFAULT '!',
"staff" JSONB,
"aiRolePrompt" TEXT,
CONSTRAINT "Guild_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."User" (
"id" TEXT NOT NULL,
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."PartnershipStats" (
"totalPoints" INTEGER NOT NULL DEFAULT 0,
"weeklyPoints" INTEGER NOT NULL DEFAULT 0,
"monthlyPoints" INTEGER NOT NULL DEFAULT 0,
"lastWeeklyReset" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"lastMonthlyReset" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
CONSTRAINT "PartnershipStats_pkey" PRIMARY KEY ("userId","guildId")
);
-- CreateTable
CREATE TABLE "public"."Alliance" (
"id" TEXT NOT NULL,
"channelId" TEXT NOT NULL,
"messageId" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"guildId" TEXT NOT NULL,
"creatorId" TEXT NOT NULL,
CONSTRAINT "Alliance_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."AllianceChannel" (
"id" TEXT NOT NULL,
"channelId" TEXT NOT NULL,
"blockConfigName" TEXT NOT NULL,
"isActive" BOOLEAN NOT NULL DEFAULT true,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
"guildId" TEXT NOT NULL,
CONSTRAINT "AllianceChannel_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."PointHistory" (
"id" TEXT NOT NULL,
"points" INTEGER NOT NULL DEFAULT 1,
"timestamp" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"messageId" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"channelId" TEXT NOT NULL,
CONSTRAINT "PointHistory_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."EmbedConfig" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"color" TEXT,
"title" TEXT,
"url" TEXT,
"authorName" TEXT,
"authorIconURL" TEXT,
"authorURL" TEXT,
"description" TEXT,
"thumbnailURL" TEXT,
"imageURL" TEXT,
"footerText" TEXT,
"footerIconURL" TEXT,
"fields" TEXT DEFAULT '[]',
"guildId" TEXT NOT NULL,
CONSTRAINT "EmbedConfig_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."BlockV2Config" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"config" JSONB NOT NULL,
"guildId" TEXT NOT NULL,
CONSTRAINT "BlockV2Config_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE UNIQUE INDEX "Alliance_messageId_key" ON "public"."Alliance"("messageId");
-- CreateIndex
CREATE UNIQUE INDEX "AllianceChannel_channelId_key" ON "public"."AllianceChannel"("channelId");
-- CreateIndex
CREATE UNIQUE INDEX "AllianceChannel_guildId_channelId_key" ON "public"."AllianceChannel"("guildId", "channelId");
-- CreateIndex
CREATE UNIQUE INDEX "EmbedConfig_guildId_name_key" ON "public"."EmbedConfig"("guildId", "name");
-- CreateIndex
CREATE UNIQUE INDEX "BlockV2Config_guildId_name_key" ON "public"."BlockV2Config"("guildId", "name");
-- AddForeignKey
ALTER TABLE "public"."PartnershipStats" ADD CONSTRAINT "PartnershipStats_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PartnershipStats" ADD CONSTRAINT "PartnershipStats_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."Alliance" ADD CONSTRAINT "Alliance_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."Alliance" ADD CONSTRAINT "Alliance_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."AllianceChannel" ADD CONSTRAINT "AllianceChannel_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PointHistory" ADD CONSTRAINT "PointHistory_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PointHistory" ADD CONSTRAINT "PointHistory_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PointHistory" ADD CONSTRAINT "PointHistory_channelId_fkey" FOREIGN KEY ("channelId") REFERENCES "public"."AllianceChannel"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."EmbedConfig" ADD CONSTRAINT "EmbedConfig_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."BlockV2Config" ADD CONSTRAINT "BlockV2Config_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;

View File

@@ -0,0 +1,857 @@
-- 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")
);
-- 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")
);
-- CreateTable
CREATE TABLE "public"."GameArea" (
"id" TEXT NOT NULL,
"key" TEXT NOT NULL,
"name" TEXT NOT NULL,
"type" TEXT NOT NULL,
"guildId" TEXT,
"config" JSONB,
"metadata" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "GameArea_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."GameAreaLevel" (
"id" TEXT NOT NULL,
"areaId" TEXT NOT NULL,
"level" INTEGER NOT NULL,
"requirements" JSONB,
"rewards" JSONB,
"mobs" JSONB,
"metadata" JSONB,
"availableFrom" TIMESTAMP(3),
"availableTo" TIMESTAMP(3),
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "GameAreaLevel_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."Mob" (
"id" TEXT NOT NULL,
"key" TEXT NOT NULL,
"name" TEXT NOT NULL,
"category" TEXT,
"guildId" TEXT,
"stats" JSONB,
"drops" JSONB,
"metadata" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Mob_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."MinigameRun" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"areaId" TEXT NOT NULL,
"level" INTEGER NOT NULL,
"toolItemId" TEXT,
"success" BOOLEAN NOT NULL,
"result" JSONB NOT NULL,
"startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"finishedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "MinigameRun_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."PlayerProgress" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"areaId" TEXT NOT NULL,
"highestLevel" INTEGER NOT NULL DEFAULT 1,
"metadata" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "PlayerProgress_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."PlayerState" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"hp" INTEGER NOT NULL DEFAULT 100,
"maxHp" INTEGER NOT NULL DEFAULT 100,
"stats" JSONB,
"metadata" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "PlayerState_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."PlayerEquipment" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"weaponItemId" TEXT,
"armorItemId" TEXT,
"capeItemId" TEXT,
"accessories" JSONB,
"metadata" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "PlayerEquipment_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."ActionCooldown" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"key" TEXT NOT NULL,
"until" TIMESTAMP(3) NOT NULL,
"metadata" JSONB,
CONSTRAINT "ActionCooldown_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."SmeltJob" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"inputs" JSONB NOT NULL,
"outputItemId" TEXT NOT NULL,
"outputQty" INTEGER NOT NULL DEFAULT 1,
"startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"readyAt" TIMESTAMP(3) NOT NULL,
"status" TEXT NOT NULL DEFAULT 'pending',
"metadata" JSONB,
CONSTRAINT "SmeltJob_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."ScheduledMobAttack" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"mobId" TEXT NOT NULL,
"scheduleAt" TIMESTAMP(3) NOT NULL,
"processedAt" TIMESTAMP(3),
"status" TEXT NOT NULL DEFAULT 'scheduled',
"metadata" JSONB,
CONSTRAINT "ScheduledMobAttack_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."Achievement" (
"id" TEXT NOT NULL,
"key" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT NOT NULL,
"icon" TEXT,
"category" TEXT NOT NULL,
"requirements" JSONB NOT NULL,
"rewards" JSONB,
"guildId" TEXT,
"hidden" BOOLEAN NOT NULL DEFAULT false,
"points" INTEGER NOT NULL DEFAULT 10,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Achievement_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."PlayerAchievement" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"achievementId" TEXT NOT NULL,
"progress" INTEGER NOT NULL DEFAULT 0,
"unlockedAt" TIMESTAMP(3),
"notified" BOOLEAN NOT NULL DEFAULT false,
"metadata" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "PlayerAchievement_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."Quest" (
"id" TEXT NOT NULL,
"key" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT NOT NULL,
"icon" TEXT,
"type" TEXT NOT NULL,
"category" TEXT NOT NULL,
"requirements" JSONB NOT NULL,
"rewards" JSONB NOT NULL,
"startAt" TIMESTAMP(3),
"endAt" TIMESTAMP(3),
"guildId" TEXT,
"active" BOOLEAN NOT NULL DEFAULT true,
"repeatable" BOOLEAN NOT NULL DEFAULT false,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "Quest_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."QuestProgress" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"questId" TEXT NOT NULL,
"progress" INTEGER NOT NULL DEFAULT 0,
"completed" BOOLEAN NOT NULL DEFAULT false,
"claimed" BOOLEAN NOT NULL DEFAULT false,
"completedAt" TIMESTAMP(3),
"claimedAt" TIMESTAMP(3),
"expiresAt" TIMESTAMP(3),
"metadata" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "QuestProgress_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."PlayerStats" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"minesCompleted" INTEGER NOT NULL DEFAULT 0,
"fishingCompleted" INTEGER NOT NULL DEFAULT 0,
"fightsCompleted" INTEGER NOT NULL DEFAULT 0,
"farmsCompleted" INTEGER NOT NULL DEFAULT 0,
"mobsDefeated" INTEGER NOT NULL DEFAULT 0,
"damageDealt" INTEGER NOT NULL DEFAULT 0,
"damageTaken" INTEGER NOT NULL DEFAULT 0,
"timesDefeated" INTEGER NOT NULL DEFAULT 0,
"totalCoinsEarned" INTEGER NOT NULL DEFAULT 0,
"totalCoinsSpent" INTEGER NOT NULL DEFAULT 0,
"itemsCrafted" INTEGER NOT NULL DEFAULT 0,
"itemsSmelted" INTEGER NOT NULL DEFAULT 0,
"itemsPurchased" INTEGER NOT NULL DEFAULT 0,
"chestsOpened" INTEGER NOT NULL DEFAULT 0,
"itemsConsumed" INTEGER NOT NULL DEFAULT 0,
"itemsEquipped" INTEGER NOT NULL DEFAULT 0,
"highestDamageDealt" INTEGER NOT NULL DEFAULT 0,
"longestWinStreak" INTEGER NOT NULL DEFAULT 0,
"currentWinStreak" INTEGER NOT NULL DEFAULT 0,
"mostCoinsAtOnce" INTEGER NOT NULL DEFAULT 0,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "PlayerStats_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."PlayerStatusEffect" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"type" TEXT NOT NULL,
"magnitude" DOUBLE PRECISION NOT NULL DEFAULT 0,
"expiresAt" TIMESTAMP(3),
"data" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "PlayerStatusEffect_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."PlayerStreak" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"currentStreak" INTEGER NOT NULL DEFAULT 0,
"longestStreak" INTEGER NOT NULL DEFAULT 0,
"lastActiveDate" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"totalDaysActive" INTEGER NOT NULL DEFAULT 0,
"rewardsClaimed" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "PlayerStreak_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."AuditLog" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"action" TEXT NOT NULL,
"target" TEXT,
"details" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "AuditLog_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."DeathLog" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"areaId" TEXT,
"areaKey" TEXT,
"level" INTEGER,
"goldLost" INTEGER NOT NULL DEFAULT 0,
"percentApplied" DOUBLE PRECISION NOT NULL DEFAULT 0,
"autoDefeatNoWeapon" BOOLEAN NOT NULL DEFAULT false,
"fatigueMagnitude" DOUBLE PRECISION,
"fatigueMinutes" INTEGER,
"metadata" JSONB,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "DeathLog_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."FeatureFlag" (
"id" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"status" TEXT NOT NULL DEFAULT 'disabled',
"target" TEXT NOT NULL DEFAULT 'global',
"rolloutStrategy" TEXT,
"rolloutConfig" TEXT,
"startDate" TIMESTAMP(3),
"endDate" TIMESTAMP(3),
"metadata" TEXT,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "FeatureFlag_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."ListeningHistory" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"trackId" TEXT NOT NULL,
"title" TEXT NOT NULL,
"author" TEXT NOT NULL,
"duration" INTEGER NOT NULL,
"source" TEXT NOT NULL DEFAULT 'youtube',
"playedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"completedAt" TIMESTAMP(3),
"listenedMs" INTEGER NOT NULL DEFAULT 0,
"score" INTEGER NOT NULL DEFAULT 0,
"skipped" BOOLEAN NOT NULL DEFAULT false,
"skipReason" TEXT,
CONSTRAINT "ListeningHistory_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."UserMusicPreferences" (
"userId" TEXT NOT NULL,
"favoriteArtists" JSONB NOT NULL DEFAULT '[]',
"skipPatterns" JSONB NOT NULL DEFAULT '{}',
"recentTrends" JSONB NOT NULL DEFAULT '[]',
"autoplayEnabled" BOOLEAN NOT NULL DEFAULT true,
"totalPlays" INTEGER NOT NULL DEFAULT 0,
"totalSkips" INTEGER NOT NULL DEFAULT 0,
"lastUpdated" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "UserMusicPreferences_pkey" PRIMARY KEY ("userId")
);
-- 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");
-- 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");
-- CreateIndex
CREATE INDEX "GameArea_guildId_idx" ON "public"."GameArea"("guildId");
-- CreateIndex
CREATE UNIQUE INDEX "GameArea_guildId_key_key" ON "public"."GameArea"("guildId", "key");
-- CreateIndex
CREATE UNIQUE INDEX "GameAreaLevel_areaId_level_key" ON "public"."GameAreaLevel"("areaId", "level");
-- CreateIndex
CREATE INDEX "Mob_guildId_idx" ON "public"."Mob"("guildId");
-- CreateIndex
CREATE UNIQUE INDEX "Mob_guildId_key_key" ON "public"."Mob"("guildId", "key");
-- CreateIndex
CREATE INDEX "MinigameRun_userId_guildId_idx" ON "public"."MinigameRun"("userId", "guildId");
-- CreateIndex
CREATE INDEX "MinigameRun_areaId_idx" ON "public"."MinigameRun"("areaId");
-- CreateIndex
CREATE INDEX "MinigameRun_startedAt_idx" ON "public"."MinigameRun"("startedAt");
-- CreateIndex
CREATE INDEX "PlayerProgress_userId_guildId_idx" ON "public"."PlayerProgress"("userId", "guildId");
-- CreateIndex
CREATE UNIQUE INDEX "PlayerProgress_userId_guildId_areaId_key" ON "public"."PlayerProgress"("userId", "guildId", "areaId");
-- CreateIndex
CREATE UNIQUE INDEX "PlayerState_userId_guildId_key" ON "public"."PlayerState"("userId", "guildId");
-- CreateIndex
CREATE UNIQUE INDEX "PlayerEquipment_userId_guildId_key" ON "public"."PlayerEquipment"("userId", "guildId");
-- CreateIndex
CREATE INDEX "ActionCooldown_until_idx" ON "public"."ActionCooldown"("until");
-- CreateIndex
CREATE UNIQUE INDEX "ActionCooldown_userId_guildId_key_key" ON "public"."ActionCooldown"("userId", "guildId", "key");
-- CreateIndex
CREATE INDEX "SmeltJob_userId_guildId_idx" ON "public"."SmeltJob"("userId", "guildId");
-- CreateIndex
CREATE INDEX "SmeltJob_readyAt_idx" ON "public"."SmeltJob"("readyAt");
-- CreateIndex
CREATE INDEX "ScheduledMobAttack_scheduleAt_idx" ON "public"."ScheduledMobAttack"("scheduleAt");
-- CreateIndex
CREATE INDEX "ScheduledMobAttack_userId_guildId_idx" ON "public"."ScheduledMobAttack"("userId", "guildId");
-- CreateIndex
CREATE INDEX "Achievement_guildId_idx" ON "public"."Achievement"("guildId");
-- CreateIndex
CREATE UNIQUE INDEX "Achievement_guildId_key_key" ON "public"."Achievement"("guildId", "key");
-- CreateIndex
CREATE INDEX "PlayerAchievement_userId_guildId_idx" ON "public"."PlayerAchievement"("userId", "guildId");
-- CreateIndex
CREATE UNIQUE INDEX "PlayerAchievement_userId_guildId_achievementId_key" ON "public"."PlayerAchievement"("userId", "guildId", "achievementId");
-- CreateIndex
CREATE INDEX "Quest_guildId_idx" ON "public"."Quest"("guildId");
-- CreateIndex
CREATE INDEX "Quest_type_idx" ON "public"."Quest"("type");
-- CreateIndex
CREATE UNIQUE INDEX "Quest_guildId_key_key" ON "public"."Quest"("guildId", "key");
-- CreateIndex
CREATE INDEX "QuestProgress_userId_guildId_idx" ON "public"."QuestProgress"("userId", "guildId");
-- CreateIndex
CREATE INDEX "QuestProgress_questId_idx" ON "public"."QuestProgress"("questId");
-- CreateIndex
CREATE UNIQUE INDEX "QuestProgress_userId_guildId_questId_expiresAt_key" ON "public"."QuestProgress"("userId", "guildId", "questId", "expiresAt");
-- CreateIndex
CREATE INDEX "PlayerStats_userId_guildId_idx" ON "public"."PlayerStats"("userId", "guildId");
-- CreateIndex
CREATE UNIQUE INDEX "PlayerStats_userId_guildId_key" ON "public"."PlayerStats"("userId", "guildId");
-- CreateIndex
CREATE INDEX "PlayerStatusEffect_userId_guildId_idx" ON "public"."PlayerStatusEffect"("userId", "guildId");
-- CreateIndex
CREATE INDEX "PlayerStatusEffect_guildId_idx" ON "public"."PlayerStatusEffect"("guildId");
-- CreateIndex
CREATE INDEX "PlayerStatusEffect_expiresAt_idx" ON "public"."PlayerStatusEffect"("expiresAt");
-- CreateIndex
CREATE UNIQUE INDEX "PlayerStatusEffect_userId_guildId_type_key" ON "public"."PlayerStatusEffect"("userId", "guildId", "type");
-- CreateIndex
CREATE INDEX "PlayerStreak_userId_guildId_idx" ON "public"."PlayerStreak"("userId", "guildId");
-- CreateIndex
CREATE UNIQUE INDEX "PlayerStreak_userId_guildId_key" ON "public"."PlayerStreak"("userId", "guildId");
-- CreateIndex
CREATE INDEX "AuditLog_userId_guildId_idx" ON "public"."AuditLog"("userId", "guildId");
-- CreateIndex
CREATE INDEX "AuditLog_action_idx" ON "public"."AuditLog"("action");
-- CreateIndex
CREATE INDEX "AuditLog_createdAt_idx" ON "public"."AuditLog"("createdAt");
-- CreateIndex
CREATE INDEX "DeathLog_userId_guildId_idx" ON "public"."DeathLog"("userId", "guildId");
-- CreateIndex
CREATE INDEX "DeathLog_createdAt_idx" ON "public"."DeathLog"("createdAt");
-- CreateIndex
CREATE UNIQUE INDEX "FeatureFlag_name_key" ON "public"."FeatureFlag"("name");
-- CreateIndex
CREATE INDEX "FeatureFlag_status_idx" ON "public"."FeatureFlag"("status");
-- CreateIndex
CREATE INDEX "FeatureFlag_target_idx" ON "public"."FeatureFlag"("target");
-- CreateIndex
CREATE INDEX "ListeningHistory_userId_playedAt_idx" ON "public"."ListeningHistory"("userId", "playedAt");
-- CreateIndex
CREATE INDEX "ListeningHistory_guildId_playedAt_idx" ON "public"."ListeningHistory"("guildId", "playedAt");
-- CreateIndex
CREATE INDEX "ListeningHistory_userId_score_idx" ON "public"."ListeningHistory"("userId", "score");
-- CreateIndex
CREATE INDEX "UserMusicPreferences_lastUpdated_idx" ON "public"."UserMusicPreferences"("lastUpdated");
-- 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;
-- 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;
-- AddForeignKey
ALTER TABLE "public"."GameArea" ADD CONSTRAINT "GameArea_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."GameAreaLevel" ADD CONSTRAINT "GameAreaLevel_areaId_fkey" FOREIGN KEY ("areaId") REFERENCES "public"."GameArea"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."Mob" ADD CONSTRAINT "Mob_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."MinigameRun" ADD CONSTRAINT "MinigameRun_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."MinigameRun" ADD CONSTRAINT "MinigameRun_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."MinigameRun" ADD CONSTRAINT "MinigameRun_areaId_fkey" FOREIGN KEY ("areaId") REFERENCES "public"."GameArea"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerProgress" ADD CONSTRAINT "PlayerProgress_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerProgress" ADD CONSTRAINT "PlayerProgress_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerProgress" ADD CONSTRAINT "PlayerProgress_areaId_fkey" FOREIGN KEY ("areaId") REFERENCES "public"."GameArea"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerState" ADD CONSTRAINT "PlayerState_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerState" ADD CONSTRAINT "PlayerState_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerEquipment" ADD CONSTRAINT "PlayerEquipment_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerEquipment" ADD CONSTRAINT "PlayerEquipment_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."ActionCooldown" ADD CONSTRAINT "ActionCooldown_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."ActionCooldown" ADD CONSTRAINT "ActionCooldown_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."SmeltJob" ADD CONSTRAINT "SmeltJob_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."SmeltJob" ADD CONSTRAINT "SmeltJob_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."SmeltJob" ADD CONSTRAINT "SmeltJob_outputItemId_fkey" FOREIGN KEY ("outputItemId") REFERENCES "public"."EconomyItem"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."ScheduledMobAttack" ADD CONSTRAINT "ScheduledMobAttack_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."ScheduledMobAttack" ADD CONSTRAINT "ScheduledMobAttack_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."ScheduledMobAttack" ADD CONSTRAINT "ScheduledMobAttack_mobId_fkey" FOREIGN KEY ("mobId") REFERENCES "public"."Mob"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."Achievement" ADD CONSTRAINT "Achievement_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerAchievement" ADD CONSTRAINT "PlayerAchievement_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerAchievement" ADD CONSTRAINT "PlayerAchievement_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerAchievement" ADD CONSTRAINT "PlayerAchievement_achievementId_fkey" FOREIGN KEY ("achievementId") REFERENCES "public"."Achievement"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."Quest" ADD CONSTRAINT "Quest_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."QuestProgress" ADD CONSTRAINT "QuestProgress_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."QuestProgress" ADD CONSTRAINT "QuestProgress_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."QuestProgress" ADD CONSTRAINT "QuestProgress_questId_fkey" FOREIGN KEY ("questId") REFERENCES "public"."Quest"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerStats" ADD CONSTRAINT "PlayerStats_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerStats" ADD CONSTRAINT "PlayerStats_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerStatusEffect" ADD CONSTRAINT "PlayerStatusEffect_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerStatusEffect" ADD CONSTRAINT "PlayerStatusEffect_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerStreak" ADD CONSTRAINT "PlayerStreak_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."PlayerStreak" ADD CONSTRAINT "PlayerStreak_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."AuditLog" ADD CONSTRAINT "AuditLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."AuditLog" ADD CONSTRAINT "AuditLog_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."DeathLog" ADD CONSTRAINT "DeathLog_userId_fkey" FOREIGN KEY ("userId") REFERENCES "public"."User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."DeathLog" ADD CONSTRAINT "DeathLog_guildId_fkey" FOREIGN KEY ("guildId") REFERENCES "public"."Guild"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "public"."DeathLog" ADD CONSTRAINT "DeathLog_areaId_fkey" FOREIGN KEY ("areaId") REFERENCES "public"."GameArea"("id") ON DELETE SET NULL ON UPDATE CASCADE;

View File

@@ -0,0 +1,69 @@
-- CreateTable
CREATE TABLE "public"."MusicPlaylist" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"name" TEXT NOT NULL,
"description" TEXT,
"isDefault" BOOLEAN NOT NULL DEFAULT false,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
"updatedAt" TIMESTAMP(3) NOT NULL,
CONSTRAINT "MusicPlaylist_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."PlaylistTrack" (
"id" TEXT NOT NULL,
"playlistId" TEXT NOT NULL,
"trackId" TEXT NOT NULL,
"title" TEXT NOT NULL,
"author" TEXT NOT NULL,
"duration" INTEGER NOT NULL,
"thumbnail" TEXT,
"url" TEXT,
"addedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "PlaylistTrack_pkey" PRIMARY KEY ("id")
);
-- CreateTable
CREATE TABLE "public"."TrackLike" (
"id" TEXT NOT NULL,
"userId" TEXT NOT NULL,
"guildId" TEXT NOT NULL,
"trackId" TEXT NOT NULL,
"title" TEXT NOT NULL,
"author" TEXT NOT NULL,
"thumbnail" TEXT,
"likedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "TrackLike_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "MusicPlaylist_userId_guildId_idx" ON "public"."MusicPlaylist"("userId", "guildId");
-- CreateIndex
CREATE INDEX "MusicPlaylist_userId_isDefault_idx" ON "public"."MusicPlaylist"("userId", "isDefault");
-- CreateIndex
CREATE UNIQUE INDEX "MusicPlaylist_userId_guildId_name_key" ON "public"."MusicPlaylist"("userId", "guildId", "name");
-- CreateIndex
CREATE INDEX "PlaylistTrack_playlistId_idx" ON "public"."PlaylistTrack"("playlistId");
-- CreateIndex
CREATE INDEX "PlaylistTrack_trackId_idx" ON "public"."PlaylistTrack"("trackId");
-- CreateIndex
CREATE INDEX "TrackLike_userId_guildId_idx" ON "public"."TrackLike"("userId", "guildId");
-- CreateIndex
CREATE INDEX "TrackLike_trackId_idx" ON "public"."TrackLike"("trackId");
-- CreateIndex
CREATE UNIQUE INDEX "TrackLike_userId_guildId_trackId_key" ON "public"."TrackLike"("userId", "guildId", "trackId");
-- AddForeignKey
ALTER TABLE "public"."PlaylistTrack" ADD CONSTRAINT "PlaylistTrack_playlistId_fkey" FOREIGN KEY ("playlistId") REFERENCES "public"."MusicPlaylist"("id") ON DELETE CASCADE ON UPDATE CASCADE;

View File

@@ -1,52 +1,52 @@
-- Migración: Corrección de items stackable y regeneración de inventarios
-- Fecha: 2025-10-09
-- Problema: Items de herramientas/armas marcados como stackable=true en base de datos antigua
-- Inventarios con quantity>1 pero sin state.instances con durabilidad
-- PASO 1: Actualizar definiciones de items (EconomyItem)
-- Marcar herramientas, armas, armaduras y capas como NO apilables
UPDATE "EconomyItem"
SET "stackable" = false
WHERE "key" LIKE 'tool.%'
OR "key" LIKE 'weapon.%'
OR "key" LIKE 'armor.%'
OR "key" LIKE 'cape.%';
-- PASO 2: Migrar inventarios existentes de stackable a non-stackable
-- Para cada entrada con quantity>1 de items que ahora son non-stackable,
-- generar state.instances[] con durabilidad máxima
-- Nota: Esta operación debe hacerse en código TypeScript porque:
-- 1. Necesitamos leer item.props.breakable.maxDurability
-- 2. Generar JSON dinámico de state.instances es complejo en SQL
-- 3. Requerimos validación de integridad por item
-- Ver: scripts/migrateStackableToInstanced.ts
-- PASO 3: Validar integridad post-migración
-- Verificar que no existan items non-stackable con quantity>1 y state.instances vacío
SELECT
ie.id,
ie."userId",
ie."guildId",
ei.key,
ei.name,
ie.quantity,
ie.state
FROM "InventoryEntry" ie
JOIN "EconomyItem" ei ON ie."itemId" = ei.id
WHERE ei."stackable" = false
AND ie.quantity > 1
AND (
ie.state IS NULL
OR jsonb_array_length(COALESCE((ie.state->>'instances')::jsonb, '[]'::jsonb)) = 0
);
-- Si esta query devuelve resultados, hay inconsistencias que deben corregirse
-- PASO 4 (Opcional): Resetear inventarios específicos corruptos
-- Si un usuario tiene datos inconsistentes, ejecutar:
-- DELETE FROM "InventoryEntry" WHERE "userId" = '<USER_ID>' AND "guildId" = '<GUILD_ID>' AND "itemId" IN (
-- SELECT id FROM "EconomyItem" WHERE "key" LIKE 'tool.%' OR "key" LIKE 'weapon.%'
-- );
-- Luego el usuario deberá re-adquirir items vía !comprar o admin !dar-item
-- Migración: Corrección de items stackable y regeneración de inventarios
-- Fecha: 2025-10-09
-- Problema: Items de herramientas/armas marcados como stackable=true en base de datos antigua
-- Inventarios con quantity>1 pero sin state.instances con durabilidad
-- PASO 1: Actualizar definiciones de items (EconomyItem)
-- Marcar herramientas, armas, armaduras y capas como NO apilables
UPDATE "EconomyItem"
SET "stackable" = false
WHERE "key" LIKE 'tool.%'
OR "key" LIKE 'weapon.%'
OR "key" LIKE 'armor.%'
OR "key" LIKE 'cape.%';
-- PASO 2: Migrar inventarios existentes de stackable a non-stackable
-- Para cada entrada con quantity>1 de items que ahora son non-stackable,
-- generar state.instances[] con durabilidad máxima
-- Nota: Esta operación debe hacerse en código TypeScript porque:
-- 1. Necesitamos leer item.props.breakable.maxDurability
-- 2. Generar JSON dinámico de state.instances es complejo en SQL
-- 3. Requerimos validación de integridad por item
-- Ver: scripts/migrateStackableToInstanced.ts
-- PASO 3: Validar integridad post-migración
-- Verificar que no existan items non-stackable con quantity>1 y state.instances vacío
SELECT
ie.id,
ie."userId",
ie."guildId",
ei.key,
ei.name,
ie.quantity,
ie.state
FROM "InventoryEntry" ie
JOIN "EconomyItem" ei ON ie."itemId" = ei.id
WHERE ei."stackable" = false
AND ie.quantity > 1
AND (
ie.state IS NULL
OR jsonb_array_length(COALESCE((ie.state->>'instances')::jsonb, '[]'::jsonb)) = 0
);
-- Si esta query devuelve resultados, hay inconsistencias que deben corregirse
-- PASO 4 (Opcional): Resetear inventarios específicos corruptos
-- Si un usuario tiene datos inconsistentes, ejecutar:
-- DELETE FROM "InventoryEntry" WHERE "userId" = '<USER_ID>' AND "guildId" = '<GUILD_ID>' AND "itemId" IN (
-- SELECT id FROM "EconomyItem" WHERE "key" LIKE 'tool.%' OR "key" LIKE 'weapon.%'
-- );
-- Luego el usuario deberá re-adquirir items vía !comprar o admin !dar-item

View File

@@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "postgresql"

File diff suppressed because it is too large Load Diff