from enum import StrEnum from typing import TYPE_CHECKING from sqlmodel import Field, Relationship, text, Index from sqlmodel_ext import SQLModelBase, TableBaseMixin, Str255 if TYPE_CHECKING: from .download import Download class NodeStatus(StrEnum): """节点状态枚举""" ONLINE = "online" """正常""" OFFLINE = "offline" """离线""" class NodeType(StrEnum): """节点类型枚举""" MASTER = "master" """主节点""" SLAVE = "slave" """从节点""" class Aria2ConfigurationBase(SQLModelBase): """Aria2配置基础模型""" rpc_url: Str255 | None = None """RPC地址""" rpc_secret: str | None = None """RPC密钥""" temp_path: Str255 | None = None """临时下载路径""" max_concurrent: int = Field(default=5, ge=1, le=50) """最大并发数""" timeout: int = Field(default=300, ge=1) """请求超时时间(秒)""" class Aria2Configuration(Aria2ConfigurationBase, TableBaseMixin): """Aria2配置模型(与Node一对一关联)""" node_id: int = Field( foreign_key="node.id", unique=True, index=True, ondelete="CASCADE" ) """关联的节点ID""" # 反向关系 node: "Node" = Relationship(back_populates="aria2_config") """关联的节点""" class Node(SQLModelBase, TableBaseMixin): """节点模型""" __table_args__ = ( Index("ix_node_status", "status"), ) status: NodeStatus = Field(default=NodeStatus.ONLINE) """节点状态""" name: Str255 = Field(unique=True) """节点名称""" type: NodeType """节点类型""" server: Str255 """节点地址(IP或域名)""" slave_key: Str255 | None = None """从机通讯密钥""" master_key: Str255 | None = None """主机通讯密钥""" aria2_enabled: bool = False """是否启用Aria2""" rank: int = 0 """节点排序权重""" # 关系 aria2_config: Aria2Configuration | None = Relationship( back_populates="node", sa_relationship_kwargs={"uselist": False, "cascade": "all, delete-orphan"}, ) """Aria2配置""" downloads: list["Download"] = Relationship(back_populates="node") """该节点的下载任务"""