Files
hyungi_document_server/migrations/206_study_quiz_sessions.sql
Hyungi Ahn 7f4d64c6df feat(study): 문제풀이 세션 + 결과 카드 + 학습완료 체크 (PR-10)
- study_quiz_sessions 테이블 (한 토픽 in_progress 1개 partial unique)
- study_question_attempts 에 quiz_session_id + reviewed_at 컬럼
- 풀이 진행률 서버 단일 진실 (cursor) — 나갔다 와도 이어풀기 가능
- 통합뷰: 진행 중 카드(이어풀기) + 최근 완료 결과 카드(미확인 N건 배지)
- 신규 /quiz-sessions/[sid] 결과 페이지 (3 카테고리 + AI 해설 + 분야 설명 + 학습완료 토글)
- /review 페이지는 풀이만, 마지막 문제 풀이 후 결과 페이지로 redirect
- 마이그레이션 206~209 (single-statement, asyncpg 호환)
- API: POST/GET/PATCH /study-topics/{tid}/quiz-sessions(/{sid}),
       PATCH /study-question-attempts/{aid}/review-mark
- AttemptCreate.quiz_session_id 추가 — submit_attempt 가 같은 트랜잭션에서
  세션 cursor + count 증가, 마지막이면 status='done' + finished_at

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-28 16:49:21 +09:00

27 lines
1.3 KiB
SQL

-- 206_study_quiz_sessions.sql (1/4)
-- PR-10: 문제풀이 세션 기록 + 이어풀기.
-- 한 토픽의 한 회차 풀이 = 한 세션. question_ids 는 출제 순서 스냅샷.
-- 이어풀기: status='in_progress' + cursor (다음 풀 문제 index, 0-based).
-- 결과 카드: status='done' 후 correct/wrong/unsure_count + finished_at.
--
-- status 권장값: in_progress / done / abandoned (강한 enum 미사용).
CREATE TABLE IF NOT EXISTS study_quiz_sessions (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
study_topic_id BIGINT NOT NULL REFERENCES study_topics(id) ON DELETE CASCADE,
target_per_subject INT NOT NULL DEFAULT 20,
subject_filter VARCHAR(120),
wrong_only BOOLEAN NOT NULL DEFAULT FALSE,
question_ids JSONB NOT NULL,
subject_distribution JSONB NOT NULL DEFAULT '{}'::jsonb,
status VARCHAR(20) NOT NULL DEFAULT 'in_progress',
cursor INT NOT NULL DEFAULT 0,
correct_count INT NOT NULL DEFAULT 0,
wrong_count INT NOT NULL DEFAULT 0,
unsure_count INT NOT NULL DEFAULT 0,
finished_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);