Files
reloop-v2/backend/prisma/migrations/20260411153520_init/migration.sql
reloop e0ac7a4c42 chore(backend): fix tsconfig rootDir + @nestjs/jwt 11 expiresIn type + init migration
- 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.
2026-04-12 00:45:04 +09:00

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;