312 lines
9.6 KiB
MySQL
312 lines
9.6 KiB
MySQL
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "UserRole" AS ENUM ('LEARNER', 'ADMIN');
|
||
|
|
|
||
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "UserStatus" AS ENUM ('ACTIVE', 'INACTIVE');
|
||
|
|
|
||
|
|
-- CreateEnum
|
||
|
|
CREATE TYPE "QuestionType" AS ENUM ('MULTIPLE_CHOICE', 'SHORT_ANSWER', 'ESSAY');
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "users" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"email" TEXT NOT NULL,
|
||
|
|
"password" TEXT NOT NULL,
|
||
|
|
"name" TEXT NOT NULL,
|
||
|
|
"phone" TEXT,
|
||
|
|
"gender" TEXT,
|
||
|
|
"birthdate" TIMESTAMP(3),
|
||
|
|
"role" "UserRole" NOT NULL DEFAULT 'LEARNER',
|
||
|
|
"status" "UserStatus" NOT NULL DEFAULT 'ACTIVE',
|
||
|
|
"joinDate" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||
|
|
|
||
|
|
CONSTRAINT "users_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "courses" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"courseName" TEXT NOT NULL,
|
||
|
|
"instructorId" TEXT NOT NULL,
|
||
|
|
"createdById" TEXT NOT NULL,
|
||
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||
|
|
|
||
|
|
CONSTRAINT "courses_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "lessons" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"courseId" TEXT NOT NULL,
|
||
|
|
"lessonName" TEXT NOT NULL,
|
||
|
|
"learningGoal" TEXT,
|
||
|
|
"createdById" TEXT NOT NULL,
|
||
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||
|
|
|
||
|
|
CONSTRAINT "lessons_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "lesson_videos" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"lessonId" TEXT NOT NULL,
|
||
|
|
"fileName" TEXT NOT NULL,
|
||
|
|
"filePath" TEXT NOT NULL,
|
||
|
|
"fileSize" INTEGER NOT NULL,
|
||
|
|
"order" INTEGER NOT NULL,
|
||
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
|
||
|
|
CONSTRAINT "lesson_videos_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "lesson_vr_contents" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"lessonId" TEXT NOT NULL,
|
||
|
|
"fileName" TEXT NOT NULL,
|
||
|
|
"filePath" TEXT NOT NULL,
|
||
|
|
"fileSize" INTEGER NOT NULL,
|
||
|
|
"order" INTEGER NOT NULL,
|
||
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
|
||
|
|
CONSTRAINT "lesson_vr_contents_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "lesson_attachments" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"lessonId" TEXT NOT NULL,
|
||
|
|
"fileName" TEXT NOT NULL,
|
||
|
|
"filePath" TEXT NOT NULL,
|
||
|
|
"fileSize" INTEGER NOT NULL,
|
||
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
|
||
|
|
CONSTRAINT "lesson_attachments_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "questions" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"lessonId" TEXT,
|
||
|
|
"question" TEXT NOT NULL,
|
||
|
|
"type" "QuestionType" NOT NULL DEFAULT 'MULTIPLE_CHOICE',
|
||
|
|
"options" JSONB,
|
||
|
|
"correctAnswer" TEXT NOT NULL,
|
||
|
|
"explanation" TEXT,
|
||
|
|
"points" INTEGER NOT NULL DEFAULT 1,
|
||
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||
|
|
|
||
|
|
CONSTRAINT "questions_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "notices" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"title" TEXT NOT NULL,
|
||
|
|
"content" TEXT NOT NULL,
|
||
|
|
"writerId" TEXT NOT NULL,
|
||
|
|
"views" INTEGER NOT NULL DEFAULT 0,
|
||
|
|
"hasAttachment" BOOLEAN NOT NULL DEFAULT false,
|
||
|
|
"date" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||
|
|
|
||
|
|
CONSTRAINT "notices_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "notice_attachments" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"noticeId" TEXT NOT NULL,
|
||
|
|
"fileName" TEXT NOT NULL,
|
||
|
|
"filePath" TEXT NOT NULL,
|
||
|
|
"fileSize" INTEGER NOT NULL,
|
||
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
|
||
|
|
CONSTRAINT "notice_attachments_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "resources" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"title" TEXT NOT NULL,
|
||
|
|
"description" TEXT,
|
||
|
|
"filePath" TEXT,
|
||
|
|
"fileName" TEXT,
|
||
|
|
"fileSize" INTEGER,
|
||
|
|
"category" TEXT,
|
||
|
|
"views" INTEGER NOT NULL DEFAULT 0,
|
||
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||
|
|
|
||
|
|
CONSTRAINT "resources_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "enrollments" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"userId" TEXT NOT NULL,
|
||
|
|
"lessonId" TEXT NOT NULL,
|
||
|
|
"progress" INTEGER NOT NULL DEFAULT 0,
|
||
|
|
"completedAt" TIMESTAMP(3),
|
||
|
|
"enrolledAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
|
||
|
|
CONSTRAINT "enrollments_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "certificates" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"userId" TEXT NOT NULL,
|
||
|
|
"lessonId" TEXT,
|
||
|
|
"courseId" TEXT,
|
||
|
|
"verificationKey" TEXT NOT NULL,
|
||
|
|
"issuedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
|
||
|
|
CONSTRAINT "certificates_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateTable
|
||
|
|
CREATE TABLE "logs" (
|
||
|
|
"id" TEXT NOT NULL,
|
||
|
|
"userId" TEXT,
|
||
|
|
"action" TEXT NOT NULL,
|
||
|
|
"ipAddress" TEXT,
|
||
|
|
"userAgent" TEXT,
|
||
|
|
"details" JSONB,
|
||
|
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||
|
|
|
||
|
|
CONSTRAINT "logs_pkey" PRIMARY KEY ("id")
|
||
|
|
);
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE UNIQUE INDEX "users_email_key" ON "users"("email");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "users_email_idx" ON "users"("email");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "users_role_idx" ON "users"("role");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "users_status_idx" ON "users"("status");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "courses_instructorId_idx" ON "courses"("instructorId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "courses_createdById_idx" ON "courses"("createdById");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "courses_createdAt_idx" ON "courses"("createdAt");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "lessons_courseId_idx" ON "lessons"("courseId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "lessons_createdById_idx" ON "lessons"("createdById");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "lessons_createdAt_idx" ON "lessons"("createdAt");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "lesson_videos_lessonId_idx" ON "lesson_videos"("lessonId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "lesson_vr_contents_lessonId_idx" ON "lesson_vr_contents"("lessonId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "lesson_attachments_lessonId_idx" ON "lesson_attachments"("lessonId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "questions_lessonId_idx" ON "questions"("lessonId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "notices_writerId_idx" ON "notices"("writerId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "notices_date_idx" ON "notices"("date");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE UNIQUE INDEX "notice_attachments_noticeId_key" ON "notice_attachments"("noticeId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "resources_category_idx" ON "resources"("category");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "resources_createdAt_idx" ON "resources"("createdAt");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "enrollments_userId_idx" ON "enrollments"("userId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "enrollments_lessonId_idx" ON "enrollments"("lessonId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE UNIQUE INDEX "enrollments_userId_lessonId_key" ON "enrollments"("userId", "lessonId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE UNIQUE INDEX "certificates_verificationKey_key" ON "certificates"("verificationKey");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "certificates_userId_idx" ON "certificates"("userId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "certificates_verificationKey_idx" ON "certificates"("verificationKey");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "logs_userId_idx" ON "logs"("userId");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "logs_action_idx" ON "logs"("action");
|
||
|
|
|
||
|
|
-- CreateIndex
|
||
|
|
CREATE INDEX "logs_createdAt_idx" ON "logs"("createdAt");
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "courses" ADD CONSTRAINT "courses_instructorId_fkey" FOREIGN KEY ("instructorId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "courses" ADD CONSTRAINT "courses_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "lessons" ADD CONSTRAINT "lessons_courseId_fkey" FOREIGN KEY ("courseId") REFERENCES "courses"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "lessons" ADD CONSTRAINT "lessons_createdById_fkey" FOREIGN KEY ("createdById") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "lesson_videos" ADD CONSTRAINT "lesson_videos_lessonId_fkey" FOREIGN KEY ("lessonId") REFERENCES "lessons"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "lesson_vr_contents" ADD CONSTRAINT "lesson_vr_contents_lessonId_fkey" FOREIGN KEY ("lessonId") REFERENCES "lessons"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "lesson_attachments" ADD CONSTRAINT "lesson_attachments_lessonId_fkey" FOREIGN KEY ("lessonId") REFERENCES "lessons"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "questions" ADD CONSTRAINT "questions_lessonId_fkey" FOREIGN KEY ("lessonId") REFERENCES "lessons"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "notices" ADD CONSTRAINT "notices_writerId_fkey" FOREIGN KEY ("writerId") REFERENCES "users"("id") ON DELETE RESTRICT ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "notice_attachments" ADD CONSTRAINT "notice_attachments_noticeId_fkey" FOREIGN KEY ("noticeId") REFERENCES "notices"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "enrollments" ADD CONSTRAINT "enrollments_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "enrollments" ADD CONSTRAINT "enrollments_lessonId_fkey" FOREIGN KEY ("lessonId") REFERENCES "lessons"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "certificates" ADD CONSTRAINT "certificates_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||
|
|
|
||
|
|
-- AddForeignKey
|
||
|
|
ALTER TABLE "logs" ADD CONSTRAINT "logs_userId_fkey" FOREIGN KEY ("userId") REFERENCES "users"("id") ON DELETE SET NULL ON UPDATE CASCADE;
|