Commit Graph

7 Commits

Author SHA1 Message Date
reloop
e3cdfd9881 feat(exam): image-only display + OMR bubbles + passage images — 7I.4a 2026-04-12 14:14:26 +09:00
reloop
4c61b87052 feat(data): chosenAnswer + solve route + profile tabs — 7I.2 2026-04-12 13:35:39 +09:00
reloop
acc35e9284 feat(parse): math + image-based problem pipeline — 7H.1 2026-04-12 08:06:54 +09:00
reloop
a5dab35618 feat(profile): avatar upload + onboarding wizard + mobile dropdown — 7G.6 2026-04-12 07:48:55 +09:00
reloop
e2e3e4bd6f feat(prisma): kice text fields + Passage model — 7A.1
- ProblemSet.audioUrls Json? (영어 듣기 mp3 배열)
- Problem 에 bodyText/choices/answerNumber/passageId/needsReview 추가
- Problem @@index([passageId]) 로 역방향 조회 보장
- 신규 Passage 모델 (공통 지문 [N~M] 분리용)
- examRound 추가 거부 — 기존 examType 이 이미 'sat'|'mock-june'|'mock-sept'|'academy' 커버
- .gitignore 에 data/kice/ (저작권 자료)

migration: 20260411183246_kice_text_fields
shadow DB INDEX 권한 이슈는 mariadb 에서 GRANT 로 해결
2026-04-12 03:32:59 +09:00
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
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