-- CreateExtension CREATE EXTENSION IF NOT EXISTS "postgis"; -- CreateEnum CREATE TYPE "ParkStatus" AS ENUM ('OPERATING', 'CLOSED_TEMP', 'CLOSED_PERM', 'UNDER_CONSTRUCTION', 'DEMOLISHED', 'RELOCATED'); -- CreateTable CREATE TABLE "User" ( "id" SERIAL PRIMARY KEY, "email" TEXT NOT NULL, "username" TEXT NOT NULL, "password" TEXT, "dateJoined" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "isActive" BOOLEAN NOT NULL DEFAULT true, "isStaff" BOOLEAN NOT NULL DEFAULT false, "isSuperuser" BOOLEAN NOT NULL DEFAULT false, "lastLogin" TIMESTAMP(3) ); -- CreateTable CREATE TABLE "Park" ( "id" SERIAL PRIMARY KEY, "name" TEXT NOT NULL, "slug" TEXT NOT NULL, "description" TEXT, "status" "ParkStatus" NOT NULL DEFAULT 'OPERATING', "location" JSONB, "opening_date" DATE, "closing_date" DATE, "operating_season" TEXT, "size_acres" DECIMAL(10,2), "website" TEXT, "average_rating" DECIMAL(3,2), "ride_count" INTEGER, "coaster_count" INTEGER, "creatorId" INTEGER, "ownerId" INTEGER, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL ); -- CreateTable CREATE TABLE "ParkArea" ( "id" SERIAL PRIMARY KEY, "name" TEXT NOT NULL, "slug" TEXT NOT NULL, "description" TEXT, "opening_date" DATE, "closing_date" DATE, "parkId" INTEGER NOT NULL, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL ); -- CreateTable CREATE TABLE "Company" ( "id" SERIAL PRIMARY KEY, "name" TEXT NOT NULL, "website" TEXT, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL ); -- CreateTable CREATE TABLE "Review" ( "id" SERIAL PRIMARY KEY, "content" TEXT NOT NULL, "rating" INTEGER NOT NULL, "parkId" INTEGER NOT NULL, "userId" INTEGER NOT NULL, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL ); -- CreateTable CREATE TABLE "Photo" ( "id" SERIAL PRIMARY KEY, "url" TEXT NOT NULL, "caption" TEXT, "parkId" INTEGER, "reviewId" INTEGER, "userId" INTEGER NOT NULL, "created_at" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, "updated_at" TIMESTAMP(3) NOT NULL ); -- CreateIndex CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); CREATE UNIQUE INDEX "User_username_key" ON "User"("username"); CREATE UNIQUE INDEX "Park_slug_key" ON "Park"("slug"); CREATE UNIQUE INDEX "ParkArea_parkId_slug_key" ON "ParkArea"("parkId", "slug"); -- AddForeignKey ALTER TABLE "Park" ADD CONSTRAINT "Park_creatorId_fkey" FOREIGN KEY ("creatorId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE "Park" ADD CONSTRAINT "Park_ownerId_fkey" FOREIGN KEY ("ownerId") REFERENCES "Company"("id") ON DELETE SET NULL ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "ParkArea" ADD CONSTRAINT "ParkArea_parkId_fkey" FOREIGN KEY ("parkId") REFERENCES "Park"("id") ON DELETE CASCADE ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "Review" ADD CONSTRAINT "Review_parkId_fkey" FOREIGN KEY ("parkId") REFERENCES "Park"("id") ON DELETE RESTRICT ON UPDATE CASCADE; ALTER TABLE "Review" ADD CONSTRAINT "Review_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- AddForeignKey ALTER TABLE "Photo" ADD CONSTRAINT "Photo_parkId_fkey" FOREIGN KEY ("parkId") REFERENCES "Park"("id") ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE "Photo" ADD CONSTRAINT "Photo_reviewId_fkey" FOREIGN KEY ("reviewId") REFERENCES "Review"("id") ON DELETE SET NULL ON UPDATE CASCADE; ALTER TABLE "Photo" ADD CONSTRAINT "Photo_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE; -- CreateIndex CREATE INDEX "Park_slug_idx" ON "Park"("slug"); CREATE INDEX "ParkArea_slug_idx" ON "ParkArea"("slug"); CREATE INDEX "Review_parkId_idx" ON "Review"("parkId"); CREATE INDEX "Review_userId_idx" ON "Review"("userId"); CREATE INDEX "Photo_parkId_idx" ON "Photo"("parkId"); CREATE INDEX "Photo_reviewId_idx" ON "Photo"("reviewId"); CREATE INDEX "Photo_userId_idx" ON "Photo"("userId");