- go.mod module path matches repo zkcoi/Meshray-Manager (case-distinct from zkcoi/Meshray/core)
- rewrite internal imports meshray/{internal,web,pkg} -> Meshray-Manager/... (core refs kept)
- sync README.md / install.sh repo URLs; add CHANGELOG entry
132 lines
5.4 KiB
Go
132 lines
5.4 KiB
Go
package dto
|
||
|
||
import (
|
||
"fmt"
|
||
|
||
"git.zkcoi.com/zkcoi/Meshray-Manager/internal/model"
|
||
)
|
||
|
||
// NetworkResponse 网络响应 DTO(ID 为字符串格式,避免 JavaScript 精度丢失)
|
||
type NetworkResponse struct {
|
||
ID string `json:"id"` // ❄️ 雪花算法 ID(字符串格式)
|
||
Name string `json:"name"` // 组网名称
|
||
SubnetIPv4 string `json:"subnet_ipv4"` // IPv4 子网(snake_case)
|
||
MeshMode string `json:"mesh_mode"` // 组网模式(enhanced/native)
|
||
WGMode string `json:"wg_mode"` // WG 运行模式(kernel/userspace)
|
||
PolicyID string `json:"policy_id"` // ❄️ 关联策略 ID(字符串格式)
|
||
Status string `json:"status"` // 运行状态(running/stopped)
|
||
DeviceCount int64 `json:"device_count"` // 设备数量(统计字段)
|
||
Description string `json:"description,omitempty"` // 描述
|
||
CreatedAt string `json:"created_at"` // 创建时间
|
||
UpdatedAt string `json:"updated_at"` // 更新时间
|
||
}
|
||
|
||
// DeviceResponse 设备响应 DTO(ID 为字符串格式,避免 JavaScript 精度丢失)
|
||
type DeviceResponse struct {
|
||
ID string `json:"id"` // ❄️ 雪花算法 ID(字符串格式)
|
||
NetworkID string `json:"networkId"` // ❄️ 所属网络 ID(字符串格式)
|
||
Name string `json:"name"` // 设备名称
|
||
VirtualIP string `json:"virtualIP"` // 虚拟 IP
|
||
PublicKey string `json:"publicKey"` // WireGuard 公钥
|
||
Endpoint string `json:"endpoint,omitempty"` // 公网 Endpoint
|
||
IsRelayCapable bool `json:"isRelayCapable"` // 是否中继节点
|
||
Status string `json:"status"` // 在线状态(online/offline)
|
||
Description string `json:"description,omitempty"` // 描述
|
||
CreatedAt string `json:"createdAt"` // 创建时间
|
||
UpdatedAt string `json:"updatedAt"` // 更新时间
|
||
}
|
||
|
||
// PolicyResponse 策略响应 DTO(ID 为字符串格式)
|
||
type PolicyResponse struct {
|
||
ID string `json:"id"` // ❄️ 雪花算法 ID(字符串格式)
|
||
Name string `json:"name"` // 策略名称
|
||
Type string `json:"type"` // 类型(system/custom)
|
||
LayerConfig string `json:"layerConfig"` // 链路配置 JSON
|
||
GlobalParams string `json:"globalParams"` // 全局参数 JSON
|
||
Enabled bool `json:"enabled"` // 是否启用
|
||
IsDefault bool `json:"isDefault"` // 是否默认策略
|
||
Description string `json:"description,omitempty"` // 描述
|
||
CreatedAt string `json:"createdAt"` // 创建时间
|
||
UpdatedAt string `json:"updatedAt"` // 更新时间
|
||
}
|
||
|
||
// ToNetworkResponse Network 转 NetworkResponse
|
||
func ToNetworkResponse(network *model.Network) NetworkResponse {
|
||
// 计算设备数量
|
||
var deviceCount int64 = 0
|
||
if len(network.Devices) > 0 {
|
||
deviceCount = int64(len(network.Devices))
|
||
}
|
||
|
||
return NetworkResponse{
|
||
ID: fmt.Sprintf("%d", network.ID),
|
||
Name: network.Name,
|
||
SubnetIPv4: network.SubnetIPv4,
|
||
MeshMode: network.Mode, // Mode → MeshMode
|
||
WGMode: network.WGMode,
|
||
PolicyID: fmt.Sprintf("%d", network.PolicyID),
|
||
Status: network.Status,
|
||
DeviceCount: deviceCount, // 新增:设备数量
|
||
CreatedAt: network.CreatedAt.Format("2006-01-02T15:04:05Z"),
|
||
UpdatedAt: network.UpdatedAt.Format("2006-01-02T15:04:05Z"),
|
||
}
|
||
}
|
||
|
||
// ToDeviceResponse Device 转 DeviceResponse
|
||
func ToDeviceResponse(device *model.Device) DeviceResponse {
|
||
return DeviceResponse{
|
||
ID: fmt.Sprintf("%d", device.ID),
|
||
NetworkID: fmt.Sprintf("%d", device.NetworkID),
|
||
Name: device.Name,
|
||
VirtualIP: device.VirtualIP,
|
||
PublicKey: device.PublicKey,
|
||
Endpoint: device.Endpoint,
|
||
IsRelayCapable: device.IsRelayCapable,
|
||
Status: device.Status,
|
||
CreatedAt: device.CreatedAt.Format("2006-01-02T15:04:05Z"),
|
||
}
|
||
}
|
||
|
||
// ToPolicyResponse Policy 转 PolicyResponse
|
||
func ToPolicyResponse(policy *model.Policy) PolicyResponse {
|
||
return PolicyResponse{
|
||
ID: fmt.Sprintf("%d", policy.ID),
|
||
Name: policy.Name,
|
||
Type: policy.Type,
|
||
LayerConfig: policy.LayerConfig,
|
||
GlobalParams: policy.GlobalParams,
|
||
Enabled: policy.Enabled,
|
||
IsDefault: policy.IsDefault,
|
||
Description: policy.Description,
|
||
CreatedAt: policy.CreatedAt.Format("2006-01-02T15:04:05Z"),
|
||
UpdatedAt: policy.UpdatedAt.Format("2006-01-02T15:04:05Z"),
|
||
}
|
||
}
|
||
|
||
// ToNetworkResponseList 批量转换 Network
|
||
func ToNetworkResponseList(networks []model.Network) []NetworkResponse {
|
||
result := make([]NetworkResponse, 0, len(networks))
|
||
for _, n := range networks {
|
||
result = append(result, ToNetworkResponse(&n))
|
||
}
|
||
return result
|
||
}
|
||
|
||
// ToDeviceResponseList 批量转换 Device
|
||
func ToDeviceResponseList(devices []model.Device) []DeviceResponse {
|
||
result := make([]DeviceResponse, 0, len(devices))
|
||
for _, d := range devices {
|
||
result = append(result, ToDeviceResponse(&d))
|
||
}
|
||
return result
|
||
}
|
||
|
||
// ToPolicyResponseList 批量转换 Policy
|
||
func ToPolicyResponseList(policies []model.Policy) []PolicyResponse {
|
||
result := make([]PolicyResponse, 0, len(policies))
|
||
for _, p := range policies {
|
||
result = append(result, ToPolicyResponse(&p))
|
||
}
|
||
return result
|
||
}
|