from datetime import datetime from typing import Optional, Dict, Any, List from pydantic import BaseModel, Field class PipelineStatsSchema(BaseModel): """Pipeline statistics schema""" total_processed: int = 0 success_count: int = 0 error_count: int = 0 last_run: Optional[datetime] = None average_duration_seconds: Optional[float] = None class PipelineBase(BaseModel): """Base pipeline schema""" name: str = Field(..., min_length=1, max_length=100) type: str = Field(..., description="Type: rss_collector, translator, image_generator") config: Dict[str, Any] = Field(default_factory=dict) schedule: Optional[str] = Field(None, description="Cron expression") class PipelineCreate(PipelineBase): """Schema for creating a new pipeline""" pass class PipelineUpdate(BaseModel): """Schema for updating a pipeline (all fields optional)""" name: Optional[str] = Field(None, min_length=1, max_length=100) status: Optional[str] = Field(None, description="Status: running, stopped, error") config: Optional[Dict[str, Any]] = None schedule: Optional[str] = None class PipelineResponse(PipelineBase): """Schema for pipeline response""" id: str = Field(..., alias="_id") status: str stats: PipelineStatsSchema last_run: Optional[datetime] = None next_run: Optional[datetime] = None created_at: datetime updated_at: datetime class Config: populate_by_name = True from_attributes = True class PipelineListResponse(BaseModel): """Schema for pipeline list response""" pipelines: List[PipelineResponse] total: int class PipelineLog(BaseModel): """Schema for pipeline log entry""" timestamp: datetime level: str = Field(..., description="Log level: INFO, WARNING, ERROR") message: str details: Optional[Dict[str, Any]] = None