- backend/tsconfig.json: rootDir=./src + include/exclude to fix nest build output (was emitting dist/src/main.js, now dist/main.js) - backend/src/auth/auth.module.ts: @nestjs/jwt 11 tightened signOptions. expiresIn to ms StringValue; cast env-sourced string via JwtModuleOptions['signOptions']['expiresIn'] to satisfy the type without pulling in @types/jsonwebtoken. - backend/prisma/migrations/20260411153520_init: initial migration generated by 'prisma migrate dev --name init' against the corrected schema (SkillSnapshot.tagId nullable, SetNull cascades). Verified end-to-end against https://reloop-api.nabomhalang.co.kr on Dev VM: login → create study-log → queue → submit → 409 guard all passing.
123 lines
5.0 KiB
SQL
123 lines
5.0 KiB
SQL
-- CreateTable
|
|
CREATE TABLE `users` (
|
|
`id` INTEGER NOT NULL AUTO_INCREMENT,
|
|
`email` VARCHAR(191) NOT NULL,
|
|
`password` VARCHAR(191) NOT NULL,
|
|
`nickname` VARCHAR(191) NOT NULL,
|
|
`persona` ENUM('senior', 'mid', 'junior', 'crammer') NOT NULL DEFAULT 'mid',
|
|
`currentGrade` INTEGER NULL,
|
|
`targetGrade` INTEGER NULL,
|
|
`reviewIntensity` ENUM('strict', 'moderate', 'relaxed') NOT NULL DEFAULT 'moderate',
|
|
`onboardedAt` DATETIME(3) NULL,
|
|
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
|
`updatedAt` DATETIME(3) NOT NULL,
|
|
|
|
UNIQUE INDEX `users_email_key`(`email`),
|
|
PRIMARY KEY (`id`)
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
|
|
-- CreateTable
|
|
CREATE TABLE `subjects` (
|
|
`id` INTEGER NOT NULL AUTO_INCREMENT,
|
|
`name` VARCHAR(191) NOT NULL,
|
|
`color` VARCHAR(191) NOT NULL DEFAULT '#6366f1',
|
|
`userId` INTEGER NOT NULL,
|
|
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
|
|
|
INDEX `subjects_userId_idx`(`userId`),
|
|
UNIQUE INDEX `subjects_userId_name_key`(`userId`, `name`),
|
|
PRIMARY KEY (`id`)
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
|
|
-- CreateTable
|
|
CREATE TABLE `tags` (
|
|
`id` INTEGER NOT NULL AUTO_INCREMENT,
|
|
`name` VARCHAR(191) NOT NULL,
|
|
`subjectId` INTEGER NOT NULL,
|
|
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
|
|
|
INDEX `tags_subjectId_idx`(`subjectId`),
|
|
UNIQUE INDEX `tags_subjectId_name_key`(`subjectId`, `name`),
|
|
PRIMARY KEY (`id`)
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
|
|
-- CreateTable
|
|
CREATE TABLE `study_logs` (
|
|
`id` INTEGER NOT NULL AUTO_INCREMENT,
|
|
`userId` INTEGER NOT NULL,
|
|
`subjectId` INTEGER NOT NULL,
|
|
`tagId` INTEGER NULL,
|
|
`title` VARCHAR(191) NOT NULL,
|
|
`difficulty` DOUBLE NOT NULL,
|
|
`baseCorrectRate` DOUBLE NULL,
|
|
`result` ENUM('correct', 'incorrect', 'partial') NOT NULL,
|
|
`memo` TEXT NULL,
|
|
`studiedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
|
`timeSpent` INTEGER NULL,
|
|
|
|
INDEX `study_logs_userId_studiedAt_idx`(`userId`, `studiedAt`),
|
|
INDEX `study_logs_subjectId_idx`(`subjectId`),
|
|
INDEX `study_logs_tagId_idx`(`tagId`),
|
|
PRIMARY KEY (`id`)
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
|
|
-- CreateTable
|
|
CREATE TABLE `review_schedules` (
|
|
`id` INTEGER NOT NULL AUTO_INCREMENT,
|
|
`userId` INTEGER NOT NULL,
|
|
`studyLogId` INTEGER NOT NULL,
|
|
`scheduledAt` DATETIME(3) NOT NULL,
|
|
`reviewedAt` DATETIME(3) NULL,
|
|
`result` ENUM('correct', 'incorrect', 'partial') NULL,
|
|
`iteration` INTEGER NOT NULL DEFAULT 0,
|
|
`predictedP` DOUBLE NULL,
|
|
`status` ENUM('pending', 'done', 'skipped', 'expired') NOT NULL DEFAULT 'pending',
|
|
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
|
`updatedAt` DATETIME(3) NOT NULL,
|
|
|
|
INDEX `review_schedules_userId_status_scheduledAt_idx`(`userId`, `status`, `scheduledAt`),
|
|
INDEX `review_schedules_studyLogId_idx`(`studyLogId`),
|
|
PRIMARY KEY (`id`)
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
|
|
-- CreateTable
|
|
CREATE TABLE `skill_snapshots` (
|
|
`id` INTEGER NOT NULL AUTO_INCREMENT,
|
|
`userId` INTEGER NOT NULL,
|
|
`tagId` INTEGER NULL,
|
|
`s0` DOUBLE NOT NULL,
|
|
`lastUpdatedAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
|
|
`sampleCount` INTEGER NOT NULL DEFAULT 0,
|
|
|
|
INDEX `skill_snapshots_userId_idx`(`userId`),
|
|
UNIQUE INDEX `skill_snapshots_userId_tagId_key`(`userId`, `tagId`),
|
|
PRIMARY KEY (`id`)
|
|
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE `subjects` ADD CONSTRAINT `subjects_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE `tags` ADD CONSTRAINT `tags_subjectId_fkey` FOREIGN KEY (`subjectId`) REFERENCES `subjects`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE `study_logs` ADD CONSTRAINT `study_logs_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE `study_logs` ADD CONSTRAINT `study_logs_subjectId_fkey` FOREIGN KEY (`subjectId`) REFERENCES `subjects`(`id`) ON DELETE RESTRICT ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE `study_logs` ADD CONSTRAINT `study_logs_tagId_fkey` FOREIGN KEY (`tagId`) REFERENCES `tags`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE `review_schedules` ADD CONSTRAINT `review_schedules_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE `review_schedules` ADD CONSTRAINT `review_schedules_studyLogId_fkey` FOREIGN KEY (`studyLogId`) REFERENCES `study_logs`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE `skill_snapshots` ADD CONSTRAINT `skill_snapshots_userId_fkey` FOREIGN KEY (`userId`) REFERENCES `users`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;
|
|
|
|
-- AddForeignKey
|
|
ALTER TABLE `skill_snapshots` ADD CONSTRAINT `skill_snapshots_tagId_fkey` FOREIGN KEY (`tagId`) REFERENCES `tags`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
|