from datetime import datetime from typing import Optional, Dict, Any, List from pydantic import BaseModel, Field class KeywordBase(BaseModel): """Base keyword schema""" keyword: str = Field(..., min_length=1, max_length=200) category: str = Field(..., description="Category: people, topics, companies") pipeline_type: str = Field(default="all", description="Pipeline type: rss, translation, all") priority: int = Field(default=5, ge=1, le=10) metadata: Dict[str, Any] = Field(default_factory=dict) class KeywordCreate(KeywordBase): """Schema for creating a new keyword""" pass class KeywordUpdate(BaseModel): """Schema for updating a keyword (all fields optional)""" keyword: Optional[str] = Field(None, min_length=1, max_length=200) category: Optional[str] = None status: Optional[str] = Field(None, description="Status: active, inactive") pipeline_type: Optional[str] = None priority: Optional[int] = Field(None, ge=1, le=10) metadata: Optional[Dict[str, Any]] = None class KeywordResponse(KeywordBase): """Schema for keyword response""" id: str = Field(..., alias="_id") status: str created_at: datetime updated_at: datetime created_by: Optional[str] = None class Config: populate_by_name = True from_attributes = True class KeywordStats(BaseModel): """Keyword statistics""" total_articles: int = 0 articles_last_24h: int = 0 articles_last_7d: int = 0 last_article_date: Optional[datetime] = None class KeywordListResponse(BaseModel): """Schema for keyword list response""" keywords: List[KeywordResponse] total: int page: int = 1 page_size: int = 50