Initial commit

This commit is contained in:
2026-06-30 15:14:37 +08:00
commit 15dab96872
311 changed files with 95639 additions and 0 deletions
+131
View File
@@ -0,0 +1,131 @@
package dto
import (
"fmt"
"git.zkcoi.com/zkcoi/meshray/internal/model"
)
// NetworkResponse 网络响应 DTOID 为字符串格式,避免 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 设备响应 DTOID 为字符串格式,避免 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 策略响应 DTOID 为字符串格式)
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
}