"""API 请求/响应模型(Pydantic)。""" from __future__ import annotations from pydantic import BaseModel, Field, model_validator # ---------- 平台 ---------- class PlatformBase(BaseModel): provider_id: str = Field(min_length=1, max_length=64) name: str = Field(min_length=1, max_length=64) currency: str | None = Field(default=None, min_length=1, max_length=16) icon: str | None = Field(default=None, max_length=64) interval_seconds: int | None = Field(default=None, ge=10) retry_count: int | None = Field(default=None, ge=0, le=10) timeout_seconds: int | None = Field(default=None, ge=1, le=120) enabled: bool = True note: str = Field(default="", max_length=200) class PlatformCreate(PlatformBase): pass class PlatformUpdate(BaseModel): provider_id: str | None = Field(default=None, min_length=1, max_length=64) name: str | None = Field(default=None, min_length=1, max_length=64) currency: str | None = Field(default=None, max_length=16) icon: str | None = Field(default=None, max_length=64) interval_seconds: int | None = Field(default=None, ge=10) retry_count: int | None = Field(default=None, ge=0, le=10) timeout_seconds: int | None = Field(default=None, ge=1, le=120) enabled: bool | None = None note: str | None = Field(default=None, max_length=200) # ---------- 账号 ---------- class AccountCreate(BaseModel): platform_id: int name: str = Field(min_length=1, max_length=64) api_key: str = Field(min_length=1) threshold: float = Field(default=0, ge=0) enabled: bool = True note: str = Field(default="", max_length=200) class AccountUpdate(BaseModel): platform_id: int | None = None name: str | None = Field(default=None, min_length=1, max_length=64) api_key: str | None = Field(default=None, min_length=1) threshold: float | None = Field(default=None, ge=0) enabled: bool | None = None note: str | None = Field(default=None, max_length=200) @model_validator(mode="after") def _at_least_one(self) -> "AccountUpdate": fields = self.model_fields_set if not fields: raise ValueError("至少需要提供一个字段") return self # ---------- 系统 ---------- class LoginRequest(BaseModel): password: str class SettingsUpdate(BaseModel): global_interval_seconds: int | None = Field(default=None, ge=10, le=86400) retry_count: int | None = Field(default=None, ge=0, le=10) timeout_seconds: int | None = Field(default=None, ge=1, le=120) max_workers: int | None = Field(default=None, ge=1, le=64) telegram_bot_token: str | None = None telegram_chat_id: str | None = None class PasswordChange(BaseModel): old_password: str new_password: str = Field(min_length=4)