126 lines
2.8 KiB
Swift
126 lines
2.8 KiB
Swift
//
|
|
// NetworkState.swift
|
|
// punchnet
|
|
//
|
|
// Created by 安礼成 on 2026/1/16.
|
|
//
|
|
|
|
import Foundation
|
|
import Observation
|
|
|
|
// 资源列表
|
|
struct Resource: Codable {
|
|
var uuid = UUID().uuidString
|
|
var id: Int
|
|
var name: String
|
|
var url: String
|
|
var connectionStatus: String
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case id
|
|
case name
|
|
case url
|
|
case connectionStatus = "connection_status"
|
|
}
|
|
}
|
|
|
|
// 设备列表
|
|
struct Node: Codable {
|
|
var id: Int
|
|
var name: String
|
|
var ip: String
|
|
var system: String?
|
|
var connectionStatus: String
|
|
|
|
func hash(into hasher: inout Hasher) {
|
|
hasher.combine(id)
|
|
}
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case id
|
|
case name
|
|
case ip
|
|
case system
|
|
case connectionStatus = "connection_status"
|
|
}
|
|
|
|
static func == (lhs: Self, rhs: Self) -> Bool {
|
|
return lhs.id == rhs.id
|
|
}
|
|
}
|
|
|
|
// 用来做临时的数据解析
|
|
struct NetworkContext: Codable {
|
|
let ip: String
|
|
let maskLen: UInt8
|
|
// 主机名称
|
|
let hostname: String
|
|
let identityId: UInt32
|
|
let resourceList: [Resource]
|
|
let nodeList: [Node]
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case ip
|
|
case maskLen = "mask_len"
|
|
case hostname
|
|
case identityId = "identity_id"
|
|
case resourceList = "resource_list"
|
|
case nodeList = "node_list"
|
|
}
|
|
|
|
static func `default`() -> Self {
|
|
return .init(ip: "", maskLen: 24, hostname: "", identityId: 0, resourceList: [], nodeList: [])
|
|
}
|
|
|
|
}
|
|
|
|
// 节点详情
|
|
struct NodeDetail: Codable {
|
|
let id: Int
|
|
let name: String
|
|
let ip: String
|
|
let system: String?
|
|
let connectionStatus: String
|
|
let resourceList: [Resource]
|
|
|
|
enum CodingKeys: String, CodingKey {
|
|
case id
|
|
case name
|
|
case ip
|
|
case system
|
|
case connectionStatus = "connection_status"
|
|
case resourceList = "resource_list"
|
|
}
|
|
}
|
|
|
|
@Observable
|
|
class NetworkModel {
|
|
// 当前选中的设备
|
|
var selectedNode: Node?
|
|
var networkContext: NetworkContext = .default()
|
|
|
|
init() {
|
|
|
|
}
|
|
|
|
func changeSelectedNode(nodeId: Int?) {
|
|
if let nodeId {
|
|
if let node = self.networkContext.nodeList.first(where: { $0.id == nodeId}) {
|
|
self.selectedNode = node
|
|
}
|
|
}
|
|
}
|
|
|
|
func connect(networkSession: UserContext.NetworkSession) async throws -> NetworkContext {
|
|
let params: [String: Any] = [
|
|
"client_id": SystemConfig.getClientId(),
|
|
"access_token": networkSession.accessToken
|
|
]
|
|
|
|
self.networkContext = try await SDLAPIClient.doPost(path: "/connect", params: params, as: NetworkContext.self)
|
|
|
|
return self.networkContext
|
|
}
|
|
|
|
}
|