부모 티켓
2개 티켓

백로그

0
티켓 없음

할 일

0
티켓 없음

진행 중

0
티켓 없음

리뷰

0
티켓 없음

완료 (30일)

2
높음 2baf3ad7
서브 티켓 [P2] AI 기능 - 묵상 분석 + 설교 해석 (coordination)

AI 묵상 분석 - MonthlyAnalysisReport + 서비스 + 컨트롤러 + 뷰

## 목표 AI를 활용한 월별 묵상 패턴 분석 및 리포트 생성 ## 구현 항목 ### 1. 마이그레이션 - MonthlyAnalysisReport: user_id(uuid FK), year(integer), month(integer), analysis_report(json), data_summary(json), status(string, default: "pending") - unique index: [user_id, year, month] - 타임스탬프: 20260302150000 ### 2. 모델 - MonthlyAnalysisReport - belongs_to :user - validates year, month, uniqueness scope - enum status: pending/analyzing/completed/failed - scope :recent, :for_month ### 3. User 모델 - has_many :monthly_analysis_reports, dependent: :destroy 추가 ### 4. 서비스 객체 - app/services/ai_meditation_analyzer.rb - initialize(user, year, month) - call: 월별 묵상 데이터 수집 → 프롬프트 구성 → OpenAI API 호출 → 결과 파싱/저장 - 프롬프트: 한국어, 묵상 패턴 분석, 성장 포인트, 추천사항 - API 키: ENV["OPENAI_API_KEY"] 또는 ENV["GEMINI_API_KEY"] - OpenAI client: OpenAI::Client.new (ruby-openai gem) - 에러 처리: API 실패 시 status를 failed로 변경 ### 5. 컨트롤러 - MeditationReportsController - index: 리포트 목록 (최근순) - show: 리포트 상세 - create: 월별 리포트 생성 요청 (year, month 파라미터) ### 6. 뷰 - meditation_reports/index.html.erb: 리포트 카드 목록 + 생성 버튼 - meditation_reports/show.html.erb: 분석 결과 표시 (카드 레이아웃) - 기존 shared 파셜 활용: _card, _badge, _separator, _button 등 ### 7. 라우트 - config/routes.rb에 추가: ```ruby resources :meditation_reports, only: [:index, :show, :create] ``` - 기존 라우트 구조 유지, `# AI Reports` 주석과 함께 stats/records 근처에 배치 ### 8. 테스트 - test/models/monthly_analysis_report_test.rb - test/controllers/meditation_reports_controller_test.rb - test/fixtures/monthly_analysis_reports.yml (과거 날짜 사용!) - API 호출은 stub으로 처리 ## 주의사항 - UUID PK 사용 (ApplicationRecord의 set_uuid 자동 처리) - fixture 날짜는 과거 고정 날짜 사용 (Date.current 충돌 방지) - shared 파셜의 strict locals 준수 - ERB 멀티라인 주석 사용 금지 (각 줄 단일 라인 주석) - 전체 테스트 통과 확인: bin/rails test

A
ai-meditation-dev
9 days
높음 8ba3eeec
서브 티켓 [P2] AI 기능 - 묵상 분석 + 설교 해석 (coordination)

AI 설교 해석 - 서비스 + interpret 액션 + Turbo Stream

## 목표 설교 노트에서 성경 구절 AI 해석 기능 추가 ## 구현 항목 ### 1. 서비스 객체 - app/services/ai_sermon_interpreter.rb - initialize(sermon_note) - call: 설교 정보로 프롬프트 구성 → OpenAI API 호출 → 해석 결과 반환 - 프롬프트: 한국어, 성경 구절(passage_reference), 설교 제목, 개인 묵상 기반 - 성경 구절 해석 + 적용 포인트 + 핵심 메시지 정리 - API 키: ENV["OPENAI_API_KEY"] 또는 ENV["GEMINI_API_KEY"] - OpenAI client: OpenAI::Client.new (ruby-openai gem) - 에러 처리: API 실패 시 에러 메시지 반환 ### 2. 컨트롤러 수정 - SermonsController에 interpret 액션 추가: ```ruby def interpret @sermon = current_user.sermon_notes.find(params[:id]) service = AiSermonInterpreter.new(@sermon) result = service.call if result[:success] @sermon.update(ai_interpretation: result[:interpretation]) respond_to do |format| format.turbo_stream format.html { redirect_to sermon_path(@sermon) } end else respond_to do |format| format.turbo_stream { render turbo_stream: turbo_stream.replace("ai-interpretation", partial: "sermons/ai_error", locals: { error: result[:error] }) } format.html { redirect_to sermon_path(@sermon), alert: result[:error] } end end end ``` - before_action :set_sermon에 :interpret 추가 ### 3. 뷰 수정 - sermons/show.html.erb 수정: - AI 해석 섹션에 turbo_frame_tag "ai-interpretation" 추가 - ai_interpretation이 없으면 "AI 해석 요청" 버튼 표시 - ai_interpretation이 있으면 내용 표시 + "재해석" 버튼 - sermons/interpret.turbo_stream.erb: AI 해석 결과 turbo_stream replace - sermons/_ai_interpretation.html.erb: AI 해석 결과 파셜 - sermons/_ai_error.html.erb: 에러 표시 파셜 ### 4. 라우트 수정 - config/routes.rb에서 기존 sermons 리소스에 멤버 라우트 추가: ```ruby resources :sermons do member do post :interpret end end ``` ### 5. 테스트 - test/controllers/sermons_controller_test.rb에 interpret 테스트 추가: - POST /sermons/:id/interpret 인증 필수 - POST /sermons/:id/interpret AI 호출 성공 시 결과 저장 - POST /sermons/:id/interpret AI 호출 실패 시 에러 처리 - POST /sermons/:id/interpret 타인 설교 접근 불가 - API 호출은 stub으로 처리 ## 기존 코드 참고 - sermon_notes 테이블에 ai_interpretation 컬럼 이미 존재 - sermons/show.html.erb 64-71줄에 AI 해석 표시 코드 이미 존재 - sermons_controller.rb의 sermon_params에 :ai_interpretation 이미 포함 - SermonsController의 set_sermon: `current_user.sermon_notes.find(params[:id])` ## 주의사항 - 기존 sermons 테스트가 깨지지 않게 주의 - fixture 날짜는 과거 고정 날짜 사용 (Date.current 충돌 방지) - shared 파셜의 strict locals 준수 - ERB 멀티라인 주석 사용 금지 - 전체 테스트 통과 확인: bin/rails test

A
ai-sermon-dev
9 days