335 lines
12 KiB
SQL
335 lines
12 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "CampaignRole" AS ENUM ('DM', 'PLAYER');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "Species" AS ENUM ('HUMAN', 'HALF_ELF', 'ELF', 'GNOME', 'DWARF', 'HALFLING', 'DRAGONBORN', 'TIEFLING', 'HALF_ORC', 'ORC');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "CharacterClass" AS ENUM ('FIGHTER', 'BARBARIAN', 'ROGUE', 'RANGER', 'WIZARD', 'SORCERER', 'CLERIC', 'PALADIN', 'BARD', 'WARLOCK', 'DRUID', 'MONK');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "Ability" AS ENUM ('STR', 'DEX', 'CON', 'INT', 'WIS', 'CHA');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "Skill" AS ENUM ('ACROBATICS', 'ANIMAL_HANDLING', 'ARCANA', 'ATHLETICS', 'DECEPTION', 'HISTORY', 'INSIGHT', 'INTIMIDATION', 'INVESTIGATION', 'MEDICINE', 'NATURE', 'PERCEPTION', 'PERFORMANCE', 'PERSUASION', 'RELIGION', 'SLEIGHT_OF_HAND', 'STEALTH', 'SURVIVAL');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "BuildStage" AS ENUM ('NOT_STARTED', 'ROLLING_SPECIES', 'ROLLING_CLASS', 'ROLLING_MOTIVATION', 'ASSIGNING_SCORES', 'ASSIGNING_PROFICIENCIES', 'CHOOSING_EQUIPMENT', 'COMPLETE');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "EncounterStatus" AS ENUM ('PLANNING', 'ACTIVE', 'COMPLETE');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "NoteVisibility" AS ENUM ('DM_ONLY', 'SHARED');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "users" (
|
|
"id" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"passwordHash" TEXT NOT NULL,
|
|
"displayName" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "campaigns" (
|
|
"id" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"inviteCode" TEXT NOT NULL,
|
|
"startingGold" INTEGER NOT NULL DEFAULT 0,
|
|
"startingItemCount" INTEGER NOT NULL DEFAULT 0,
|
|
"startingSpellCount" INTEGER NOT NULL DEFAULT 0,
|
|
"skipMotivationRoll" BOOLEAN NOT NULL DEFAULT false,
|
|
"ownerId" TEXT NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "campaigns_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "campaign_members" (
|
|
"id" TEXT NOT NULL,
|
|
"campaignId" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"role" "CampaignRole" NOT NULL DEFAULT 'PLAYER',
|
|
"joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "campaign_members_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "characters" (
|
|
"id" TEXT NOT NULL,
|
|
"campaignId" TEXT NOT NULL,
|
|
"userId" TEXT,
|
|
"createdById" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"species" "Species",
|
|
"characterClass" "CharacterClass",
|
|
"level" INTEGER NOT NULL DEFAULT 1,
|
|
"xp" INTEGER NOT NULL DEFAULT 0,
|
|
"motivation" TEXT,
|
|
"strScore" INTEGER NOT NULL DEFAULT 10,
|
|
"dexScore" INTEGER NOT NULL DEFAULT 10,
|
|
"conScore" INTEGER NOT NULL DEFAULT 10,
|
|
"intScore" INTEGER NOT NULL DEFAULT 10,
|
|
"wisScore" INTEGER NOT NULL DEFAULT 10,
|
|
"chaScore" INTEGER NOT NULL DEFAULT 10,
|
|
"halfElfBonusAbility1" "Ability",
|
|
"halfElfBonusAbility2" "Ability",
|
|
"currentHp" INTEGER NOT NULL DEFAULT 0,
|
|
"tempHp" INTEGER NOT NULL DEFAULT 0,
|
|
"armorBonus" INTEGER NOT NULL DEFAULT 0,
|
|
"speedOverride" INTEGER,
|
|
"specialAbilities" TEXT,
|
|
"gold" INTEGER NOT NULL DEFAULT 0,
|
|
"buildStage" "BuildStage" NOT NULL DEFAULT 'NOT_STARTED',
|
|
"buildState" JSONB,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "characters_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "character_skill_proficiencies" (
|
|
"id" TEXT NOT NULL,
|
|
"characterId" TEXT NOT NULL,
|
|
"skill" "Skill" NOT NULL,
|
|
"proficient" BOOLEAN NOT NULL DEFAULT true,
|
|
"expertise" BOOLEAN NOT NULL DEFAULT false,
|
|
|
|
CONSTRAINT "character_skill_proficiencies_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "character_save_proficiencies" (
|
|
"id" TEXT NOT NULL,
|
|
"characterId" TEXT NOT NULL,
|
|
"ability" "Ability" NOT NULL,
|
|
"proficient" BOOLEAN NOT NULL DEFAULT true,
|
|
|
|
CONSTRAINT "character_save_proficiencies_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "weapons" (
|
|
"id" TEXT NOT NULL,
|
|
"campaignId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"damageDice" TEXT NOT NULL,
|
|
"damageType" TEXT NOT NULL,
|
|
"attackAbility" TEXT NOT NULL,
|
|
"properties" TEXT[],
|
|
"rangeNormal" INTEGER,
|
|
"rangeLong" INTEGER,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "weapons_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "character_weapons" (
|
|
"id" TEXT NOT NULL,
|
|
"characterId" TEXT NOT NULL,
|
|
"weaponId" TEXT NOT NULL,
|
|
"quantity" INTEGER NOT NULL DEFAULT 1,
|
|
"equipped" BOOLEAN NOT NULL DEFAULT false,
|
|
|
|
CONSTRAINT "character_weapons_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "inventory_items" (
|
|
"id" TEXT NOT NULL,
|
|
"characterId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"quantity" INTEGER NOT NULL DEFAULT 1,
|
|
"equipped" BOOLEAN NOT NULL DEFAULT false,
|
|
|
|
CONSTRAINT "inventory_items_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "spells" (
|
|
"id" TEXT NOT NULL,
|
|
"campaignId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"level" INTEGER NOT NULL,
|
|
"school" TEXT,
|
|
"castingTime" TEXT,
|
|
"range" TEXT,
|
|
"duration" TEXT,
|
|
"description" TEXT,
|
|
|
|
CONSTRAINT "spells_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "character_spells" (
|
|
"id" TEXT NOT NULL,
|
|
"characterId" TEXT NOT NULL,
|
|
"spellId" TEXT NOT NULL,
|
|
"prepared" BOOLEAN NOT NULL DEFAULT false,
|
|
|
|
CONSTRAINT "character_spells_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "monsters" (
|
|
"id" TEXT NOT NULL,
|
|
"campaignId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"ac" INTEGER NOT NULL,
|
|
"maxHp" INTEGER NOT NULL,
|
|
"speed" INTEGER NOT NULL DEFAULT 30,
|
|
"strScore" INTEGER NOT NULL DEFAULT 10,
|
|
"dexScore" INTEGER NOT NULL DEFAULT 10,
|
|
"conScore" INTEGER NOT NULL DEFAULT 10,
|
|
"intScore" INTEGER NOT NULL DEFAULT 10,
|
|
"wisScore" INTEGER NOT NULL DEFAULT 10,
|
|
"chaScore" INTEGER NOT NULL DEFAULT 10,
|
|
"attackBonus" INTEGER NOT NULL DEFAULT 0,
|
|
"damageDice" TEXT,
|
|
"challengeRating" TEXT,
|
|
"specialTrait" TEXT,
|
|
"notes" TEXT,
|
|
|
|
CONSTRAINT "monsters_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "encounters" (
|
|
"id" TEXT NOT NULL,
|
|
"campaignId" TEXT NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"status" "EncounterStatus" NOT NULL DEFAULT 'PLANNING',
|
|
"currentRound" INTEGER NOT NULL DEFAULT 1,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "encounters_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "encounter_participants" (
|
|
"id" TEXT NOT NULL,
|
|
"encounterId" TEXT NOT NULL,
|
|
"characterId" TEXT,
|
|
"monsterId" TEXT,
|
|
"displayName" TEXT NOT NULL,
|
|
"initiative" INTEGER NOT NULL DEFAULT 0,
|
|
"currentHp" INTEGER NOT NULL,
|
|
"maxHp" INTEGER NOT NULL,
|
|
"conditions" TEXT[] DEFAULT ARRAY[]::TEXT[],
|
|
"isMonster" BOOLEAN NOT NULL,
|
|
|
|
CONSTRAINT "encounter_participants_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "notes" (
|
|
"id" TEXT NOT NULL,
|
|
"campaignId" TEXT,
|
|
"characterId" TEXT,
|
|
"authorId" TEXT NOT NULL,
|
|
"body" TEXT NOT NULL,
|
|
"visibility" "NoteVisibility" NOT NULL DEFAULT 'SHARED',
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "notes_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "campaigns_inviteCode_key" ON "campaigns"("inviteCode");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "campaign_members_campaignId_userId_key" ON "campaign_members"("campaignId", "userId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "character_skill_proficiencies_characterId_skill_key" ON "character_skill_proficiencies"("characterId", "skill");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "character_save_proficiencies_characterId_ability_key" ON "character_save_proficiencies"("characterId", "ability");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "character_weapons_characterId_weaponId_key" ON "character_weapons"("characterId", "weaponId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "character_spells_characterId_spellId_key" ON "character_spells"("characterId", "spellId");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "campaign_members" ADD CONSTRAINT "campaign_members_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "campaign_members" ADD CONSTRAINT "campaign_members_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "characters" ADD CONSTRAINT "characters_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "characters" ADD CONSTRAINT "characters_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "characters" ADD CONSTRAINT "characters_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "character_skill_proficiencies" ADD CONSTRAINT "character_skill_proficiencies_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "character_save_proficiencies" ADD CONSTRAINT "character_save_proficiencies_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "weapons" ADD CONSTRAINT "weapons_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "character_weapons" ADD CONSTRAINT "character_weapons_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "character_weapons" ADD CONSTRAINT "character_weapons_weaponId_fkey" FOREIGN KEY ("weaponId") REFERENCES "weapons"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "inventory_items" ADD CONSTRAINT "inventory_items_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "spells" ADD CONSTRAINT "spells_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "character_spells" ADD CONSTRAINT "character_spells_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "character_spells" ADD CONSTRAINT "character_spells_spellId_fkey" FOREIGN KEY ("spellId") REFERENCES "spells"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "monsters" ADD CONSTRAINT "monsters_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "encounters" ADD CONSTRAINT "encounters_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "encounter_participants" ADD CONSTRAINT "encounter_participants_encounterId_fkey" FOREIGN KEY ("encounterId") REFERENCES "encounters"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "encounter_participants" ADD CONSTRAINT "encounter_participants_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "encounter_participants" ADD CONSTRAINT "encounter_participants_monsterId_fkey" FOREIGN KEY ("monsterId") REFERENCES "monsters"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notes" ADD CONSTRAINT "notes_campaignId_fkey" FOREIGN KEY ("campaignId") REFERENCES "campaigns"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notes" ADD CONSTRAINT "notes_characterId_fkey" FOREIGN KEY ("characterId") REFERENCES "characters"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "notes" ADD CONSTRAINT "notes_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|