// // LocalKeysStore.swift // Zyquo Router // // Author: Simon-Pierre Boucher // Mail: contact@spboucher.ai // // Local router API keys (`zyquo-sk-…`): create (token shown once), rename, // enable/disable, revoke. Hashes persist in local-keys.json; the server // snapshot is taken at Start. // import Foundation @MainActor final class LocalKeysStore: ObservableObject { static let fileName = "local-keys.json" @Published private(set) var keys: [APIKeyRecord] private let persistence: PersistenceService init(persistence: PersistenceService = .shared) { self.persistence = persistence keys = persistence.load([APIKeyRecord].self, from: Self.fileName) ?? [] } /// Creates a key and returns the plaintext token — shown exactly once. func create(name: String) -> String { let (record, token) = APIKeyRecord.generate(name: name.isEmpty ? "Untitled key" : name) keys.append(record) save() return token } func setEnabled(_ enabled: Bool, for id: UUID) { guard let index = keys.firstIndex(where: { $0.id == id }) else { return } keys[index].enabled = enabled save() } func revoke(_ id: UUID) { keys.removeAll { $0.id == id } save() } var hasEnabledKey: Bool { keys.contains(where: \.enabled) } private func save() { persistence.save(keys, to: Self.fileName) } }