gitscope
← marzneshin / v0.3.0-alpha / app/models/node.py
https://dev.kronoz.win/r/marzneshin.git
app/models/node.py · Python
Blame Raw
 1from enum import Enum
 2from typing import List, Optional
 3
 4from pydantic import ConfigDict, BaseModel, Field
 5
 6
 7class NodeStatus(str, Enum):
 8    healthy = "healthy"
 9    unhealthy = "unhealthy"
10    disabled = "disabled"
11
12
13class NodeConnectionBackend(str, Enum):
14    grpcio = "grpcio"
15    grpclib = "grpclib"
16
17
18class NodeSettings(BaseModel):
19    min_node_version: str = "v0.2.0"
20    certificate: str
21
22
23class NodeBase(BaseModel):
24    id: Optional[int] = Field(None)
25    name: str
26    address: str
27    port: int = 62050
28    connection_backend: NodeConnectionBackend = Field(
29        default=NodeConnectionBackend.grpclib
30    )
31    usage_coefficient: float = Field(ge=0, default=1.0)
32    model_config = ConfigDict(from_attributes=True)
33
34
35from app.models.proxy import InboundBase
36
37
38class Node(NodeBase):
39    inbounds: Optional[List[InboundBase]] = None
40
41
42class NodeCreate(Node):
43    model_config = ConfigDict(
44        json_schema_extra={
45            "example": {
46                "name": "DE node",
47                "address": "192.168.1.1",
48                "port": 62050,
49                "usage_coefficient": 1,
50            }
51        }
52    )
53
54
55class NodeModify(Node):
56    name: Optional[str] = Field(None)
57    address: Optional[str] = Field(None)
58    port: Optional[int] = Field(None)
59    connection_backend: Optional[NodeConnectionBackend] = Field(None)
60    status: Optional[NodeStatus] = Field(None)
61    usage_coefficient: Optional[float] = Field(None)
62    model_config = ConfigDict(
63        json_schema_extra={
64            "example": {
65                "name": "DE node",
66                "address": "192.168.1.1",
67                "port": 62050,
68                "api_port": 62051,
69                "status": "disabled",
70                "usage_coefficient": 1.0,
71            }
72        }
73    )
74
75
76class NodeResponse(Node):
77    xray_version: Optional[str] = None
78    status: NodeStatus
79    message: Optional[str] = None
80    model_config = ConfigDict(from_attributes=True)
81
82
83class NodeUsageResponse(BaseModel):
84    node_id: Optional[int] = None
85    node_name: str
86    uplink: int
87    downlink: int
88
89
90class NodesUsageResponse(BaseModel):
91    usages: List[NodeUsageResponse]