geo/backend/app/schemas/query.py

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