256 lines
8.3 KiB
SQL
256 lines
8.3 KiB
SQL
-- CreateTable
|
|
CREATE TABLE "User" (
|
|
"id" SERIAL NOT NULL,
|
|
"email" TEXT NOT NULL,
|
|
"username" TEXT NOT NULL,
|
|
"password" TEXT NOT NULL,
|
|
"role" TEXT NOT NULL DEFAULT 'Student',
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Subject" (
|
|
"id" SERIAL NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"abbreviation" TEXT,
|
|
"color" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Subject_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Room" (
|
|
"id" SERIAL NOT NULL,
|
|
"number" TEXT NOT NULL,
|
|
"building" TEXT,
|
|
"capacity" INTEGER,
|
|
"equipment" TEXT,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Room_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "TimetableEntry" (
|
|
"id" SERIAL NOT NULL,
|
|
"dayOfWeek" INTEGER NOT NULL,
|
|
"startTime" TEXT NOT NULL,
|
|
"endTime" TEXT NOT NULL,
|
|
"subjectId" INTEGER NOT NULL,
|
|
"teacherId" INTEGER,
|
|
"roomId" INTEGER,
|
|
"weekNumber" INTEGER,
|
|
"year" INTEGER,
|
|
"isRecurring" BOOLEAN NOT NULL DEFAULT true,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "TimetableEntry_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Feedback" (
|
|
"id" SERIAL NOT NULL,
|
|
"studentId" INTEGER NOT NULL,
|
|
"teacherId" INTEGER NOT NULL,
|
|
"lessonId" INTEGER NOT NULL,
|
|
"lessonDate" TIMESTAMP(3) NOT NULL,
|
|
"overallRating" INTEGER NOT NULL,
|
|
"categories" JSONB,
|
|
"whatWasGood" TEXT,
|
|
"whatCanImprove" TEXT,
|
|
"additionalComments" TEXT,
|
|
"isAnonymous" BOOLEAN NOT NULL DEFAULT false,
|
|
"allowTeacherResponse" BOOLEAN NOT NULL DEFAULT true,
|
|
"teacherResponse" TEXT,
|
|
"teacherRespondedAt" TIMESTAMP(3),
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Feedback_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "Grade" (
|
|
"id" SERIAL NOT NULL,
|
|
"studentId" INTEGER NOT NULL,
|
|
"timetableEntryId" INTEGER NOT NULL,
|
|
"weekNumber" INTEGER NOT NULL,
|
|
"year" INTEGER NOT NULL,
|
|
"grade" DOUBLE PRECISION NOT NULL,
|
|
"gradeType" TEXT NOT NULL,
|
|
"weight" DOUBLE PRECISION DEFAULT 1.0,
|
|
"teacherId" INTEGER NOT NULL,
|
|
"title" TEXT,
|
|
"description" TEXT,
|
|
"maxPoints" DOUBLE PRECISION,
|
|
"achievedPoints" DOUBLE PRECISION,
|
|
"date" TIMESTAMP(3) NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "Grade_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ChatGroup" (
|
|
"id" SERIAL NOT NULL,
|
|
"name" TEXT NOT NULL,
|
|
"description" TEXT,
|
|
"createdById" INTEGER NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
|
|
CONSTRAINT "ChatGroup_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ChatGroupMember" (
|
|
"id" SERIAL NOT NULL,
|
|
"userId" INTEGER NOT NULL,
|
|
"groupId" INTEGER NOT NULL,
|
|
"joinedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ChatGroupMember_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateTable
|
|
CREATE TABLE "ChatMessage" (
|
|
"id" SERIAL NOT NULL,
|
|
"content" TEXT NOT NULL,
|
|
"userId" INTEGER NOT NULL,
|
|
"groupId" INTEGER NOT NULL,
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
|
|
CONSTRAINT "ChatMessage_pkey" PRIMARY KEY ("id")
|
|
);
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "User_username_key" ON "User"("username");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Subject_name_key" ON "Subject"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Subject_name_idx" ON "Subject"("name");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Room_number_key" ON "Room"("number");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Room_number_idx" ON "Room"("number");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "TimetableEntry_dayOfWeek_idx" ON "TimetableEntry"("dayOfWeek");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "TimetableEntry_weekNumber_year_idx" ON "TimetableEntry"("weekNumber", "year");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "TimetableEntry_subjectId_idx" ON "TimetableEntry"("subjectId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "TimetableEntry_teacherId_idx" ON "TimetableEntry"("teacherId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "TimetableEntry_roomId_idx" ON "TimetableEntry"("roomId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Feedback_studentId_idx" ON "Feedback"("studentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Feedback_teacherId_idx" ON "Feedback"("teacherId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Feedback_lessonId_idx" ON "Feedback"("lessonId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Feedback_studentId_lessonId_key" ON "Feedback"("studentId", "lessonId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Grade_studentId_idx" ON "Grade"("studentId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Grade_timetableEntryId_idx" ON "Grade"("timetableEntryId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Grade_teacherId_idx" ON "Grade"("teacherId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "Grade_weekNumber_year_idx" ON "Grade"("weekNumber", "year");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "Grade_studentId_timetableEntryId_weekNumber_year_gradeType_key" ON "Grade"("studentId", "timetableEntryId", "weekNumber", "year", "gradeType");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ChatGroup_createdById_idx" ON "ChatGroup"("createdById");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ChatGroupMember_userId_idx" ON "ChatGroupMember"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ChatGroupMember_groupId_idx" ON "ChatGroupMember"("groupId");
|
|
|
|
-- CreateIndex
|
|
CREATE UNIQUE INDEX "ChatGroupMember_userId_groupId_key" ON "ChatGroupMember"("userId", "groupId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ChatMessage_groupId_idx" ON "ChatMessage"("groupId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ChatMessage_userId_idx" ON "ChatMessage"("userId");
|
|
|
|
-- CreateIndex
|
|
CREATE INDEX "ChatMessage_createdAt_idx" ON "ChatMessage"("createdAt");
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "TimetableEntry" ADD CONSTRAINT "TimetableEntry_subjectId_fkey" FOREIGN KEY ("subjectId") REFERENCES "Subject"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "TimetableEntry" ADD CONSTRAINT "TimetableEntry_teacherId_fkey" FOREIGN KEY ("teacherId") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "TimetableEntry" ADD CONSTRAINT "TimetableEntry_roomId_fkey" FOREIGN KEY ("roomId") REFERENCES "Room"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Feedback" ADD CONSTRAINT "Feedback_studentId_fkey" FOREIGN KEY ("studentId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Feedback" ADD CONSTRAINT "Feedback_teacherId_fkey" FOREIGN KEY ("teacherId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Feedback" ADD CONSTRAINT "Feedback_lessonId_fkey" FOREIGN KEY ("lessonId") REFERENCES "TimetableEntry"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Grade" ADD CONSTRAINT "Grade_studentId_fkey" FOREIGN KEY ("studentId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Grade" ADD CONSTRAINT "Grade_timetableEntryId_fkey" FOREIGN KEY ("timetableEntryId") REFERENCES "TimetableEntry"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "Grade" ADD CONSTRAINT "Grade_teacherId_fkey" FOREIGN KEY ("teacherId") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ChatGroup" ADD CONSTRAINT "ChatGroup_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "User"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ChatGroupMember" ADD CONSTRAINT "ChatGroupMember_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ChatGroupMember" ADD CONSTRAINT "ChatGroupMember_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "ChatGroup"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ChatMessage" ADD CONSTRAINT "ChatMessage_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE "ChatMessage" ADD CONSTRAINT "ChatMessage_groupId_fkey" FOREIGN KEY ("groupId") REFERENCES "ChatGroup"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|