103 lines
3.2 KiB
SQL
103 lines
3.2 KiB
SQL
-- CreateEnum
|
|
CREATE TYPE "Subject" AS ENUM ('MATH', 'READING', 'WRITING');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "Difficulty" AS ENUM ('EASY', 'MEDIUM', 'HARD');
|
|
|
|
-- CreateEnum
|
|
CREATE TYPE "SessionStatus" AS ENUM ('IN_PROGRESS', 'COMPLETED', 'ABANDONED');
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "User" (
|
|
"id" TEXT NOT NULL,
|
|
"googleId" TEXT NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"displayName" TEXT NOT NULL,
|
|
"avatarUrl" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Question" (
|
|
"id" TEXT NOT NULL,
|
|
"grade" INTEGER NOT NULL,
|
|
"subject" "Subject" NOT NULL,
|
|
"strand" TEXT NOT NULL,
|
|
"difficulty" "Difficulty" NOT NULL,
|
|
"questionText" TEXT NOT NULL,
|
|
"options" JSONB NOT NULL,
|
|
"correctAnswer" TEXT NOT NULL,
|
|
"explanation" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "Question_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "GameSession" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"grade" INTEGER NOT NULL,
|
|
"subject" "Subject" NOT NULL,
|
|
"status" "SessionStatus" NOT NULL DEFAULT 'IN_PROGRESS',
|
|
"score" INTEGER NOT NULL DEFAULT 0,
|
|
"totalQuestions" INTEGER NOT NULL,
|
|
"correctAnswers" INTEGER NOT NULL DEFAULT 0,
|
|
"startedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"completedAt" TIMESTAMP(3),
|
|
|
|
CONSTRAINT "GameSession_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "UserAnswer" (
|
|
"id" TEXT NOT NULL,
|
|
"sessionId" TEXT NOT NULL,
|
|
"questionId" TEXT NOT NULL,
|
|
"selectedAnswer" TEXT NOT NULL,
|
|
"isCorrect" BOOLEAN NOT NULL,
|
|
"timeSpentMs" INTEGER NOT NULL,
|
|
"answeredAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "UserAnswer_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "LeaderboardEntry" (
|
|
"id" TEXT NOT NULL,
|
|
"userId" TEXT NOT NULL,
|
|
"grade" INTEGER NOT NULL,
|
|
"subject" "Subject" NOT NULL,
|
|
"bestScore" INTEGER NOT NULL,
|
|
"gamesPlayed" INTEGER NOT NULL,
|
|
"totalCorrect" INTEGER NOT NULL,
|
|
"rank" INTEGER,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "LeaderboardEntry_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_googleId_key" ON "User"("googleId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "LeaderboardEntry_userId_grade_subject_key" ON "LeaderboardEntry"("userId", "grade", "subject");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "GameSession" ADD CONSTRAINT "GameSession_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "UserAnswer" ADD CONSTRAINT "UserAnswer_sessionId_fkey" FOREIGN KEY ("sessionId") REFERENCES "GameSession"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "UserAnswer" ADD CONSTRAINT "UserAnswer_questionId_fkey" FOREIGN KEY ("questionId") REFERENCES "Question"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "LeaderboardEntry" ADD CONSTRAINT "LeaderboardEntry_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|