from datetime import datetime from typing import Optional, Dict, Any from pydantic import BaseModel, Field from bson import ObjectId class PyObjectId(ObjectId): """Custom ObjectId type for Pydantic""" @classmethod def __get_validators__(cls): yield cls.validate @classmethod def validate(cls, v): if not ObjectId.is_valid(v): raise ValueError("Invalid ObjectId") return ObjectId(v) @classmethod def __get_pydantic_json_schema__(cls, field_schema): field_schema.update(type="string") class Keyword(BaseModel): """Keyword data model for pipeline management""" id: Optional[PyObjectId] = Field(default=None, alias="_id") keyword: str = Field(..., min_length=1, max_length=200) category: str = Field(..., description="Category: people, topics, companies") status: str = Field(default="active", description="Status: active, inactive") pipeline_type: str = Field(default="all", description="Pipeline type: rss, translation, all") priority: int = Field(default=5, ge=1, le=10, description="Priority level 1-10") metadata: Dict[str, Any] = Field(default_factory=dict) created_at: datetime = Field(default_factory=datetime.utcnow) updated_at: datetime = Field(default_factory=datetime.utcnow) created_by: Optional[str] = Field(default=None, description="User ID who created this keyword") class Config: populate_by_name = True arbitrary_types_allowed = True json_encoders = {ObjectId: str} json_schema_extra = { "example": { "keyword": "도널드 트럼프", "category": "people", "status": "active", "pipeline_type": "all", "priority": 8, "metadata": { "description": "Former US President", "aliases": ["Donald Trump", "Trump"] }, "created_by": "admin" } }