from pydantic import BaseModel, Field class LoginRequest(BaseModel): username: str = Field(min_length=1, max_length=64) password: str = Field(min_length=1, max_length=128) class RegisterRequest(BaseModel): username: str = Field(min_length=3, max_length=64, pattern=r"^[A-Za-z0-9_.-]+$") password: str = Field(min_length=8, max_length=128) display_name: str = Field(min_length=1, max_length=64) class AdminUserCreate(BaseModel): username: str = Field(min_length=3, max_length=64, pattern=r"^[A-Za-z0-9_.-]+$") password: str = Field(min_length=8, max_length=128) display_name: str = Field(min_length=1, max_length=64) role_code: str = Field(default="operator", pattern=r"^(super_admin|operator)$") class AdminUserUpdate(BaseModel): password: str | None = Field(default=None, min_length=8, max_length=128) display_name: str | None = Field(default=None, min_length=1, max_length=64) role_code: str | None = Field(default=None, pattern=r"^(super_admin|operator)$") is_active: bool | None = None class QAGenerateRequest(BaseModel): product_name: str = Field(default="", max_length=200) category: str = Field(default="", max_length=100) benefits: str = Field(default="", max_length=1000) selling_points: str = Field(default="", max_length=2000) language_style: str = Field(default="口语(亲切随性)", max_length=40) target_group: str = Field(default="女性", max_length=100) usage_scene: str = Field(default="居家", max_length=100) purchase_channel: str = Field(default="电商平台", max_length=100) question_count: int = Field(default=5, ge=1) answers_per_question: int = Field(default=2, ge=1, le=50) answer_requirement: str = Field(default="", max_length=1000) reference_qa: str = Field(default="", max_length=20000) seed_style: bool = True class UserOut(BaseModel): id: int username: str display_name: str role_code: str class LoginResponse(BaseModel): success: bool = True data: dict