백로그
0할 일
0진행 중
0리뷰
0완료 (15일)
3QT 메인 페이지 + 묵상 기록 CRUD
## 목표 QT 메인 페이지(오늘의 QT)와 묵상 기록 저장/조회 기능을 구현합니다. ## 작업 범위 ### 1. UserMeditation 모델 + 마이그레이션 ```ruby create_table :user_meditations, id: :uuid do |t| t.references :user, type: :uuid, null: false, foreign_key: true t.references :qt_content, type: :uuid, null: false, foreign_key: true t.date :meditation_date, null: false t.text :personal_meditation t.text :action_plan t.text :prayer_topic t.integer :mood_before # 1-5 t.integer :mood_after # 1-5 t.integer :completion_minutes t.boolean :is_tongtok_completed, default: false t.boolean :is_personal_meditation_shared, default: false t.boolean :is_action_plan_shared, default: false t.boolean :is_prayer_topic_shared, default: false t.json :highlights t.integer :bible_chapter t.integer :bible_verse t.timestamps end add_index :user_meditations, [:user_id, :qt_content_id], unique: true ``` - User has_many :user_meditations - QtContent has_many :user_meditations ### 2. QtController - `today` 액션: 현재 세션 기준 오늘의 QT 콘텐츠 조회 - current_user.current_session_id 또는 user_setting.current_session_id로 세션 찾기 - 세션의 start_date와 오늘 날짜 차이로 day_number 계산 - 해당 day_number의 qt_content 조회 - 기존 묵상 기록이 있으면 함께 로드 - `day` 액션: params[:day]로 특정 일차 QT 조회 ### 3. MeditationsController - `create`: 묵상 기록 생성 (Turbo Stream 응답) - `update`: 기존 묵상 수정 (Turbo Stream 응답) - 자동 저장: Stimulus debounce + Turbo Stream ### 4. QT 뷰 - app/views/qt/today.html.erb: QT 메인 페이지 - 성경 구절 표시 (bible_passage) - 테마 제목 (theme_title) - 본문 내용 (content) - 질문 5개 표시 (questions JSON array) - 일차 네비게이션 (이전/다음 버튼) - 묵상 기록 폼 (Turbo Frame) - 세션 미참여 시 안내 메시지 - app/views/qt/_meditation_form.html.erb: 묵상 폼 파셜 - 개인 묵상 textarea - 실천 계획 textarea - 기도 제목 textarea - 기분 선택 (mood_before/after) 1-5 이모지/스타 - 통독 완료 체크박스 - 공유 설정 토글 - 저장 버튼 - app/views/qt/_no_session.html.erb: 세션 미참여 안내 ### 5. 라우팅 config/routes.rb에 추가 (authenticated 블록 내): ```ruby get "qt", to: "qt#today" get "qt/day", to: "qt#day" resources :meditations, only: [:create, :update] ``` ### 6. 테스트 - test/models/user_meditation_test.rb - test/controllers/qt_controller_test.rb - test/controllers/meditations_controller_test.rb ## 스타일 - 디자인 시스템 파셜 활용 (shared/card, shared/button, shared/input, shared/tabs 등) - Tailwind CSS, 모바일 우선, 다크모드 지원 ## 참고 - docs/migration/index.md §2-2 user_meditations 스키마 - docs/migration/index.md §3-2 QT 기능 목록 Q1-Q3
QT 플랜(세션) 관리: 생성/참여/탈퇴/선택
## 목표 QT 세션(플랜) 생성, 참여, 탈퇴, 선택 기능을 구현합니다. ## 기존 모델 (이미 생성됨) - QtSession: title, theme_id, creator_id, start_date, end_date, total_days, is_public, invite_code(unique), status(enum: active/completed/cancelled) - QtParticipant: session_id, user_id, role(enum: creator/member), is_active, joined_at - QtTheme: title, description, total_day, is_active 등 - User: current_session_id 컬럼 있음 ## 작업 범위 ### 1. Qt::SessionsController - `index`: 내 세션 목록 (활성/완료 분류) - `new`: 새 세션 생성 폼 (테마 선택 + 시작일) - `create`: 세션 생성 + 참여자(creator) 자동 추가 + current_session_id 설정 - `show`: 세션 상세 (멤버 목록, 통계 등) - `edit`/`update`: 세션 수정 (소유자만) - `join`: 초대코드로 참여 (POST) - `leave`: 세션 탈퇴 (DELETE) - `select`: 현재 활성 세션 변경 (POST) → user.current_session_id 업데이트 ### 2. 초대 참여 페이지 - GET /qt/join?code=XXXX → 세션 정보 표시 + 참여 버튼 - 이미 참여 중이면 안내 메시지 ### 3. 뷰 - app/views/qt/sessions/index.html.erb: 세션 목록 (활성/완료 탭) - app/views/qt/sessions/new.html.erb: 생성 폼 (테마 선택 드롭다운 + 시작일 date input) - app/views/qt/sessions/show.html.erb: 세션 상세 (초대코드, 멤버, 통계) - app/views/qt/sessions/edit.html.erb: 수정 폼 - app/views/qt/sessions/join.html.erb: 초대 참여 페이지 - 공통 파셜: _session_card.html.erb (세션 요약 카드) ### 4. 라우팅 config/routes.rb에 추가: ```ruby namespace :qt do resources :sessions do member do post :select delete :leave end collection do get :join post :join, action: :process_join end end end ``` ### 5. 비즈니스 로직 - 세션 생성 시: total_days = theme.total_day, end_date = start_date + total_days - 초대코드: QtSession 모델에 이미 자동생성 로직 있음 - 참여 시: QtParticipant 생성 (role: :member) + is_active: true + joined_at: Time.current - 탈퇴 시: QtParticipant.is_active = false (soft delete) - 세션 선택: User.current_session_id 업데이트 ### 6. 테스트 - test/controllers/qt/sessions_controller_test.rb (CRUD + join/leave/select) - fixture에 테스트 세션/참여자 데이터 ## 스타일 - 디자인 시스템 파셜 활용 (shared/card, shared/button, shared/input, shared/badge, shared/tabs 등) - Tailwind CSS, 모바일 우선, 다크모드 지원 ## 참고 - QtSession 모델: app/models/qt_session.rb 참조 - QtParticipant 모델: app/models/qt_participant.rb 참조 - docs/migration/index.md §3-2 기능 Q6-Q12, Q21
QT 시드 데이터: 레거시 import + db:seed
## 목표 QT 테마/콘텐츠 시드 데이터를 생성하고, 레거시 import rake task를 작성합니다. ## 작업 범위 ### 1. 레거시 데이터 확인 - /mnt/c/dev/logbible/sql/ 디렉토리에서 SQL insert 파일 확인 - 테마와 콘텐츠 데이터 구조 파악 - 사용 가능한 데이터가 없으면 샘플 데이터 직접 생성 ### 2. db/seeds.rb 기본 시드 최소한 아래 데이터를 포함: - 기본 QT 테마 1-2개 (is_default: true) - 각 테마에 7-14일치 콘텐츠 - 콘텐츠 형식: ``` day_number: 1 bible_passage: "창세기 1:1-31" theme_title: "천지 창조" content: "하나님이 천지를 창조하시니라..." questions: ["배경 설명", "핵심 메시지", "성찰 질문 1", "성찰 질문 2", "위로와 격려"] difficulty: 3 ``` - 테스트용 사용자 1명 (admin) - 테스트용 QT 세션 1개 - 테스트용 참여자 1명 ### 3. lib/tasks/import_legacy.rake ```ruby namespace :import do desc "Import QT themes and contents from legacy SQL/JSON" task qt_data: :environment do # 레거시 SQL 또는 JSON 파일에서 데이터 읽기 # QtTheme, QtContent 모델로 import # UUID 보존 (기존 ID 유지) end end ``` ### 4. 레거시 데이터 변환 - SQL INSERT 문 파싱 → Ruby 해시 변환 - 또는 Supabase REST API 호출 스크립트 - JSON 중간 파일 생성 (db/seed_data/*.json) ### 5. 테스트 - test/tasks/import_legacy_test.rb (rake task 실행 테스트) - 또는 seeds 실행 후 데이터 검증 ## 기존 모델 (참고) - QtTheme: title, description, is_default, is_active, total_day, user_id(nullable) - QtContent: qt_theme_id, day_number, bible_passage, theme_title, content, questions(JSON), difficulty - User: email, nickname, role(enum) - QtSession: title, qt_theme_id, creator_id, start_date, end_date, total_days, invite_code ## 중요 사항 - DB 마이그레이션은 건드리지 마세요 (모델은 이미 있음) - Gemfile은 수정하지 마세요 - config/routes.rb는 수정하지 마세요 - 성경 데이터는 한국어로 작성 ## 참고 - 레거시 경로: /mnt/c/dev/logbible - docs/migration/index.md §10 데이터 마이그레이션 전략