101 lines
3.2 KiB
Swift
101 lines
3.2 KiB
Swift
import Foundation
|
|
import GRDB
|
|
import Network
|
|
|
|
public class Profile: Record, Identifiable, ObservableObject {
|
|
public var id: Int64?
|
|
public var mustID: Int64 {
|
|
id!
|
|
}
|
|
|
|
@Published public var name: String
|
|
public var order: UInt32
|
|
public var type: ProfileType
|
|
public var path: String
|
|
@Published public var remoteURL: String?
|
|
@Published public var autoUpdate: Bool
|
|
@Published public var autoUpdateInterval: Int32
|
|
public var lastUpdated: Date?
|
|
|
|
public init(id: Int64? = nil, name: String, order: UInt32 = 0, type: ProfileType, path: String, remoteURL: String? = nil, autoUpdate: Bool = false, autoUpdateInterval: Int32 = 0, lastUpdated: Date? = nil) {
|
|
self.id = id
|
|
self.name = name
|
|
self.order = order
|
|
self.type = type
|
|
self.path = path
|
|
self.remoteURL = remoteURL
|
|
self.autoUpdate = autoUpdate
|
|
self.autoUpdateInterval = autoUpdateInterval
|
|
self.lastUpdated = lastUpdated
|
|
super.init()
|
|
}
|
|
|
|
override public class var databaseTableName: String {
|
|
"profiles"
|
|
}
|
|
|
|
enum Columns: String, ColumnExpression {
|
|
case id, name, order, type, path, remoteURL, autoUpdate, autoUpdateInterval, lastUpdated, userAgent
|
|
}
|
|
|
|
required init(row: Row) throws {
|
|
id = row[Columns.id]
|
|
name = row[Columns.name] ?? ""
|
|
order = row[Columns.order] ?? 0
|
|
type = ProfileType(rawValue: row[Columns.type] ?? ProfileType.local.rawValue)!
|
|
path = row[Columns.path] ?? ""
|
|
remoteURL = row[Columns.remoteURL] ?? ""
|
|
autoUpdate = row[Columns.autoUpdate] ?? false
|
|
autoUpdateInterval = row[Columns.autoUpdateInterval] ?? 0
|
|
lastUpdated = row[Columns.lastUpdated] ?? Date()
|
|
try super.init(row: row)
|
|
}
|
|
|
|
override public func encode(to container: inout PersistenceContainer) throws {
|
|
container[Columns.id] = id
|
|
container[Columns.name] = name
|
|
container[Columns.order] = order
|
|
container[Columns.type] = type.rawValue
|
|
container[Columns.path] = path
|
|
container[Columns.remoteURL] = remoteURL
|
|
container[Columns.autoUpdate] = autoUpdate
|
|
container[Columns.autoUpdateInterval] = autoUpdateInterval
|
|
container[Columns.lastUpdated] = lastUpdated
|
|
}
|
|
|
|
override public func didInsert(_ inserted: InsertionSuccess) {
|
|
super.didInsert(inserted)
|
|
id = inserted.rowID
|
|
}
|
|
}
|
|
|
|
public struct ProfilePreview: Identifiable, Hashable {
|
|
public let id: Int64
|
|
public let name: String
|
|
public var order: UInt32
|
|
public let type: ProfileType
|
|
public let path: String
|
|
public let remoteURL: String?
|
|
public let autoUpdate: Bool
|
|
public let autoUpdateInterval: Int32
|
|
public let lastUpdated: Date?
|
|
public let origin: Profile
|
|
|
|
public init(_ profile: Profile) {
|
|
id = profile.mustID
|
|
name = profile.name
|
|
order = profile.order
|
|
type = profile.type
|
|
path = profile.path
|
|
remoteURL = profile.remoteURL
|
|
autoUpdate = profile.autoUpdate
|
|
autoUpdateInterval = profile.autoUpdateInterval
|
|
lastUpdated = profile.lastUpdated
|
|
origin = profile
|
|
}
|
|
}
|
|
|
|
public enum ProfileType: Int {
|
|
case local = 0, icloud, remote
|
|
}
|