From 90f155d3348c18a380af8581892d75e82e6e57ed Mon Sep 17 00:00:00 2001 From: dmitriylaukhin Date: Tue, 19 May 2026 13:11:51 +0500 Subject: [PATCH] Add StudentQuestion and StudentQuestionMessage models Co-Authored-By: Claude Sonnet 4.6 --- .../migration.sql | 45 +++++++++++++++++++ prisma/schema.prisma | 43 ++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 prisma/migrations/20260519100000_add_student_questions/migration.sql diff --git a/prisma/migrations/20260519100000_add_student_questions/migration.sql b/prisma/migrations/20260519100000_add_student_questions/migration.sql new file mode 100644 index 0000000..a2c8f39 --- /dev/null +++ b/prisma/migrations/20260519100000_add_student_questions/migration.sql @@ -0,0 +1,45 @@ +-- CreateEnum +CREATE TYPE "QuestionStatus" AS ENUM ('OPEN', 'CLOSED'); + +-- CreateTable +CREATE TABLE "StudentQuestion" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "courseId" TEXT, + "title" TEXT NOT NULL, + "status" "QuestionStatus" NOT NULL DEFAULT 'OPEN', + "closedAt" TIMESTAMP(3), + "closedById" TEXT, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "StudentQuestion_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "StudentQuestionMessage" ( + "id" TEXT NOT NULL, + "questionId" TEXT NOT NULL, + "authorId" TEXT NOT NULL, + "text" TEXT NOT NULL, + "files" JSONB, + "isRead" BOOLEAN NOT NULL DEFAULT false, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "StudentQuestionMessage_pkey" PRIMARY KEY ("id") +); + +-- AddForeignKey +ALTER TABLE "StudentQuestion" ADD CONSTRAINT "StudentQuestion_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "StudentQuestion" ADD CONSTRAINT "StudentQuestion_courseId_fkey" FOREIGN KEY ("courseId") REFERENCES "Course"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "StudentQuestion" ADD CONSTRAINT "StudentQuestion_closedById_fkey" FOREIGN KEY ("closedById") REFERENCES "User"("id") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "StudentQuestionMessage" ADD CONSTRAINT "StudentQuestionMessage_questionId_fkey" FOREIGN KEY ("questionId") REFERENCES "StudentQuestion"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "StudentQuestionMessage" ADD CONSTRAINT "StudentQuestionMessage_authorId_fkey" FOREIGN KEY ("authorId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/schema.prisma b/prisma/schema.prisma index 0e4996d..f156972 100644 --- a/prisma/schema.prisma +++ b/prisma/schema.prisma @@ -37,6 +37,9 @@ model User { accessLogs AccessLog[] @relation("AccessLogUser") adminAccessLogs AccessLog[] @relation("AccessLogAdmin") balanceTransactions BalanceTransaction[] + questions StudentQuestion[] + closedQuestions StudentQuestion[] @relation("QuestionClosedBy") + questionMessages StudentQuestionMessage[] } model Session { @@ -111,6 +114,7 @@ model Course { modules Module[] enrollments CourseEnrollment[] accessLogs AccessLog[] + questions StudentQuestion[] } model Module { @@ -312,6 +316,45 @@ model LessonComment { replies LessonComment[] @relation("CommentReplies") } +// ───────────────────────────────────────────── +// Student Questions +// ───────────────────────────────────────────── + +enum QuestionStatus { + OPEN + CLOSED +} + +model StudentQuestion { + id String @id @default(cuid()) + userId String + courseId String? + title String + status QuestionStatus @default(OPEN) + closedAt DateTime? + closedById String? + createdAt DateTime @default(now()) + updatedAt DateTime @updatedAt + + user User @relation(fields: [userId], references: [id], onDelete: Cascade) + course Course? @relation(fields: [courseId], references: [id], onDelete: SetNull) + closedBy User? @relation("QuestionClosedBy", fields: [closedById], references: [id], onDelete: SetNull) + messages StudentQuestionMessage[] +} + +model StudentQuestionMessage { + id String @id @default(cuid()) + questionId String + authorId String + text String + files Json? // [{name, url, size}] + isRead Boolean @default(false) + createdAt DateTime @default(now()) + + question StudentQuestion @relation(fields: [questionId], references: [id], onDelete: Cascade) + author User @relation(fields: [authorId], references: [id], onDelete: Cascade) +} + // ───────────────────────────────────────────── // Balance // ─────────────────────────────────────────────