Initial commit

This commit is contained in:
liumangmang
2026-05-12 17:51:53 +08:00
commit b564ca4797
55 changed files with 6407 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
# schemas package
+15
View File
@@ -0,0 +1,15 @@
from pydantic import BaseModel, EmailStr
class LoginRequest(BaseModel):
email: str
password: str
class TokenResponse(BaseModel):
access_token: str
token_type: str = "bearer"
class UserInfo(BaseModel):
email: str
+16
View File
@@ -0,0 +1,16 @@
from datetime import datetime
from typing import Optional, Any
from pydantic import BaseModel
class NotificationLogResponse(BaseModel):
id: int
webhook_config_id: int
webhook_name: str
event_type: str
payload: dict[str, Any]
status: str
response_text: Optional[str]
created_at: datetime
model_config = {"from_attributes": True}
+80
View File
@@ -0,0 +1,80 @@
from datetime import datetime
from typing import Optional, Any
from pydantic import BaseModel
class AuthConfigBearer(BaseModel):
token: str = ""
class AuthConfigApiKey(BaseModel):
key: str = ""
header: str = "Authorization"
class AuthConfigLoginPassword(BaseModel):
email: str = ""
password: str = ""
login_path: str = "/auth/login"
class UpstreamCreate(BaseModel):
name: str
base_url: str
api_prefix: str = "/api/v1"
auth_type: str = "login_password" # none | bearer | api_key | login_password
auth_config: dict[str, Any] = {}
rate_endpoint: str = "/groups/rates"
groups_endpoint: str = "/groups/available"
enabled: bool = True
check_interval_seconds: int = 600
timeout_seconds: int = 30
class UpstreamUpdate(BaseModel):
name: Optional[str] = None
base_url: Optional[str] = None
api_prefix: Optional[str] = None
auth_type: Optional[str] = None
auth_config: Optional[dict[str, Any]] = None
rate_endpoint: Optional[str] = None
groups_endpoint: Optional[str] = None
enabled: Optional[bool] = None
check_interval_seconds: Optional[int] = None
timeout_seconds: Optional[int] = None
class UpstreamResponse(BaseModel):
id: int
name: str
base_url: str
api_prefix: str
auth_type: str
auth_config_masked: dict[str, Any] # secrets replaced with ***
rate_endpoint: str
groups_endpoint: str
enabled: bool
check_interval_seconds: int
timeout_seconds: int
last_status: str
last_checked_at: Optional[datetime]
last_error: Optional[str]
created_at: datetime
updated_at: datetime
model_config = {"from_attributes": True}
class SnapshotResponse(BaseModel):
id: int
upstream_id: int
snapshot: dict[str, Any]
captured_at: datetime
model_config = {"from_attributes": True}
class TestResult(BaseModel):
success: bool
message: str
detail: Optional[str] = None
+37
View File
@@ -0,0 +1,37 @@
from datetime import datetime
from typing import Optional, List
from pydantic import BaseModel
ALLOWED_EVENTS = ["upstream_rate_changed", "upstream_unhealthy", "upstream_recovered"]
class WebhookCreate(BaseModel):
name: str
type: str = "generic" # generic | dingtalk
url: str
secret: str = ""
enabled: bool = True
events: List[str] = ["upstream_rate_changed"]
class WebhookUpdate(BaseModel):
name: Optional[str] = None
type: Optional[str] = None
url: Optional[str] = None
secret: Optional[str] = None
enabled: Optional[bool] = None
events: Optional[List[str]] = None
class WebhookResponse(BaseModel):
id: int
name: str
type: str
url: str
secret_masked: str # always "***" if set, else ""
enabled: bool
events: List[str]
created_at: datetime
updated_at: datetime
model_config = {"from_attributes": True}