// // SDLAPIClient+Network.swift // punchnet // // Created by 安礼成 on 2026/3/24. // import Foundation extension SDLAPIClient { // 用来做临时的数据解析 struct NetworkContext: Codable { let ip: String let maskLen: UInt8 // 主机名称 let hostname: String let identityId: UInt32 let resourceList: [Resource] let nodeList: [Node] let exitNodeList: [ExitNode] struct ExitNode: Codable { let uuid = UUID().uuidString let nnid: Int let nodeName: String enum CodingKeys: String, CodingKey { case nnid = "node_id" case nodeName = "node_name" } } // 资源列表 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 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" } } enum CodingKeys: String, CodingKey { case ip case maskLen = "mask_len" case hostname case identityId = "identity_id" case resourceList = "resource_list" case nodeList = "node_list" case exitNodeList = "exit_node" } func getNode(id: Int?) -> Node? { return nodeList.first(where: { $0.id == id }) } func firstNodeId() -> Int? { return nodeList.first?.id } } static func connectNetwork(accesToken: String) async throws -> NetworkContext { let params: [String: Any] = [ "client_id": SystemConfig.getClientId(), "access_token": accesToken ] return try await SDLAPIClient.doPost(path: "/connect", params: params, as: NetworkContext.self) } static func loadNodeResources(accesToken: String, id: Int) async -> [NetworkContext.Resource] { let params: [String: Any] = [ "client_id": SystemConfig.getClientId(), "access_token": accesToken, "id": id ] if let detail = try? await SDLAPIClient.doPost(path: "/get_node_resources", params: params, as: NetworkContext.NodeDetail.self) { return detail.resourceList } return [] } }