Adds relatedUser to SyncedModel and other changes

sync2
Laurent 11 months ago
parent cef665f166
commit 4542e42985
  1. 10
      LeStorage/Codables/DataAccess.swift
  2. 4
      LeStorage/ModelObject.swift
  3. 8
      LeStorage/StoreCenter.swift
  4. 18
      LeStorage/StoredCollection+Sync.swift
  5. 19
      LeStorage/Utils/URLManager.swift
  6. 16
      LeStorage/WebSocketManager.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
}

@ -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)

@ -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 {

@ -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 {

@ -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://"
}
}
}

@ -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()

Loading…
Cancel
Save