[P1-1] QT 세션 edit/update + 세션 스위처 + 빈 상태

ID: 82f97aa8-0fda-4e59-87b1-8b38b4e77393

높음 완료

## 목표
3가지 QT 세션 관련 기능을 구현합니다.

### 작업 1: QT 세션 수정/편집 (edit/update)

현재 `config/routes.rb`에서 sessions는 `only: [:index, :new, :create, :show]`만 있습니다.

1. **라우트 수정**: `config/routes.rb`에서 sessions에 `:edit, :update` 추가
2. **컨트롤러**: `app/controllers/qt/sessions_controller.rb`에 edit, update 액션 추가
- `edit`: set_session으로 세션 로드, @themes = QtTheme.active
- `update`: session_params로 업데이트, creator만 수정 가능
- 권한 체크: `@session.creator_id != current_user.id` → redirect with alert
3. **뷰**: `app/views/qt/sessions/new.html.erb`의 폼을 `_form.html.erb` 파셜로 추출
- new.html.erb와 edit.html.erb 모두 _form 사용
- edit.html.erb 제목: "플랜 수정"
4. **show 페이지**: creator에게만 "수정" 버튼 표시 (shared/_button 파셜 사용)
5. **테스트**: `test/controllers/qt/sessions_controller_test.rb`에 추가
- test_edit_session, test_update_session_valid
- test_update_non_creator_redirects (권한 체크)
- test_update_invalid_params

### 작업 2: QT 세션 스위처 UI

QT today 페이지(qt_controller.rb의 today 액션) 상단에 현재 참여 중인 세션 목록 드롭다운 추가.

1. 먼저 `app/controllers/qt_controller.rb`를 읽어서 today 액션과 뷰 위치 확인
2. today 뷰 상단에 세션 스위처 드롭다운 추가:
- `current_user.qt_sessions.active.includes(:qt_theme)` 목록
- 현재 세션 표시 (user_setting.current_session_id)
- 세션 선택 시 `POST /qt/sessions/:id/select`로 전환 후 리다이렉트
3. Stimulus 컨트롤러로 드롭다운 토글 (기존 dropdown controller가 있으면 재사용)

### 작업 3: QT 빈 상태 안내

참여 세션이 0개인 사용자가 /qt/today 접속 시 안내 화면.

1. today 뷰에서 `@session.nil?` 체크
2. shared/_empty_state 파셜 활용:
```erb
<%= render "shared/empty_state",
title: "참여 중인 플랜이 없습니다",
description: "테마를 둘러보고 묵상 플랜을 시작하세요",
action_text: "테마 둘러보기",
action_path: qt_themes_path %>
```
3. 참고: qt_themes_path는 theme-dev가 생성할 예정 → 임시로 qt_sessions_path 사용 가능

## 파일 범위 (이 에이전트만 수정)
- app/controllers/qt/sessions_controller.rb
- app/controllers/qt_controller.rb (today 뷰에 스위처/빈상태 추가)
- app/views/qt/sessions/ (new, edit, show, _form, _session_card)
- app/views/qt/ (today 관련 뷰)
- config/routes.rb (sessions only 수정)
- test/controllers/qt/sessions_controller_test.rb

## 수정 금지 파일
- app/models/ (theme-dev 영역)
- app/controllers/qt/themes_controller.rb (theme-dev 영역)
- db/migrate/ (schema-dev 영역)

## 완료 기준
- edit/update 동작 + 권한 체크
- 세션 스위처 드롭다운 동작
- 빈 상태 안내 표시
- 전체 테스트 통과

첨부 이미지

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

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

담당자: session-dev
생성일: 2026년 03월 02일 12:17

활동 로그

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

    2026년 03월 03일 05:21:28

  • S
    session-dev 상태 변경: 할 일 → 리뷰

    2026년 03월 02일 12:26:05

  • S
    session-dev QT 세션 기능 3가지 구현 완료

    2026년 03월 02일 12:26:01

    상세 보기

    ## 구현 완료 사항

    ### 1. QT 세션 edit/update
    - `config/routes.rb`: sessions에 `:edit, :update` 추가
    - `app/controllers/qt/sessions_controller.rb`:
    - `before_action :set_session`에 `:edit, :update` 추가
    - `edit` 액션: creator 권한 체크, @themes 로드
    - `update` 액션: creator 권한 체크, 성공 시 redirect, 실패 시 422
    - `app/views/qt/sessions/_form.html.erb`: new.html.erb에서 폼 파셜 추출 (재사용 가능)
    - `app/views/qt/sessions/new.html.erb`: _form 파셜 렌더링으로 교체
    - `app/views/qt/sessions/edit.html.erb`: 신규 생성, "플랜 수정" 제목
    - `app/views/qt/sessions/show.html.erb`: creator일 때 "수정" 버튼 추가

    ### 2. QT 세션 스위처 UI
    - `app/controllers/qt_controller.rb`: today/day 액션에 `@user_sessions` 추가
    - `app/views/qt/today.html.erb`: 상단에 dropdown_controller 활용한 세션 스위처
    - 현재 세션 하이라이트 (체크 아이콘)
    - 다른 세션 클릭 시 POST /qt/sessions/:id/select로 전환
    - 1개만 있을 때는 스위처 숨김

    ### 3. QT 빈 상태 안내
    - `app/views/qt/no_session.html.erb`: 메시지 업데이트
    - title: "참여 중인 플랜이 없습니다"
    - description: 테마 둘러보기 + 초대코드 안내
    - action: "플랜 둘러보기" → qt_sessions_path

    ### 테스트 (5개 추가)
    - `test_edit_renders_form_for_creator` ✅
    - `test_edit_redirects_non-creator` ✅
    - `test_update_session_with_valid_params` ✅
    - `test_update_non-creator_redirects` ✅
    - `test_update_with_invalid_params_renders_edit` ✅

    > ⚠️ SQLite DB 잠금 이슈: 다른 에이전트와 동시 테스트 실행 시 BusyException 발생. 단독 실행 시 모든 테스트 통과.

  • S
    session-dev QT 세션 기능 구현 작업 시작

    2026년 03월 02일 12:19:34

    상세 보기

    ## 작업 범위
    1. QT 세션 edit/update 액션 구현
    2. QT 세션 스위처 UI
    3. QT 빈 상태 안내

    ## 시작 단계
    - 기존 코드 구조 파악
    - routes.rb, sessions_controller, views 확인