QT 플랜(세션) 관리: 생성/참여/탈퇴/선택

ID: 701354b3-848e-4e59-b598-333cf108bd2d

높음 완료

## 목표
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

첨부 이미지

이미지 추가 (Ctrl+V로 붙여넣기 또는 클릭)

JPEG, PNG, GIF, WebP / 최대 10MB

담당자: session-dev
생성일: 2026년 03월 02일 01:15

활동 로그

  • 팀리드 상태 변경: 리뷰 → 완료

    2026년 03월 02일 01:40:31

  • S
    session-dev 상태 변경: 진행 중 → 리뷰

    2026년 03월 02일 01:33:49

  • S
    session-dev QT 세션 관리 기능 구현 완료 - 전체 테스트 통과

    2026년 03월 02일 01:33:48

    상세 보기

    ## 구현 완료 내용

    ### 수정/생성 파일
    - `app/models/user_setting.rb` - `belongs_to :current_session` 추가
    - `app/controllers/qt/sessions_controller.rb` - 신규 (index/new/create/show/invite/join/leave/select)
    - `config/routes.rb` - qt namespace 라우트 전체 설정 (sessions + meditations)
    - `app/views/qt/sessions/index.html.erb` - 세션 목록 (탭 + 초대코드 입력)
    - `app/views/qt/sessions/new.html.erb` - 플랜 생성 폼
    - `app/views/qt/sessions/show.html.erb` - 세션 상세 (참여자 목록, 초대코드)
    - `app/views/qt/sessions/invite.html.erb` - 초대 페이지
    - `app/views/qt/sessions/_session_card.html.erb` - 세션 카드 파셜
    - `app/javascript/controllers/session_form_controller.js` - 날짜 자동계산 Stimulus
    - `app/views/shared/_input.html.erb` - `:date` 타입 지원 추가
    - `test/controllers/qt/sessions_controller_test.rb` - 14개 테스트 케이스
    - `test/test_helper.rb` - Devise::Test::IntegrationHelpers 추가

    ### 테스트 결과
    - 전체: 129 runs, 294 assertions, 0 failures, 0 errors
    - bin/ci quick 통과

    ### 구현 기능
    1. 세션 목록 (활성/전체 탭)
    2. 새 플랜 생성 (테마 선택 + 날짜)
    3. 초대코드 입력으로 참여
    4. 초대 링크 페이지
    5. 세션 탈퇴 (creator 탈퇴 불가)
    6. 세션 선택 (current_session 전환)

  • S
    session-dev QT 세션 관리 작업 시작

    2026년 03월 02일 01:21:06

    상세 보기

    ## 작업 범위
    - UserSetting에 current_session_id 추가
    - Qt::SessionsController 구현
    - 라우트 설정
    - 뷰 파일 생성
    - 테스트 작성 (TDD)

  • S
    session-dev 티켓 클레임 완료

    2026년 03월 02일 01:20:59