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 [] } static func relationships() -> [Relationship] { return [] }
var id: String = Store.randomId() var id: String = Store.randomId()
var owner: String
var sharedWith: [String] var sharedWith: [String]
var modelName: String var modelName: String
var modelId: String var modelId: String
var grantedAt: Date = Date() var grantedAt: Date = Date()
init(owner: String, sharedWith: [String], modelName: String, modelId: String) { init(owner: String, sharedWith: [String], modelName: String, modelId: String) {
self.owner = owner
self.sharedWith = sharedWith self.sharedWith = sharedWith
self.modelName = modelName self.modelName = modelName
self.modelId = modelId self.modelId = modelId
super.init() super.init()
self.relatedUser = owner
} }
// Codable implementation // Codable implementation
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case id case id
case owner
case sharedWith case sharedWith
case modelName case modelName
case modelId case modelId
@ -41,7 +39,6 @@ class DataAccess: SyncedModelObject, SyncedStorable {
required init(from decoder: Decoder) throws { required init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self) let container = try decoder.container(keyedBy: CodingKeys.self)
id = try container.decode(String.self, forKey: .id) id = try container.decode(String.self, forKey: .id)
owner = try container.decode(String.self, forKey: .owner)
sharedWith = try container.decode([String].self, forKey: .sharedWith) sharedWith = try container.decode([String].self, forKey: .sharedWith)
modelName = try container.decode(String.self, forKey: .modelName) modelName = try container.decode(String.self, forKey: .modelName)
modelId = try container.decode(String.self, forKey: .modelId) modelId = try container.decode(String.self, forKey: .modelId)
@ -52,7 +49,6 @@ class DataAccess: SyncedModelObject, SyncedStorable {
override func encode(to encoder: Encoder) throws { override func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(id, forKey: .id) try container.encode(id, forKey: .id)
try container.encode(owner, forKey: .owner)
try container.encode(sharedWith, forKey: .sharedWith) try container.encode(sharedWith, forKey: .sharedWith)
try container.encode(modelName, forKey: .modelName) try container.encode(modelName, forKey: .modelName)
try container.encode(modelId, forKey: .modelId) try container.encode(modelId, forKey: .modelId)
@ -63,14 +59,10 @@ class DataAccess: SyncedModelObject, SyncedStorable {
func copy(from other: any Storable) { func copy(from other: any Storable) {
guard let dataAccess = other as? DataAccess else { return } guard let dataAccess = other as? DataAccess else { return }
self.id = dataAccess.id self.id = dataAccess.id
self.owner = dataAccess.owner
self.sharedWith = dataAccess.sharedWith self.sharedWith = dataAccess.sharedWith
self.modelName = dataAccess.modelName self.modelName = dataAccess.modelName
self.modelId = dataAccess.modelId self.modelId = dataAccess.modelId
self.grantedAt = dataAccess.grantedAt self.grantedAt = dataAccess.grantedAt
// self.lastHierarchyUpdate = dataAccess.lastHierarchyUpdate
} }
// var lastHierarchyUpdate: Date
} }

@ -53,6 +53,7 @@ open class BaseModelObject: ModelObject, Codable {
open class SyncedModelObject: BaseModelObject { open class SyncedModelObject: BaseModelObject {
public var relatedUser: String? = nil
public var lastUpdate: Date = Date() public var lastUpdate: Date = Date()
public var shared: Bool? public var shared: Bool?
@ -61,6 +62,7 @@ open class SyncedModelObject: BaseModelObject {
} }
enum CodingKeys: String, CodingKey { enum CodingKeys: String, CodingKey {
case relatedUser
case lastUpdate case lastUpdate
case shared = "_shared" case shared = "_shared"
} }
@ -68,6 +70,7 @@ open class SyncedModelObject: BaseModelObject {
// Required initializer for Decodable // Required initializer for Decodable
required public init(from decoder: Decoder) throws { required public init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self) 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.lastUpdate = try container.decodeIfPresent(Date.self, forKey: .lastUpdate) ?? Date()
self.shared = try container.decodeIfPresent(Bool.self, forKey: .shared) self.shared = try container.decodeIfPresent(Bool.self, forKey: .shared)
@ -77,6 +80,7 @@ open class SyncedModelObject: BaseModelObject {
// Required method for Encodable // Required method for Encodable
open override func encode(to encoder: Encoder) throws { open override func encode(to encoder: Encoder) throws {
var container = encoder.container(keyedBy: CodingKeys.self) var container = encoder.container(keyedBy: CodingKeys.self)
try container.encode(relatedUser, forKey: .relatedUser)
try container.encode(lastUpdate, forKey: .lastUpdate) try container.encode(lastUpdate, forKey: .lastUpdate)
if self.shared == true { if self.shared == true {
try container.encodeIfPresent(shared, forKey: .shared) try container.encodeIfPresent(shared, forKey: .shared)

@ -68,8 +68,8 @@ public class StoreCenter {
} }
} }
public func configureURLs(httpScheme: String, domain: String) { public func configureURLs(secureScheme: Bool, domain: String) {
let urlManager: URLManager = URLManager(httpScheme: httpScheme, domain: domain) let urlManager: URLManager = URLManager(secureScheme: secureScheme, domain: domain)
self._urlManager = urlManager self._urlManager = urlManager
self._services = Services(url: urlManager.api) self._services = Services(url: urlManager.api)
self._dataAccess = Store.main.registerSynchronizedCollection() self._dataAccess = Store.main.registerSynchronizedCollection()
@ -95,6 +95,10 @@ public class StoreCenter {
Logger.log("websocket configured: \(url)") Logger.log("websocket configured: \(url)")
} }
public var apiURL: String? {
return self._urlManager?.api
}
/// Returns the service instance /// Returns the service instance
public func service() throws -> Services { public func service() throws -> Services {
if let service = self._services { if let service = self._services {

@ -94,15 +94,15 @@ extension StoredCollection: SomeSyncedCollection where T : SyncedStorable {
} }
/// Deletes the instance in the collection without synchronization /// Deletes the instance in the collection without synchronization
func revokeByStringIdNoSync(_ id: String) { // func revokeByStringIdNoSync(_ id: String) {
defer { // defer {
self.setChanged() // self.setChanged()
} // }
let realId = T.buildRealId(id: id) // let realId = T.buildRealId(id: id)
if let instance = self.findById(realId) { // if let instance = self.findById(realId) {
self.deleteItemIfUnused(instance) // self.deleteItemIfUnused(instance)
} // }
} // }
// fileprivate func _buildRealId(id: String) -> T.ID? { // fileprivate func _buildRealId(id: String) -> T.ID? {
// switch T.ID.self { // switch T.ID.self {

@ -9,7 +9,7 @@ import Foundation
struct URLManager { struct URLManager {
var httpScheme: String var secureScheme: Bool
var domain: String var domain: String
private let apiPath: String = "roads" private let apiPath: String = "roads"
@ -18,7 +18,22 @@ struct URLManager {
} }
func websocket(userId: String) -> String { 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() { private func _setupWebSocket() {
// guard let url = URL(string: "ws://127.0.0.1:8000/ws/user/test/") else { // guard let url = URL(string: "ws://127.0.0.1:8000/ws/user/test/") else {
guard let url = URL(string: self._url) else { guard let url = URL(string: self._url) else {
print("Invalid URL") Logger.w("Invalid URL: \(self._url)")
return return
} }
Logger.log(">>> configure websockets with: \(url)")
let session = URLSession(configuration: .default) let session = URLSession(configuration: .default)
_webSocketTask = session.webSocketTask(with: url) _webSocketTask = session.webSocketTask(with: url)
_webSocketTask?.resume() _webSocketTask?.resume()
@ -50,14 +52,14 @@ class WebSocketManager: ObservableObject {
_webSocketTask?.receive { result in _webSocketTask?.receive { result in
switch result { switch result {
case .failure(let error): case .failure(let error):
// print("Error in receiving message: \(error)") print("Error in receiving message: \(error)")
self._handleWebSocketError(error) self._handleWebSocketError(error)
// self._setupWebSocket() // self._setupWebSocket()
case .success(let message): case .success(let message):
switch message { switch message {
case .string: case .string(let text):
// print("Received text: \(text)") print("Received text: \(text)")
Task { Task {
do { do {
try await StoreCenter.main.synchronizeLastUpdates() try await StoreCenter.main.synchronizeLastUpdates()
@ -69,12 +71,12 @@ class WebSocketManager: ObservableObject {
// DispatchQueue.main.async { // DispatchQueue.main.async {
// self.messages.append(text) // self.messages.append(text)
// } // }
case .data: case .data(let data):
print("Received binary message: \(data)")
break break
// print("Received binary message: \(data)")
@unknown default: @unknown default:
print("received other = \(message)")
break break
// print("received other = \(message)")
} }
self._receiveMessage() self._receiveMessage()

Loading…
Cancel
Save