94 lines
2.8 KiB
Python
94 lines
2.8 KiB
Python
import uuid
|
|
from datetime import datetime
|
|
|
|
from pydantic import BaseModel, Field, field_validator
|
|
|
|
VALID_PLATFORMS = {"wenxin", "kimi", "tongyi", "baidu_ai", "yuanbao", "qingyan", "doubao", "tiangong", "xinghuo"}
|
|
VALID_FREQUENCIES = {"daily", "weekly"}
|
|
VALID_STATUSES = {"active", "paused", "disabled"}
|
|
|
|
|
|
class QueryCreate(BaseModel):
|
|
keyword: str = Field(min_length=1, max_length=200)
|
|
target_brand: str = Field(min_length=1, max_length=100)
|
|
brand_aliases: list[str] | None = None
|
|
platforms: list[str]
|
|
frequency: str = "weekly"
|
|
|
|
@field_validator("platforms")
|
|
@classmethod
|
|
def validate_platforms(cls, v: list[str]) -> list[str]:
|
|
if not v:
|
|
raise ValueError("platforms cannot be empty")
|
|
invalid = set(v) - VALID_PLATFORMS
|
|
if invalid:
|
|
raise ValueError(f"invalid platforms: {', '.join(invalid)}")
|
|
return v
|
|
|
|
@field_validator("frequency")
|
|
@classmethod
|
|
def validate_frequency(cls, v: str) -> str:
|
|
if v not in VALID_FREQUENCIES:
|
|
raise ValueError(f"frequency must be one of {VALID_FREQUENCIES}")
|
|
return v
|
|
|
|
|
|
class QueryUpdate(BaseModel):
|
|
keyword: str | None = Field(default=None, min_length=1, max_length=200)
|
|
target_brand: str | None = Field(default=None, min_length=1, max_length=100)
|
|
brand_aliases: list[str] | None = None
|
|
platforms: list[str] | None = None
|
|
frequency: str | None = None
|
|
status: str | None = None
|
|
|
|
@field_validator("platforms")
|
|
@classmethod
|
|
def validate_platforms(cls, v: list[str] | None) -> list[str] | None:
|
|
if v is None:
|
|
return v
|
|
if not v:
|
|
raise ValueError("platforms cannot be empty")
|
|
invalid = set(v) - VALID_PLATFORMS
|
|
if invalid:
|
|
raise ValueError(f"invalid platforms: {', '.join(invalid)}")
|
|
return v
|
|
|
|
@field_validator("frequency")
|
|
@classmethod
|
|
def validate_frequency(cls, v: str | None) -> str | None:
|
|
if v is None:
|
|
return v
|
|
if v not in VALID_FREQUENCIES:
|
|
raise ValueError(f"frequency must be one of {VALID_FREQUENCIES}")
|
|
return v
|
|
|
|
@field_validator("status")
|
|
@classmethod
|
|
def validate_status(cls, v: str | None) -> str | None:
|
|
if v is None:
|
|
return v
|
|
if v not in VALID_STATUSES:
|
|
raise ValueError(f"status must be one of {VALID_STATUSES}")
|
|
return v
|
|
|
|
|
|
class QueryResponse(BaseModel):
|
|
id: uuid.UUID
|
|
keyword: str
|
|
target_brand: str
|
|
brand_aliases: list
|
|
platforms: list
|
|
frequency: str
|
|
status: str
|
|
last_queried_at: datetime | None
|
|
next_query_at: datetime | None
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
model_config = {"from_attributes": True}
|
|
|
|
|
|
class QueryListResponse(BaseModel):
|
|
items: list[QueryResponse]
|
|
total: int
|