부모 티켓
1개 티켓

백로그

0
티켓 없음

할 일

0
티켓 없음

진행 중

0
티켓 없음

리뷰

1
높음 f2beadc8
서브 티켓 [P3] Idea Analysis 비동기 처리 (Solid Queue + Turbo Stream)

Idea Analysis 비동기 처리 — Ai::AnalyzeIdeaJob + Build::IdeaAnalysesController + Turbo Stream + 테스트

## 목표 PRD Section 12.2 기반 Ai::AnalyzeIdeaJob + Build::IdeaAnalysesController 구현. 비동기 AI 분석 + Turbo Stream 실시간 갱신. ## 현재 상태 - Ai::IdeaAnalyzerService 구현 완료 (app/services/ai/idea_analyzer_service.rb) - Build::IdeaAnalysesController 스텁 존재 (show, create) - Build::ProjectsController 구현 완료 - 라우트: `resources :projects do resource :idea_analysis, only: [:show, :create] end` - Solid Queue 설정 완료 (Gemfile에 solid_queue 포함) ## PRD 코드 (Section 12.2) ```ruby class Ai::AnalyzeIdeaJob < ApplicationJob queue_as :ai_processing def perform(project_id) project = Project.find(project_id) Ai::IdeaAnalyzerService.new( project: project, user: project.user ).call Turbo::StreamsChannel.broadcast_update_to( "project_#{project_id}", target: "idea_analysis_result", partial: "build/idea_analyses/result", locals: { project: project } ) rescue => e Rails.logger.error("AnalyzeIdeaJob failed: #{e.message}") raise end end ``` ## 구현 사항 ### 1. app/jobs/ai/analyze_idea_job.rb - PRD 코드 기반 (Sentry 대신 Rails.logger.error) - queue_as :ai_processing - 성공 시 Turbo Stream broadcast ### 2. Build::IdeaAnalysesController ```ruby class Build::IdeaAnalysesController < ApplicationController before_action :set_project before_action :authorize_owner! def show # 분석 결과 표시 (또는 분석 전이면 "분석하기" 버튼) end def create # Job 큐잉 Ai::AnalyzeIdeaJob.perform_later(@project.id) redirect_to build_project_idea_analysis_path(@project), notice: "AI 분석을 시작했습니다. 잠시 후 결과가 표시됩니다." # 또는 Turbo Stream으로 로딩 UI 표시 end private def set_project @project = Project.find(params[:project_id]) end def authorize_owner! redirect_to build_projects_path, alert: I18n.t("errors.messages.not_authorized") unless @project.user == Current.user end end ``` ### 3. 뷰 **build/idea_analyses/show.html.erb**: - 분석 결과가 있으면: one_line_definition, core_features, target_customer, revenue_model, competitor_analysis 표시 - 분석 전이면: "아이디어 분석하기" 버튼 - turbo_stream_from "project_#{@project.id}" — 실시간 갱신 수신 - id="idea_analysis_result" div — Turbo Stream 업데이트 타겟 **build/idea_analyses/_result.html.erb** (partial): - 분석 결과 카드 (one_line_definition, core_features 리스트, target_customer, revenue_model, competitor_analysis) - "재분석" 버튼 **로딩 UI**: - 분석 중일 때 스피너/로딩 상태 표시 - Turbo Stream이 result를 업데이트하면 로딩 → 결과로 전환 ### 4. 다크 테마 - bg-bg, bg-surface, text-text-primary, bg-accent 토큰 사용 - 기존 Partial 활용 (_button, _card) ### ⚠️ 주의 - build/idea_analyses/ 범위만 수정 (developer-1은 learn/ 작업 중) - Project, User 모델 건드리지 않기 - Turbo Stream broadcast: `turbo_stream_from` 헬퍼 사용 - Solid Queue가 development에서 inline 실행될 수 있음 — perform_later 사용 - 한국어 Flash/UI 텍스트 ### 테스트 (TDD) - Build::IdeaAnalysesController: show(인증, 소유자 확인), create(Job 큐잉 확인) - Ai::AnalyzeIdeaJob: perform 시 서비스 호출 + broadcast 확인 (mock) - 인증/소유자 접근 제어 ### 완료 기준 - "분석하기" 버튼 → Job 큐잉 - 분석 결과 표시 - Turbo Stream 실시간 갱신 - 재분석 가능 - bin/rails test 전체 통과

D
developer-2
25 days

완료 (전체)

0
티켓 없음