CREATE TABLE `accounts` ( `userId` varchar(128) NOT NULL, `type` varchar(255) NOT NULL, `provider` varchar(255) NOT NULL, `providerAccountId` varchar(255) NOT NULL, `refresh_token` text, `access_token` text, `expires_at` int, `token_type` varchar(255), `scope` varchar(255), `id_token` text, `session_state` varchar(255), CONSTRAINT `accounts_provider_providerAccountId_pk` PRIMARY KEY(`provider`,`providerAccountId`) ); --> statement-breakpoint CREATE TABLE `chapters` ( `id` varchar(128) NOT NULL, `textbook_id` varchar(128) NOT NULL, `title` varchar(255) NOT NULL, `order` int DEFAULT 0, `parent_id` varchar(128), `created_at` timestamp NOT NULL DEFAULT (now()), `updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT `chapters_id` PRIMARY KEY(`id`) ); --> statement-breakpoint CREATE TABLE `exam_questions` ( `exam_id` varchar(128) NOT NULL, `question_id` varchar(128) NOT NULL, `score` int DEFAULT 0, `order` int DEFAULT 0, CONSTRAINT `exam_questions_exam_id_question_id_pk` PRIMARY KEY(`exam_id`,`question_id`) ); --> statement-breakpoint CREATE TABLE `exam_submissions` ( `id` varchar(128) NOT NULL, `exam_id` varchar(128) NOT NULL, `student_id` varchar(128) NOT NULL, `score` int, `status` varchar(50) DEFAULT 'started', `submitted_at` timestamp, `created_at` timestamp NOT NULL DEFAULT (now()), `updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT `exam_submissions_id` PRIMARY KEY(`id`) ); --> statement-breakpoint CREATE TABLE `exams` ( `id` varchar(128) NOT NULL, `title` varchar(255) NOT NULL, `description` text, `creator_id` varchar(128) NOT NULL, `start_time` timestamp, `end_time` timestamp, `status` varchar(50) DEFAULT 'draft', `created_at` timestamp NOT NULL DEFAULT (now()), `updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT `exams_id` PRIMARY KEY(`id`) ); --> statement-breakpoint CREATE TABLE `knowledge_points` ( `id` varchar(128) NOT NULL, `name` varchar(255) NOT NULL, `description` text, `parent_id` varchar(128), `level` int DEFAULT 0, `order` int DEFAULT 0, `created_at` timestamp NOT NULL DEFAULT (now()), `updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT `knowledge_points_id` PRIMARY KEY(`id`) ); --> statement-breakpoint CREATE TABLE `questions` ( `id` varchar(128) NOT NULL, `content` json NOT NULL, `type` enum('single_choice','multiple_choice','text','judgment','composite') NOT NULL, `difficulty` int DEFAULT 1, `parent_id` varchar(128), `author_id` varchar(128) NOT NULL, `created_at` timestamp NOT NULL DEFAULT (now()), `updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT `questions_id` PRIMARY KEY(`id`) ); --> statement-breakpoint CREATE TABLE `questions_to_knowledge_points` ( `question_id` varchar(128) NOT NULL, `knowledge_point_id` varchar(128) NOT NULL, CONSTRAINT `questions_to_knowledge_points_question_id_knowledge_point_id_pk` PRIMARY KEY(`question_id`,`knowledge_point_id`) ); --> statement-breakpoint CREATE TABLE `roles` ( `id` varchar(128) NOT NULL, `name` varchar(50) NOT NULL, `description` varchar(255), `created_at` timestamp NOT NULL DEFAULT (now()), `updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT `roles_id` PRIMARY KEY(`id`), CONSTRAINT `roles_name_unique` UNIQUE(`name`) ); --> statement-breakpoint CREATE TABLE `sessions` ( `sessionToken` varchar(255) NOT NULL, `userId` varchar(128) NOT NULL, `expires` timestamp NOT NULL, CONSTRAINT `sessions_sessionToken` PRIMARY KEY(`sessionToken`) ); --> statement-breakpoint CREATE TABLE `submission_answers` ( `id` varchar(128) NOT NULL, `submission_id` varchar(128) NOT NULL, `question_id` varchar(128) NOT NULL, `answer_content` json, `score` int, `feedback` text, `created_at` timestamp NOT NULL DEFAULT (now()), `updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT `submission_answers_id` PRIMARY KEY(`id`) ); --> statement-breakpoint CREATE TABLE `textbooks` ( `id` varchar(128) NOT NULL, `title` varchar(255) NOT NULL, `subject` varchar(100) NOT NULL, `grade` varchar(50), `publisher` varchar(100), `created_at` timestamp NOT NULL DEFAULT (now()), `updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT `textbooks_id` PRIMARY KEY(`id`) ); --> statement-breakpoint CREATE TABLE `users` ( `id` varchar(128) NOT NULL, `name` varchar(255), `email` varchar(255) NOT NULL, `emailVerified` timestamp, `image` varchar(255), `role` varchar(50) DEFAULT 'student', `password` varchar(255), `created_at` timestamp NOT NULL DEFAULT (now()), `updated_at` timestamp NOT NULL DEFAULT (now()) ON UPDATE CURRENT_TIMESTAMP, CONSTRAINT `users_id` PRIMARY KEY(`id`), CONSTRAINT `users_email_unique` UNIQUE(`email`) ); --> statement-breakpoint CREATE TABLE `users_to_roles` ( `user_id` varchar(128) NOT NULL, `role_id` varchar(128) NOT NULL, CONSTRAINT `users_to_roles_user_id_role_id_pk` PRIMARY KEY(`user_id`,`role_id`) ); --> statement-breakpoint CREATE TABLE `verificationTokens` ( `identifier` varchar(255) NOT NULL, `token` varchar(255) NOT NULL, `expires` timestamp NOT NULL, CONSTRAINT `verificationTokens_identifier_token_pk` PRIMARY KEY(`identifier`,`token`) ); --> statement-breakpoint ALTER TABLE `accounts` ADD CONSTRAINT `accounts_userId_users_id_fk` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `chapters` ADD CONSTRAINT `chapters_textbook_id_textbooks_id_fk` FOREIGN KEY (`textbook_id`) REFERENCES `textbooks`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `exam_questions` ADD CONSTRAINT `exam_questions_exam_id_exams_id_fk` FOREIGN KEY (`exam_id`) REFERENCES `exams`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `exam_questions` ADD CONSTRAINT `exam_questions_question_id_questions_id_fk` FOREIGN KEY (`question_id`) REFERENCES `questions`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `exam_submissions` ADD CONSTRAINT `exam_submissions_exam_id_exams_id_fk` FOREIGN KEY (`exam_id`) REFERENCES `exams`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `exam_submissions` ADD CONSTRAINT `exam_submissions_student_id_users_id_fk` FOREIGN KEY (`student_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `exams` ADD CONSTRAINT `exams_creator_id_users_id_fk` FOREIGN KEY (`creator_id`) REFERENCES `users`(`id`) ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE `questions` ADD CONSTRAINT `questions_author_id_users_id_fk` FOREIGN KEY (`author_id`) REFERENCES `users`(`id`) ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE `questions_to_knowledge_points` ADD CONSTRAINT `questions_to_knowledge_points_question_id_questions_id_fk` FOREIGN KEY (`question_id`) REFERENCES `questions`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `questions_to_knowledge_points` ADD CONSTRAINT `questions_to_knowledge_points_knowledge_point_id_knowledge_points_id_fk` FOREIGN KEY (`knowledge_point_id`) REFERENCES `knowledge_points`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `sessions` ADD CONSTRAINT `sessions_userId_users_id_fk` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `submission_answers` ADD CONSTRAINT `submission_answers_submission_id_exam_submissions_id_fk` FOREIGN KEY (`submission_id`) REFERENCES `exam_submissions`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `submission_answers` ADD CONSTRAINT `submission_answers_question_id_questions_id_fk` FOREIGN KEY (`question_id`) REFERENCES `questions`(`id`) ON DELETE no action ON UPDATE no action;--> statement-breakpoint ALTER TABLE `users_to_roles` ADD CONSTRAINT `users_to_roles_user_id_users_id_fk` FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE `users_to_roles` ADD CONSTRAINT `users_to_roles_role_id_roles_id_fk` FOREIGN KEY (`role_id`) REFERENCES `roles`(`id`) ON DELETE cascade ON UPDATE no action;--> statement-breakpoint CREATE INDEX `account_userId_idx` ON `accounts` (`userId`);--> statement-breakpoint CREATE INDEX `textbook_idx` ON `chapters` (`textbook_id`);--> statement-breakpoint CREATE INDEX `parent_id_idx` ON `chapters` (`parent_id`);--> statement-breakpoint CREATE INDEX `exam_student_idx` ON `exam_submissions` (`exam_id`,`student_id`);--> statement-breakpoint CREATE INDEX `parent_id_idx` ON `knowledge_points` (`parent_id`);--> statement-breakpoint CREATE INDEX `parent_id_idx` ON `questions` (`parent_id`);--> statement-breakpoint CREATE INDEX `author_id_idx` ON `questions` (`author_id`);--> statement-breakpoint CREATE INDEX `kp_idx` ON `questions_to_knowledge_points` (`knowledge_point_id`);--> statement-breakpoint CREATE INDEX `session_userId_idx` ON `sessions` (`userId`);--> statement-breakpoint CREATE INDEX `submission_idx` ON `submission_answers` (`submission_id`);--> statement-breakpoint CREATE INDEX `email_idx` ON `users` (`email`);--> statement-breakpoint CREATE INDEX `user_id_idx` ON `users_to_roles` (`user_id`);