2026-10-17 10:13:26 -07:00
|
|
|
import Foundation
|
|
|
|
|
import SwiftData
|
|
|
|
|
|
|
|
|
|
@Model
|
|
|
|
|
final class ServerRecord {
|
|
|
|
|
var origin = ""
|
|
|
|
|
var saved = Date.distantPast
|
2026-10-18 20:58:56 -07:00
|
|
|
var color = 0
|
2026-10-17 10:13:26 -07:00
|
|
|
|
2026-10-18 20:58:56 -07:00
|
|
|
init(origin: String, color: Int) {
|
2026-10-17 10:13:26 -07:00
|
|
|
self.origin = origin
|
2026-10-18 20:58:56 -07:00
|
|
|
self.color = color
|
2026-10-17 10:13:26 -07:00
|
|
|
saved = Date()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Model
|
|
|
|
|
final class DraftRecord {
|
|
|
|
|
var scope = ""
|
|
|
|
|
var json = Data()
|
|
|
|
|
var saved = Date.distantPast
|
|
|
|
|
|
|
|
|
|
init(scope: String, json: Data) {
|
|
|
|
|
self.scope = scope
|
|
|
|
|
self.json = json
|
|
|
|
|
saved = Date()
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Model
|
|
|
|
|
final class VisitRecord {
|
|
|
|
|
var taskId = ""
|
|
|
|
|
var at = 0.0
|
|
|
|
|
|
|
|
|
|
init(taskId: String, at: Double) {
|
|
|
|
|
self.taskId = taskId
|
|
|
|
|
self.at = at
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private let container: ModelContainer = {
|
|
|
|
|
let schema = Schema([ServerRecord.self, DraftRecord.self, VisitRecord.self])
|
2026-10-17 10:54:06 -07:00
|
|
|
let dir = URL.applicationSupportDirectory.appending(path: "run.fc.byre.mac", directoryHint: .isDirectory)
|
2026-10-17 10:13:26 -07:00
|
|
|
do {
|
2026-10-17 10:54:06 -07:00
|
|
|
try FileManager.default.createDirectory(at: dir, withIntermediateDirectories: true)
|
|
|
|
|
return try ModelContainer(for: schema, configurations: ModelConfiguration(schema: schema, url: dir.appending(path: "byre.store"), cloudKitDatabase: .private("iCloud.run.fc.byre.mac")))
|
2026-10-17 10:13:26 -07:00
|
|
|
} catch {
|
|
|
|
|
fatalError("open persistent store: \(error)")
|
|
|
|
|
}
|
|
|
|
|
}()
|
|
|
|
|
|
|
|
|
|
@MainActor
|
|
|
|
|
var persistence: ModelContext {
|
|
|
|
|
container.mainContext
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@MainActor
|
|
|
|
|
func fetchRecords<T: PersistentModel>(_ descriptor: FetchDescriptor<T>) -> [T] {
|
|
|
|
|
do {
|
|
|
|
|
return try persistence.fetch(descriptor)
|
|
|
|
|
} catch {
|
|
|
|
|
log.error("fetch \(String(describing: T.self), privacy: .public): \(String(describing: error), privacy: .public)")
|
|
|
|
|
return []
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@MainActor
|
|
|
|
|
func saveRecords() {
|
|
|
|
|
do {
|
|
|
|
|
try persistence.save()
|
|
|
|
|
} catch {
|
|
|
|
|
log.error("save records: \(String(describing: error), privacy: .public)")
|
|
|
|
|
}
|
|
|
|
|
}
|