7adc7c00ab
Enable managed remote browser custom pages with login autofill and add website sync workflows so external admin surfaces can be handled inside SmartUp. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
125 lines
3.0 KiB
Python
125 lines
3.0 KiB
Python
from datetime import datetime
|
|
from typing import Any, Optional
|
|
|
|
from pydantic import BaseModel, Field
|
|
|
|
|
|
class TestResult(BaseModel):
|
|
success: bool
|
|
message: str
|
|
detail: Optional[str] = None
|
|
|
|
|
|
class WebsiteCreate(BaseModel):
|
|
name: str
|
|
site_type: str = "sub2api"
|
|
base_url: str
|
|
api_prefix: str = "/api/v1/admin"
|
|
auth_type: str = "api_key"
|
|
auth_config: dict[str, Any] = {}
|
|
groups_endpoint: str = "/groups"
|
|
group_update_endpoint: str = "/groups/{id}"
|
|
enabled: bool = True
|
|
auto_sync_enabled: bool = True
|
|
timeout_seconds: int = 30
|
|
|
|
|
|
class WebsiteUpdate(BaseModel):
|
|
name: Optional[str] = None
|
|
site_type: 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
|
|
groups_endpoint: Optional[str] = None
|
|
group_update_endpoint: Optional[str] = None
|
|
enabled: Optional[bool] = None
|
|
auto_sync_enabled: Optional[bool] = None
|
|
timeout_seconds: Optional[int] = None
|
|
|
|
|
|
class WebsiteResponse(BaseModel):
|
|
id: int
|
|
name: str
|
|
site_type: str
|
|
base_url: str
|
|
api_prefix: str
|
|
auth_type: str
|
|
auth_config_masked: dict[str, Any]
|
|
groups_endpoint: str
|
|
group_update_endpoint: str
|
|
enabled: bool
|
|
auto_sync_enabled: bool
|
|
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 WebsiteGroupResponse(BaseModel):
|
|
id: str
|
|
name: str
|
|
rate_multiplier: Optional[str] = None
|
|
raw: dict[str, Any] = {}
|
|
|
|
|
|
class BindingSourceGroup(BaseModel):
|
|
upstream_id: int
|
|
group_id: str
|
|
upstream_name: str = ""
|
|
group_name: str = ""
|
|
|
|
|
|
class BindingCreate(BaseModel):
|
|
website_id: int
|
|
target_group_id: str
|
|
target_group_name: str = ""
|
|
source_groups: list[BindingSourceGroup] = Field(default_factory=list)
|
|
percent: float = Field(default=0, ge=0)
|
|
algorithm: str = "max_plus_percent"
|
|
enabled: bool = True
|
|
|
|
|
|
class BindingUpdate(BaseModel):
|
|
website_id: Optional[int] = None
|
|
target_group_id: Optional[str] = None
|
|
target_group_name: Optional[str] = None
|
|
source_groups: Optional[list[BindingSourceGroup]] = None
|
|
percent: Optional[float] = Field(default=None, ge=0)
|
|
algorithm: Optional[str] = None
|
|
enabled: Optional[bool] = None
|
|
|
|
|
|
class BindingResponse(BaseModel):
|
|
id: int
|
|
website_id: int
|
|
website_name: str
|
|
target_group_id: str
|
|
target_group_name: str
|
|
source_groups: list[BindingSourceGroup]
|
|
percent: float
|
|
algorithm: str
|
|
enabled: bool
|
|
created_at: datetime
|
|
updated_at: datetime
|
|
|
|
|
|
class WebsiteSyncLogResponse(BaseModel):
|
|
id: int
|
|
website_id: int
|
|
binding_id: Optional[int]
|
|
target_group_id: str
|
|
target_group_name: str
|
|
algorithm: str
|
|
percent: float
|
|
source_rates: list[dict[str, Any]]
|
|
old_rate: Optional[str]
|
|
new_rate: Optional[str]
|
|
status: str
|
|
message: str
|
|
created_at: datetime
|