백로그
0할 일
0진행 중
0리뷰
0완료 (15일)
2Admin QT 테마 CRUD + 라우트 + 사이드바 + 테스트
## 목표 Admin namespace에 QT 테마 CRUD 구현 ## 구현 항목 ### 1. Admin::QtThemesController (신규) - 파일: `app/controllers/admin/qt_themes_controller.rb` - Admin::BaseController 상속 - 액션: index, show, new, create, edit, update, destroy - index: QtTheme.order(created_at: :desc), 페이지네이션 불필요 (수량 적음) - show: @theme + @theme.qt_contents.order(:day_number) - new/create: QtTheme.new / .build - edit/update: 기본 CRUD - destroy: 연관 콘텐츠 있으면 삭제 경고 - 추가 액션: `toggle_active` (PATCH) - is_active 토글 - 추가 액션: `update_status` (PATCH) - generation_status 변경 - strong params: title, description, is_default, is_active, total_day, is_ai_generated, ai_prompt, bible_books, generation_status ### 2. 라우트 수정 - `config/routes.rb`의 admin namespace에 추가: ```ruby namespace :admin do root "dashboard#index" resources :qt_themes do member do patch :toggle_active patch :update_status end resources :qt_contents end end ``` ### 3. 사이드바 수정 - `app/views/admin/shared/_sidebar.html.erb` - 대시보드 링크와 separator 사이에 QT 테마 메뉴 추가: - "QT 테마 관리" (admin_qt_themes_path) - 책 아이콘 SVG ### 4. 뷰 (신규) - `app/views/admin/qt_themes/index.html.erb`: - 제목 "QT 테마 관리" + "새 테마" 버튼 - shared/_table.html.erb로 목록 (헤더: 제목, 일수, 상태, 활성, 생성일, 액션) - generation_status는 shared/_badge.html.erb로 표시 (draft=info, generating=warning, completed=success, published=success) - is_active는 토글 버튼 - 액션: 보기, 수정, 삭제 링크 - `app/views/admin/qt_themes/show.html.erb`: - 테마 상세 정보 카드 - 콘텐츠 목록 (shared/_table.html.erb) + "콘텐츠 추가" 버튼 - 상태 변경 버튼들 (draft→generating→completed→published) - `app/views/admin/qt_themes/new.html.erb` + `edit.html.erb`: - _form.html.erb 파셜 렌더링 - `app/views/admin/qt_themes/_form.html.erb`: - shared/_input.html.erb 사용: title(required), description(textarea), total_day(number, required), bible_books, ai_prompt - shared/_select.html.erb 사용: generation_status - 체크박스: is_default, is_active, is_ai_generated (Tailwind 스타일 직접 구현) - 제출/취소 버튼 ### 5. 테스트 (신규) - `test/controllers/admin/qt_themes_controller_test.rb` - 테스트 케이스: - admin 로그인 후 테마 목록 조회 (GET /admin/qt_themes) - admin 로그인 후 테마 생성 (POST /admin/qt_themes) - admin 로그인 후 테마 수정 (PATCH /admin/qt_themes/:id) - admin 로그인 후 테마 삭제 (DELETE /admin/qt_themes/:id) - admin 로그인 후 활성화 토글 (PATCH /admin/qt_themes/:id/toggle_active) - admin 로그인 후 상태 변경 (PATCH /admin/qt_themes/:id/update_status) - 일반 사용자 접근 차단 - Fixture: qt_themes(:default_theme), users(:admin) ## 주의사항 - UUID PK (ApplicationRecord의 set_uuid) - ERB 멀티라인 주석 금지 - shared 파셜 strict locals 정확히 준수: - _table: headers:, rows:, empty_message: "데이터가 없습니다." - _badge: text:, variant: :info - _input: form:, field:, label:, type: :text, required: false, hint: nil, placeholder: nil - _select: form:, field:, label:, options:, selected: nil, required: false, include_blank: "선택하세요", hint: nil - _card: variant: :default, padding: :md - _separator: (no locals) - Tailwind CSS v4 의미 기반 색상 사용 - 전체 테스트 통과 확인: bin/rails test
Admin QT 콘텐츠 CRUD + 테스트
## 목표 Admin namespace에 QT 콘텐츠 CRUD 구현 (테마 하위 nested resource) ## 선행 조건 - admin-themes 에이전트가 라우트와 테마 CRUD를 완성한 후 시작 ## 구현 항목 ### 1. Admin::QtContentsController (신규) - 파일: `app/controllers/admin/qt_contents_controller.rb` - Admin::BaseController 상속 - before_action :set_theme (모든 액션) - before_action :set_content (show, edit, update, destroy) - 액션: index, show, new, create, edit, update, destroy - index: @theme.qt_contents.order(:day_number) - show: 콘텐츠 상세 - new: @theme.qt_contents.build(day_number: next_day) - create/update: 기본 CRUD - destroy: 삭제 후 테마 show로 redirect - strong params: day_number, week_number, bible_passage, reading_passage, theme_title, content, questions, difficulty, estimated_minutes, tags, bible_chapter, bible_verse - questions 파라미터 처리: JSON 문자열 → 배열 변환 ### 2. 뷰 (신규) - `app/views/admin/qt_contents/index.html.erb`: - 제목 "[테마명] 콘텐츠 관리" + "콘텐츠 추가" 버튼 + "테마로 돌아가기" 링크 - shared/_table.html.erb로 목록 (헤더: 일차, 주차, 성경구절, 제목, 난이도, 액션) - 난이도는 숫자 (1-5) - `app/views/admin/qt_contents/show.html.erb`: - 콘텐츠 상세 (성경구절, 제목, 본문, 질문, 난이도, 소요시간) - 질문은 번호 매기기 (ol 태그) - 수정/삭제 버튼 - `app/views/admin/qt_contents/new.html.erb` + `edit.html.erb`: - _form.html.erb 파셜 렌더링 - `app/views/admin/qt_contents/_form.html.erb`: - shared/_input 사용: day_number(number, required), week_number(number), bible_passage(required), reading_passage, theme_title(required), content(textarea, required), estimated_minutes(number), tags, bible_chapter(number), bible_verse(number) - shared/_select 사용: difficulty (1-5 선택지) - questions: textarea (JSON 배열 형태, 한 줄에 질문 하나, JS 없이 각 줄을 배열로 변환) - 예시 placeholder: "하나님의 창조 순서에서 무엇을 느꼈나요?\n오늘의 말씀이 나에게 주는 의미는?" - 컨트롤러에서 줄바꿈으로 split하여 배열로 저장 - 제출/취소 버튼 ### 3. 테스트 (신규) - `test/controllers/admin/qt_contents_controller_test.rb` - 테스트 케이스: - admin 로그인 후 콘텐츠 목록 조회 (GET /admin/qt_themes/:theme_id/qt_contents) - admin 로그인 후 콘텐츠 생성 (POST /admin/qt_themes/:theme_id/qt_contents) - admin 로그인 후 콘텐츠 수정 (PATCH /admin/qt_themes/:theme_id/qt_contents/:id) - admin 로그인 후 콘텐츠 삭제 (DELETE /admin/qt_themes/:theme_id/qt_contents/:id) - 일반 사용자 접근 차단 - Fixture: qt_themes(:default_theme), qt_contents(:day_one), users(:admin) - nested URL 패턴: admin_qt_theme_qt_contents_path(qt_themes(:default_theme)) ## 주의사항 - UUID PK (ApplicationRecord의 set_uuid) - ERB 멀티라인 주석 금지 - shared 파셜 strict locals 정확히 준수 - Tailwind CSS v4 의미 기반 색상 사용 - questions JSON 배열 처리: 줄바꿈 split → 배열 변환, 표시 시 배열 → 줄바꿈 join - SQLite JSON 컬럼 주의: JSON.parse 필요할 수 있음 - 전체 테스트 통과 확인: bin/rails test