diff --git a/LeStorage/Codables/DataAccess.swift b/LeStorage/Codables/DataAccess.swift index 56f7399..767464b 100644 --- a/LeStorage/Codables/DataAccess.swift +++ b/LeStorage/Codables/DataAccess.swift @@ -14,24 +14,22 @@ class DataAccess: SyncedModelObject, SyncedStorable { static func relationships() -> [Relationship] { return [] } var id: String = Store.randomId() - var owner: String var sharedWith: [String] var modelName: String var modelId: String var grantedAt: Date = Date() init(owner: String, sharedWith: [String], modelName: String, modelId: String) { - self.owner = owner self.sharedWith = sharedWith self.modelName = modelName self.modelId = modelId super.init() + self.relatedUser = owner } // Codable implementation enum CodingKeys: String, CodingKey { case id - case owner case sharedWith case modelName case modelId @@ -41,7 +39,6 @@ class DataAccess: SyncedModelObject, SyncedStorable { required init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) id = try container.decode(String.self, forKey: .id) - owner = try container.decode(String.self, forKey: .owner) sharedWith = try container.decode([String].self, forKey: .sharedWith) modelName = try container.decode(String.self, forKey: .modelName) modelId = try container.decode(String.self, forKey: .modelId) @@ -52,7 +49,6 @@ class DataAccess: SyncedModelObject, SyncedStorable { override func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(id, forKey: .id) - try container.encode(owner, forKey: .owner) try container.encode(sharedWith, forKey: .sharedWith) try container.encode(modelName, forKey: .modelName) try container.encode(modelId, forKey: .modelId) @@ -63,14 +59,10 @@ class DataAccess: SyncedModelObject, SyncedStorable { func copy(from other: any Storable) { guard let dataAccess = other as? DataAccess else { return } self.id = dataAccess.id - self.owner = dataAccess.owner self.sharedWith = dataAccess.sharedWith self.modelName = dataAccess.modelName self.modelId = dataAccess.modelId self.grantedAt = dataAccess.grantedAt -// self.lastHierarchyUpdate = dataAccess.lastHierarchyUpdate } -// var lastHierarchyUpdate: Date - } diff --git a/LeStorage/ModelObject.swift b/LeStorage/ModelObject.swift index 24b0f22..ef9aa90 100644 --- a/LeStorage/ModelObject.swift +++ b/LeStorage/ModelObject.swift @@ -53,6 +53,7 @@ open class BaseModelObject: ModelObject, Codable { open class SyncedModelObject: BaseModelObject { + public var relatedUser: String? = nil public var lastUpdate: Date = Date() public var shared: Bool? @@ -61,6 +62,7 @@ open class SyncedModelObject: BaseModelObject { } enum CodingKeys: String, CodingKey { + case relatedUser case lastUpdate case shared = "_shared" } @@ -68,6 +70,7 @@ open class SyncedModelObject: BaseModelObject { // Required initializer for Decodable required public init(from decoder: Decoder) throws { let container = try decoder.container(keyedBy: CodingKeys.self) + self.relatedUser = try container.decodeIfPresent(String.self, forKey: .relatedUser) self.lastUpdate = try container.decodeIfPresent(Date.self, forKey: .lastUpdate) ?? Date() self.shared = try container.decodeIfPresent(Bool.self, forKey: .shared) @@ -77,6 +80,7 @@ open class SyncedModelObject: BaseModelObject { // Required method for Encodable open override func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(relatedUser, forKey: .relatedUser) try container.encode(lastUpdate, forKey: .lastUpdate) if self.shared == true { try container.encodeIfPresent(shared, forKey: .shared) diff --git a/LeStorage/StoreCenter.swift b/LeStorage/StoreCenter.swift index 1f6645c..9e0a335 100644 --- a/LeStorage/StoreCenter.swift +++ b/LeStorage/StoreCenter.swift @@ -68,8 +68,8 @@ public class StoreCenter { } } - public func configureURLs(httpScheme: String, domain: String) { - let urlManager: URLManager = URLManager(httpScheme: httpScheme, domain: domain) + public func configureURLs(secureScheme: Bool, domain: String) { + let urlManager: URLManager = URLManager(secureScheme: secureScheme, domain: domain) self._urlManager = urlManager self._services = Services(url: urlManager.api) self._dataAccess = Store.main.registerSynchronizedCollection() @@ -95,6 +95,10 @@ public class StoreCenter { Logger.log("websocket configured: \(url)") } + public var apiURL: String? { + return self._urlManager?.api + } + /// Returns the service instance public func service() throws -> Services { if let service = self._services { diff --git a/LeStorage/StoredCollection+Sync.swift b/LeStorage/StoredCollection+Sync.swift index 1bd1413..59b817e 100644 --- a/LeStorage/StoredCollection+Sync.swift +++ b/LeStorage/StoredCollection+Sync.swift @@ -94,15 +94,15 @@ extension StoredCollection: SomeSyncedCollection where T : SyncedStorable { } /// Deletes the instance in the collection without synchronization - func revokeByStringIdNoSync(_ id: String) { - defer { - self.setChanged() - } - let realId = T.buildRealId(id: id) - if let instance = self.findById(realId) { - self.deleteItemIfUnused(instance) - } - } +// func revokeByStringIdNoSync(_ id: String) { +// defer { +// self.setChanged() +// } +// let realId = T.buildRealId(id: id) +// if let instance = self.findById(realId) { +// self.deleteItemIfUnused(instance) +// } +// } // fileprivate func _buildRealId(id: String) -> T.ID? { // switch T.ID.self { diff --git a/LeStorage/Utils/URLManager.swift b/LeStorage/Utils/URLManager.swift index f1e0ff7..e293a1f 100644 --- a/LeStorage/Utils/URLManager.swift +++ b/LeStorage/Utils/URLManager.swift @@ -9,7 +9,7 @@ import Foundation struct URLManager { - var httpScheme: String + var secureScheme: Bool var domain: String private let apiPath: String = "roads" @@ -18,7 +18,22 @@ struct URLManager { } func websocket(userId: String) -> String { - return "ws://\(self.domain)/ws/user/\(userId)/" + return "\(self.wsScheme)\(self.domain)/ws/user/\(userId)/" + } + + var httpScheme: String { + if self.secureScheme { + return "https://" + } else { + return "http://" + } } + var wsScheme: String { + if self.secureScheme { + return "wss://" + } else { + return "ws://" + } + } } diff --git a/LeStorage/WebSocketManager.swift b/LeStorage/WebSocketManager.swift index 4b360f0..c31981e 100644 --- a/LeStorage/WebSocketManager.swift +++ b/LeStorage/WebSocketManager.swift @@ -29,10 +29,12 @@ class WebSocketManager: ObservableObject { private func _setupWebSocket() { // guard let url = URL(string: "ws://127.0.0.1:8000/ws/user/test/") else { guard let url = URL(string: self._url) else { - print("Invalid URL") + Logger.w("Invalid URL: \(self._url)") return } + Logger.log(">>> configure websockets with: \(url)") + let session = URLSession(configuration: .default) _webSocketTask = session.webSocketTask(with: url) _webSocketTask?.resume() @@ -50,14 +52,14 @@ class WebSocketManager: ObservableObject { _webSocketTask?.receive { result in switch result { case .failure(let error): -// print("Error in receiving message: \(error)") + print("Error in receiving message: \(error)") self._handleWebSocketError(error) // self._setupWebSocket() case .success(let message): switch message { - case .string: -// print("Received text: \(text)") + case .string(let text): + print("Received text: \(text)") Task { do { try await StoreCenter.main.synchronizeLastUpdates() @@ -69,12 +71,12 @@ class WebSocketManager: ObservableObject { // DispatchQueue.main.async { // self.messages.append(text) // } - case .data: + case .data(let data): + print("Received binary message: \(data)") break -// print("Received binary message: \(data)") @unknown default: + print("received other = \(message)") break -// print("received other = \(message)") } self._receiveMessage()