259 lines
6.2 KiB
Go
259 lines
6.2 KiB
Go
package model
|
|
|
|
import "time"
|
|
|
|
// ProxyProtocol 代理协议类型
|
|
type ProxyProtocol string
|
|
|
|
const (
|
|
ProtoHTTP ProxyProtocol = "http"
|
|
ProtoHTTPS ProxyProtocol = "https"
|
|
ProtoSOCKS5 ProxyProtocol = "socks5"
|
|
)
|
|
|
|
// ProxyStatus 代理状态
|
|
type ProxyStatus string
|
|
|
|
const (
|
|
StatusUnknown ProxyStatus = "unknown"
|
|
StatusAlive ProxyStatus = "alive"
|
|
StatusDead ProxyStatus = "dead"
|
|
)
|
|
|
|
// Proxy 代理实体
|
|
type Proxy struct {
|
|
ID string // uuid
|
|
|
|
Protocol ProxyProtocol
|
|
Host string
|
|
Port int
|
|
Username string
|
|
Password string
|
|
|
|
Group string
|
|
Tags []string
|
|
|
|
Status ProxyStatus
|
|
Score int
|
|
LatencyMs int64
|
|
LastCheckAt time.Time
|
|
|
|
FailCount int
|
|
SuccessCount int
|
|
Disabled bool
|
|
|
|
CreatedAt time.Time
|
|
UpdatedAt time.Time
|
|
}
|
|
|
|
// HealthPatch 健康度更新补丁
|
|
type HealthPatch struct {
|
|
Status *ProxyStatus
|
|
ScoreDelta int
|
|
LatencyMs *int64
|
|
CheckedAt *time.Time
|
|
FailInc int
|
|
SuccessInc int
|
|
}
|
|
|
|
// TestSpec 测试规格
|
|
type TestSpec struct {
|
|
URL string
|
|
Method string
|
|
Timeout time.Duration
|
|
ExpectStatus []int
|
|
ExpectContains string
|
|
}
|
|
|
|
// TestResult 测试结果
|
|
type TestResult struct {
|
|
ProxyID string
|
|
OK bool
|
|
LatencyMs int64
|
|
ErrorText string
|
|
CheckedAt time.Time
|
|
}
|
|
|
|
// Lease 租约
|
|
type Lease struct {
|
|
LeaseID string
|
|
ProxyID string
|
|
Proxy Proxy
|
|
ExpireAt time.Time
|
|
Group string
|
|
Site string
|
|
}
|
|
|
|
// ProxyQuery 代理查询条件
|
|
type ProxyQuery struct {
|
|
Group string
|
|
TagsAny []string
|
|
StatusIn []ProxyStatus
|
|
OnlyEnabled bool
|
|
Limit int
|
|
OrderBy string // "random", "score", "latency",默认按 score 降序
|
|
}
|
|
|
|
// InvalidLine 无效行记录
|
|
type InvalidLine struct {
|
|
Raw string `json:"raw"`
|
|
Reason string `json:"reason"`
|
|
}
|
|
|
|
// SelectRequest 代理选择请求
|
|
type SelectRequest struct {
|
|
Group string
|
|
Site string
|
|
Policy string // round_robin, random, weighted
|
|
TagsAny []string
|
|
}
|
|
|
|
// ImportInput 导入输入参数
|
|
type ImportInput struct {
|
|
Group string
|
|
Tags []string
|
|
ProtocolHint string // auto, http, https, socks5
|
|
}
|
|
|
|
// ImportResult 导入结果
|
|
type ImportResult struct {
|
|
Imported int `json:"imported"`
|
|
Duplicated int `json:"duplicated"`
|
|
Invalid int `json:"invalid"`
|
|
InvalidItems []InvalidLine `json:"invalid_items,omitempty"`
|
|
}
|
|
|
|
// TestSummary 测试摘要
|
|
type TestSummary struct {
|
|
Tested int `json:"tested"`
|
|
Alive int `json:"alive"`
|
|
Dead int `json:"dead"`
|
|
}
|
|
|
|
// TestBatchResult 批量测试结果
|
|
type TestBatchResult struct {
|
|
Summary TestSummary `json:"summary"`
|
|
Results []TestResult `json:"results"`
|
|
}
|
|
|
|
// NextProxyResponse 获取下一个代理的响应
|
|
type NextProxyResponse struct {
|
|
Proxy ProxyInfo `json:"proxy"`
|
|
LeaseID string `json:"lease_id"`
|
|
TTLMs int64 `json:"ttl_ms"`
|
|
}
|
|
|
|
// ProxyInfo 代理信息(用于 API 响应)
|
|
type ProxyInfo struct {
|
|
ID string `json:"id"`
|
|
Protocol ProxyProtocol `json:"protocol"`
|
|
Host string `json:"host"`
|
|
Port int `json:"port"`
|
|
Username string `json:"username,omitempty"`
|
|
Password string `json:"password,omitempty"`
|
|
}
|
|
|
|
// ReportRequest 上报请求
|
|
type ReportRequest struct {
|
|
LeaseID string `json:"lease_id"`
|
|
ProxyID string `json:"proxy_id"`
|
|
Success bool `json:"success"`
|
|
Error string `json:"error,omitempty"`
|
|
LatencyMs int64 `json:"latency_ms"`
|
|
}
|
|
|
|
// TestRequest 测试请求
|
|
type TestRequest struct {
|
|
Group string `json:"group"`
|
|
Filter ProxyFilter `json:"filter"`
|
|
TestSpec TestSpecReq `json:"test_spec"`
|
|
Concurrency int `json:"concurrency"`
|
|
UpdateStore bool `json:"update_store"`
|
|
WriteLog bool `json:"write_log"`
|
|
}
|
|
|
|
// ProxyFilter 代理过滤条件
|
|
type ProxyFilter struct {
|
|
Status []string `json:"status"`
|
|
TagsAny []string `json:"tags_any"`
|
|
Limit int `json:"limit"`
|
|
}
|
|
|
|
// TestSpecReq 测试规格请求
|
|
type TestSpecReq struct {
|
|
URL string `json:"url"`
|
|
Method string `json:"method"`
|
|
TimeoutMs int `json:"timeout_ms"`
|
|
ExpectStatus []int `json:"expect_status"`
|
|
ExpectContains string `json:"expect_contains"`
|
|
}
|
|
|
|
// ImportTextRequest 文本导入请求
|
|
type ImportTextRequest struct {
|
|
Group string `json:"group"`
|
|
Tags []string `json:"tags"`
|
|
ProtocolHint string `json:"protocol_hint"`
|
|
Text string `json:"text"`
|
|
}
|
|
|
|
// ProxyListQuery 代理列表查询条件(带分页)
|
|
type ProxyListQuery struct {
|
|
Group string
|
|
TagsAny []string
|
|
StatusIn []ProxyStatus
|
|
OnlyEnabled bool
|
|
Offset int
|
|
Limit int
|
|
}
|
|
|
|
// ProxyListResponse 代理列表分页响应
|
|
type ProxyListResponse struct {
|
|
Data []Proxy `json:"data"`
|
|
Total int `json:"total"`
|
|
Offset int `json:"offset"`
|
|
Limit int `json:"limit"`
|
|
}
|
|
|
|
// ProxyPatch 代理更新补丁
|
|
type ProxyPatch struct {
|
|
Group *string `json:"group,omitempty"`
|
|
Tags *[]string `json:"tags,omitempty"`
|
|
AddTags []string `json:"add_tags,omitempty"`
|
|
Disabled *bool `json:"disabled,omitempty"`
|
|
}
|
|
|
|
// BulkDeleteRequest 批量删除请求
|
|
type BulkDeleteRequest struct {
|
|
IDs []string `json:"ids,omitempty"`
|
|
Status ProxyStatus `json:"status,omitempty"`
|
|
Group string `json:"group,omitempty"`
|
|
Disabled *bool `json:"disabled,omitempty"`
|
|
}
|
|
|
|
// BulkDeleteResponse 批量删除响应
|
|
type BulkDeleteResponse struct {
|
|
Deleted int `json:"deleted"`
|
|
}
|
|
|
|
// SingleTestRequest 单个代理测试请求
|
|
type SingleTestRequest struct {
|
|
URL string `json:"url"`
|
|
Method string `json:"method,omitempty"`
|
|
TimeoutMs int `json:"timeout_ms,omitempty"`
|
|
ExpectStatus []int `json:"expect_status,omitempty"`
|
|
ExpectContains string `json:"expect_contains,omitempty"`
|
|
UpdateStore bool `json:"update_store"`
|
|
WriteLog bool `json:"write_log"`
|
|
}
|
|
|
|
// ProxyStats 代理统计信息
|
|
type ProxyStats struct {
|
|
Total int `json:"total"`
|
|
ByStatus map[ProxyStatus]int `json:"by_status"`
|
|
ByGroup map[string]int `json:"by_group"`
|
|
ByProtocol map[ProxyProtocol]int `json:"by_protocol"`
|
|
Disabled int `json:"disabled"`
|
|
AvgLatencyMs int64 `json:"avg_latency_ms"`
|
|
AvgScore float64 `json:"avg_score"`
|
|
}
|