Files
reloop-v2/backend/prisma/migrations/20260411161837_bm_and_problemsets/migration.sql
reloop 871ca89da0 feat(phase6): BM tiers + Landing + Pricing + 평가원 기출 ProblemSet — tracks 2/4
트랙 2 — BM / Landing / Pricing
- schema.prisma: SubscriptionTier enum(free/pro/school) + User.subscriptionTier
  + User.subscriptionUntil. Migration 20260411161837_bm_and_problemsets.
- auth.service.ts / me.service.ts safeUser/toView 에 구독 필드 포함.
- frontend/lib/api.ts MeUser 에 subscriptionTier/subscriptionUntil 추가.
- app/page.tsx 전면 재작성: 토큰 있으면 /dashboard, 없으면 비로그인 Landing
  (히어로 + 왜 ReLoop 3카드 + 페르소나 4장 + 4단계 루프 + 가격 티저 +
  FAQ 4개 + footer).
- app/pricing/page.tsx 신규: Free/Pro/School 3 티어 카드(Pro 강조 PopBadge),
  월/년 cycle 토글, 기능 비교 테이블(데스크탑 전용), FAQ 5개, 바닥 CTA.
  Pro ₩7,900/월, 연간 ₩79,000(2개월 무료), School ₩20,000/월·30시트.
- app/profile/page.tsx: 구독 섹션 + 티어 배지 + pricing 으로 가는 업그레이드
  버튼.

트랙 4 — 평가원 기출 ProblemSet 데모
- schema.prisma: ProblemSet + Problem 신규 모델. StudyLog.problemId
  (optional, SetNull). 각 ProblemSet 은 (year, examType, subjectName)
  복합 unique.
- prisma/seed.ts: 2024학년도 수능 수학 샘플 10 문항 (1/5/8/11/13/15/20/22/
  28/30번) 대략치 난이도+정답률로 upsert. 실제 KICE 수치로 교체 가능하도록
  주석 명시.
- backend/src/problem-sets/: ProblemSetsModule + Service + Controller.
  GET /api/problem-sets (list, subject/year 필터) + GET /api/problem-sets/:id
  (문제 배열 포함). JwtAuthGuard 적용.
- study-logs.service/controller: problemId optional 필드 수용.
- frontend/lib/api.ts: ProblemSetSummary/ProblemSetDetail/Problem 타입.
- frontend/app/study/page.tsx 재설계: 상단 탭 [직접 입력 | 문제집에서 가져오기].
  문제집 탭은 set 드롭다운 + 문제 리스트 클릭 → title/difficulty/baseCorrectRate
  자동 채움 + subjectName 매핑으로 사용자 과목 자동 선택 + topic 을 tag
  이름과 매칭. 결과/메모/시간만 수동 입력.
2026-04-12 01:26:35 +09:00

46 lines
1.7 KiB
SQL

-- AlterTable
ALTER TABLE `study_logs` ADD COLUMN `problemId` INTEGER NULL;
-- AlterTable
ALTER TABLE `users` ADD COLUMN `subscriptionTier` ENUM('free', 'pro', 'school') NOT NULL DEFAULT 'free',
ADD COLUMN `subscriptionUntil` DATETIME(3) NULL;
-- CreateTable
CREATE TABLE `problem_sets` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`title` VARCHAR(191) NOT NULL,
`examType` VARCHAR(191) NOT NULL,
`year` INTEGER NOT NULL,
`subjectName` VARCHAR(191) NOT NULL,
`sourceUrl` VARCHAR(191) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
UNIQUE INDEX `problem_sets_year_examType_subjectName_key`(`year`, `examType`, `subjectName`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `problems` (
`id` INTEGER NOT NULL AUTO_INCREMENT,
`problemSetId` INTEGER NOT NULL,
`number` INTEGER NOT NULL,
`title` VARCHAR(191) NOT NULL,
`difficulty` DOUBLE NOT NULL,
`baseCorrectRate` DOUBLE NULL,
`topic` VARCHAR(191) NULL,
`createdAt` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
INDEX `problems_problemSetId_idx`(`problemSetId`),
UNIQUE INDEX `problems_problemSetId_number_key`(`problemSetId`, `number`),
PRIMARY KEY (`id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateIndex
CREATE INDEX `study_logs_problemId_idx` ON `study_logs`(`problemId`);
-- AddForeignKey
ALTER TABLE `study_logs` ADD CONSTRAINT `study_logs_problemId_fkey` FOREIGN KEY (`problemId`) REFERENCES `problems`(`id`) ON DELETE SET NULL ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `problems` ADD CONSTRAINT `problems_problemSetId_fkey` FOREIGN KEY (`problemSetId`) REFERENCES `problem_sets`(`id`) ON DELETE CASCADE ON UPDATE CASCADE;