- 删除分组实体:分组视图/编辑器/仓储与 groupId 全部移除,升级首启清理 instance-groups.json 与 fleet.groupMode - 新增批量标签表:三态覆盖度(未贴 / N/M / 全部),整批加减与新建标签 - 配色重构,全应用零蓝色:石墨墨色承担主操作与选中态,颜色只留给状态语义; 浅色改中性冷灰,深色改低明度石墨三层 - 选中态改实心主色 + onPrimary,替换不可读的低透明度色雾(主题块、图例胶囊) - 应用图标重做为扁平石墨底 + 黄铜 SIM 面板,参数化光栅化脚本与参考稿 - 运行概览:检测进度并入副标题,读数栅格固定八格两行并保留不可用占位 - 实例详情:仪表改两列发丝线栅格,缺数据留轨道,修掉头部高度回弹; 补齐设备名称/存储总量/可用存储/使用率四个字段名 - 版本号显示去掉括号,设置页只显示 0.2.2 - 文档:新增 docs/ios-native-0.2.2.md,同步 ios-native.md 与两处 README
97 lines
2.4 KiB
Swift
97 lines
2.4 KiB
Swift
import Foundation
|
|
|
|
public enum RepositoryError: Error, Equatable, Sendable {
|
|
case invalidOrigin
|
|
case duplicateOrigin
|
|
case revisionConflict
|
|
case notFound
|
|
case databaseFailed
|
|
}
|
|
|
|
public struct Instance: Codable, Equatable, Identifiable, Sendable {
|
|
public let id: UUID
|
|
public var name: String
|
|
public var origin: URL
|
|
public var tags: [String]
|
|
public var credentialConfigured: Bool
|
|
public var configRevision: Int
|
|
public let createdAt: Date
|
|
public var updatedAt: Date
|
|
|
|
public init(
|
|
id: UUID,
|
|
name: String,
|
|
origin: URL,
|
|
tags: [String] = [],
|
|
credentialConfigured: Bool = false,
|
|
configRevision: Int = 1,
|
|
createdAt: Date,
|
|
updatedAt: Date
|
|
) {
|
|
self.id = id
|
|
self.name = name
|
|
self.origin = origin
|
|
self.tags = tags
|
|
self.credentialConfigured = credentialConfigured
|
|
self.configRevision = configRevision
|
|
self.createdAt = createdAt
|
|
self.updatedAt = updatedAt
|
|
}
|
|
}
|
|
|
|
public struct InstanceInput: Sendable {
|
|
public var name: String
|
|
public var origin: URL
|
|
public var tags: [String]
|
|
public var password: String?
|
|
|
|
public init(
|
|
name: String,
|
|
origin: URL,
|
|
tags: [String] = [],
|
|
password: String? = nil
|
|
) {
|
|
self.name = name
|
|
self.origin = origin
|
|
self.tags = tags
|
|
self.password = password
|
|
}
|
|
}
|
|
|
|
public struct InstancePatch: Sendable {
|
|
public var name: String?
|
|
public var origin: URL?
|
|
public var tags: [String]?
|
|
public var password: String?
|
|
|
|
public init(
|
|
name: String? = nil,
|
|
origin: URL? = nil,
|
|
tags: [String]? = nil,
|
|
password: String? = nil
|
|
) {
|
|
self.name = name
|
|
self.origin = origin
|
|
self.tags = tags
|
|
self.password = password
|
|
}
|
|
}
|
|
|
|
public struct InstanceQuery: Sendable {
|
|
public var search: String?
|
|
public var tags: [String]?
|
|
|
|
public init(search: String? = nil, tags: [String]? = nil) {
|
|
self.search = search
|
|
self.tags = tags
|
|
}
|
|
}
|
|
|
|
public protocol InstanceRepository: Sendable {
|
|
func list(_ query: InstanceQuery) async throws -> [Instance]
|
|
func get(_ id: UUID) async throws -> Instance?
|
|
func create(_ input: InstanceInput) async throws -> Instance
|
|
func update(_ id: UUID, expectedRevision: Int, _ patch: InstancePatch) async throws -> Instance
|
|
func delete(_ id: UUID, expectedRevision: Int) async throws
|
|
}
|