feat: AI 余额监控服务(平台/账号 CRUD、并发轮询、Telegram 阈值提醒)
This commit is contained in:
@@ -0,0 +1,90 @@
|
||||
"""API 请求/响应模型(Pydantic)。"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from pydantic import BaseModel, Field, model_validator
|
||||
|
||||
|
||||
# ---------- 平台 ----------
|
||||
|
||||
class PlatformBase(BaseModel):
|
||||
name: str = Field(min_length=1, max_length=64)
|
||||
currency: str = Field(default="USD", min_length=1, max_length=16)
|
||||
icon: str = Field(default="", max_length=64)
|
||||
method: str = Field(default="GET", pattern="^(GET|POST)$")
|
||||
url: str = Field(min_length=1)
|
||||
headers: dict = Field(default_factory=dict)
|
||||
body: str = Field(default="")
|
||||
balance_path: str = Field(min_length=1)
|
||||
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):
|
||||
name: str | None = Field(default=None, 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)
|
||||
method: str | None = Field(default=None, pattern="^(GET|POST)$")
|
||||
url: str | None = Field(default=None, min_length=1)
|
||||
headers: dict | None = None
|
||||
body: str | None = None
|
||||
balance_path: str | None = Field(default=None, min_length=1)
|
||||
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)
|
||||
Reference in New Issue
Block a user