""" Queue Models for AI Writer Service Redis 큐에서 사용할 데이터 모델 정의 """ from pydantic import BaseModel, Field from typing import Optional, List, Dict, Any from datetime import datetime from enum import Enum class JobStatus(str, Enum): """작업 상태""" PENDING = "pending" PROCESSING = "processing" COMPLETED = "completed" FAILED = "failed" SKIPPED = "skipped" class NewsJobData(BaseModel): """큐에 들어갈 뉴스 작업 데이터""" job_id: str = Field(..., description="작업 고유 ID") keyword: str = Field(..., description="원본 검색 키워드") rss_title: str = Field(..., description="RSS 제목") rss_link: Optional[str] = Field(None, description="RSS 링크") rss_published: Optional[str] = Field(None, description="RSS 발행일") google_results: List[Dict[str, Any]] = Field(default_factory=list, description="구글 검색 결과") style: str = Field("professional", description="기사 스타일") created_at: datetime = Field(default_factory=datetime.now, description="작업 생성 시간") priority: int = Field(0, description="우선순위 (높을수록 우선)") retry_count: int = Field(0, description="재시도 횟수") max_retries: int = Field(3, description="최대 재시도 횟수") class JobResult(BaseModel): """작업 결과""" job_id: str = Field(..., description="작업 고유 ID") status: JobStatus = Field(..., description="작업 상태") article_id: Optional[str] = Field(None, description="생성된 기사 ID") error_message: Optional[str] = Field(None, description="에러 메시지") processing_time: Optional[float] = Field(None, description="처리 시간(초)") completed_at: Optional[datetime] = Field(None, description="완료 시간") class QueueStats(BaseModel): """큐 통계""" pending_jobs: int = Field(..., description="대기 중인 작업 수") processing_jobs: int = Field(..., description="처리 중인 작업 수") completed_jobs: int = Field(..., description="완료된 작업 수") failed_jobs: int = Field(..., description="실패한 작업 수") total_jobs: int = Field(..., description="전체 작업 수") workers_active: int = Field(..., description="활성 워커 수") average_processing_time: Optional[float] = Field(None, description="평균 처리 시간(초)")