Files

83 lines
2.7 KiB
Python

"""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)