diff --git a/Package.swift b/Package.swift index 39491b404d64670299dd35279db2d3264e4297e3..bf419b1d337afe4e8dc8bd9459758d0a1a658a23 100644 --- a/Package.swift +++ b/Package.swift @@ -53,7 +53,7 @@ let package = Package( dependencies: [ .package( url: "https://git.xx.network/elixxir/client-ios-db.git", - revision: "e1b3b1a8d1df6d259c99289e8d09e73fbfa9fe63" + revision: "2e51a960216340cf12a4c6cbc7ac18a9f07d5ee6" ), .package(url: "https://github.com/Quick/Quick", from: "3.0.0"), .package(url: "https://github.com/Quick/Nimble", from: "9.0.0"), diff --git a/Sources/Integration/Interfaces/BindingsInterface.swift b/Sources/Integration/Interfaces/BindingsInterface.swift index 34e0e4207c6e1f7625cec55ddf44d7946fa18e7a..f56ebccb463d6dd908e1d979fc5b29059bef4f84 100644 --- a/Sources/Integration/Interfaces/BindingsInterface.swift +++ b/Sources/Integration/Interfaces/BindingsInterface.swift @@ -1,6 +1,7 @@ import Models -import Foundation import Combine +import XXModels +import Foundation public enum MessageDeliveryStatus { case sent diff --git a/Sources/Integration/Interfaces/UserDiscoveryInterface.swift b/Sources/Integration/Interfaces/UserDiscoveryInterface.swift index 07398985fd1a25e500bb9015832d18e07226b57b..ded311ecdf19e7b179b2f91d325588f57a33ff2d 100644 --- a/Sources/Integration/Interfaces/UserDiscoveryInterface.swift +++ b/Sources/Integration/Interfaces/UserDiscoveryInterface.swift @@ -1,4 +1,5 @@ import Models +import XXModels import Foundation public struct LookupResult { diff --git a/Sources/Integration/Mocks/BindingsMock.swift b/Sources/Integration/Mocks/BindingsMock.swift index 8eaf8a0688d3efdaab0ba1ccedad20bd4b6c7577..901ff8e6aa05b0d3d8d4408aafaef874fba4a0dd 100644 --- a/Sources/Integration/Mocks/BindingsMock.swift +++ b/Sources/Integration/Mocks/BindingsMock.swift @@ -1,5 +1,6 @@ import Models import Combine +import XXModels import Foundation public final class BindingsMock: BindingsInterface { diff --git a/Sources/Integration/Mocks/UserDiscoveryMock.swift b/Sources/Integration/Mocks/UserDiscoveryMock.swift index 910faf080c1b476af9c63677a25a6211f8f8a448..86458744e191bd1d5e65ca1748e8a8943d7b3dbd 100644 --- a/Sources/Integration/Mocks/UserDiscoveryMock.swift +++ b/Sources/Integration/Mocks/UserDiscoveryMock.swift @@ -1,4 +1,5 @@ import Models +import XXModels import Foundation final class UserDiscoveryMock: UserDiscoveryInterface { diff --git a/Sources/Integration/Session/Session+Contacts.swift b/Sources/Integration/Session/Session+Contacts.swift index c78c8fa3ebdbba5094db6c9c10c52b1506810a82..af09d6096fce1ad59cd9f7b76b53a3a911770219 100644 --- a/Sources/Integration/Session/Session+Contacts.swift +++ b/Sources/Integration/Session/Session+Contacts.swift @@ -51,7 +51,7 @@ extension Session { log(string: "Verified \(contact.username)", type: .info) do { - try self.dbManager.save(contact) + try self.dbManager.saveContact(contact) } catch { log(string: error.localizedDescription, type: .error) } @@ -61,7 +61,7 @@ extension Session { contact.status = .verificationFailed do { - try self.dbManager.save(contact) + try self.dbManager.saveContact(contact) } catch { log(string: error.localizedDescription, type: .error) } @@ -210,38 +210,6 @@ extension Session { } } - public func update(_ contact: Contact) { - do { - if var stored = try dbManager.fetch(.withUsername(contact.username)).first as Contact? { - stored.email = contact.email - stored.photo = contact.photo - stored.phone = contact.phone - stored.nickname = contact.nickname - stored.isRecent = contact.isRecent - stored.createdAt = contact.createdAt - try dbManager.save(stored) - - try dbManager.updateAll( - GroupMember.self, - GroupMember.Request.withUserId(stored.userId), - with: [GroupMember.Column.photo.set(to: stored.photo)] - ) - } - } catch { - log(string: "Error updating a contact: \(error.localizedDescription)", type: .error) - } - } - - public func delete<T: Persistable>(_ model: T, isRequest: Bool = false) { - log(string: "Deleting a model...", type: .info) - - do { - try dbManager.delete(model) - } catch { - log(string: "Error deleting a model: \(error.localizedDescription)", type: .error) - } - } - public func find(by username: String) -> Contact? { log(string: "Trying to find contact with username: \(username)", type: .info) diff --git a/Sources/Integration/Session/Session.swift b/Sources/Integration/Session/Session.swift index bb47d1249eab7b950e47ce6f814eeb77332f557a..6c48b77c8fcb3a1be1fb55290ec1baa846da3a7d 100644 --- a/Sources/Integration/Session/Session.swift +++ b/Sources/Integration/Session/Session.swift @@ -4,6 +4,7 @@ import Shared import Combine import Defaults import XXModels +import XXDatabase import Foundation import BackupFeature import NetworkMonitor @@ -88,7 +89,7 @@ public final class Session: SessionType { os_signpost(.end, log: logHandler, name: "Decrypting", "Finished newClientFromBackup") self.client = client - dbManager = GRDBDatabaseManager() + dbManager = try Database.inMemory() let report = try! JSONDecoder().decode(BackupReport.self, from: backupData!) @@ -110,13 +111,11 @@ public final class Session: SessionType { public init(ndf: String) throws { let network = try! DependencyInjection.Container.shared.resolve() as XXNetworking self.client = try network.newClient(ndf: ndf) - dbManager = GRDBDatabaseManager() + dbManager = try Database.inMemory() try continueInitialization() } private func continueInitialization() throws { - try dbManager.setup() - setupBindings() networkMonitor.start() @@ -127,13 +126,8 @@ public final class Session: SessionType { registerUnfinishedTransfers() - if let pendingVerificationUsers: [Contact] = try? dbManager.fetch(.verificationInProgress) { - pendingVerificationUsers.forEach { - var contact = $0 - contact.status = .verificationFailed - _ = try? dbManager.save(contact) - } - } + let query = Contact.Query(authStatus: [.verificationInProgress]) + _ = try? dbManager.bulkUpdateContacts(query, .init(authStatus: .verificationFailed)) } public func setDummyTraffic(status: Bool) { @@ -155,7 +149,7 @@ public final class Session: SessionType { guard self.hasRunningTasks == false else { throw NSError.create("") } }.finalCatch { _ in fatalError("Couldn't delete account because network is not stopping") } - dbManager.drop() + try? dbManager.drop() FileManager.xxCleanup() email = nil @@ -175,69 +169,39 @@ public final class Session: SessionType { inappnotifications = true } - public func hideRequestOf(group: Group) { - var group = group - group.status = .hidden - _ = try? dbManager.save(group) - } - - public func hideRequestOf(contact: Contact) { - var contact = contact - contact.status = .hidden - _ = try? dbManager.save(contact) - } - - public func forceFailMessages() { - if let pendingE2E: [Message] = try? dbManager.fetch(.sending) { - pendingE2E.forEach { - var message = $0 - message.status = .failedToSend - _ = try? dbManager.save(message) - } - } - - if let pendingGroupMessages: [GroupMessage] = try? dbManager.fetch(.sending) { - pendingGroupMessages.forEach { - var message = $0 - message.status = .failed - _ = try? dbManager.save(message) - } - } - } - private func registerUnfinishedTransfers() { - guard let unfinisheds: [Message] = try? dbManager.fetch(.sendingAttachment), !unfinisheds.isEmpty else { return } - - for var message in unfinisheds { - guard let tid = message.payload.attachment?.transferId else { return } - - do { - try client.transferManager?.listenUploadFromTransfer(with: tid) { completed, sent, arrived, total, error in - if completed { - message.status = .sent - message.payload.attachment?.progress = 1.0 - - if let transfer: FileTransfer = try? self.dbManager.fetch(.withTID(tid)).first { - try? self.dbManager.delete(transfer) - } - } else { - if let error = error { - log(string: error.localizedDescription, type: .error) - message.status = .failedToSend - } else { - let progress = Float(arrived)/Float(total) - message.payload.attachment?.progress = progress - return - } - } - - _ = try? self.dbManager.save(message) - } - } catch { - message.status = .sent - _ = try? self.dbManager.save(message) - } - } +// guard let unfinisheds: [Message] = try? dbManager.fetch(.sendingAttachment), !unfinisheds.isEmpty else { return } +// +// for var message in unfinisheds { +// guard let tid = message.payload.attachment?.transferId else { return } +// +// do { +// try client.transferManager?.listenUploadFromTransfer(with: tid) { completed, sent, arrived, total, error in +// if completed { +// message.status = .sent +// message.payload.attachment?.progress = 1.0 +// +// if let transfer: FileTransfer = try? self.dbManager.fetch(.withTID(tid)).first { +// try? self.dbManager.delete(transfer) +// } +// } else { +// if let error = error { +// log(string: error.localizedDescription, type: .error) +// message.status = .failedToSend +// } else { +// let progress = Float(arrived)/Float(total) +// message.payload.attachment?.progress = progress +// return +// } +// } +// +// _ = try? self.dbManager.save(message) +// } +// } catch { +// message.status = .sent +// _ = try? self.dbManager.save(message) +// } +// } } func updateFactsOnBackup() { @@ -277,7 +241,7 @@ public final class Session: SessionType { }.store(in: &cancellables) client.requestsSent - .sink { [unowned self] in _ = try? dbManager.save($0) } + .sink { [unowned self] in _ = try? dbManager.saveContact($0) } .store(in: &cancellables) client.backup @@ -292,7 +256,7 @@ public final class Session: SessionType { /// var contact = $0 contact.status = .friend - _ = try? dbManager.save(contact) + _ = try? dbManager.saveContact(contact) }.store(in: &cancellables) backupService.settingsPublisher @@ -321,7 +285,7 @@ public final class Session: SessionType { .store(in: &cancellables) client.groupMessages - .sink { [unowned self] in _ = try? dbManager.save($0) } + .sink { [unowned self] in _ = try? dbManager.saveMessage($0) } .store(in: &cancellables) client.messages @@ -357,7 +321,7 @@ public final class Session: SessionType { contact.status = .friend contact.isRecent = true contact.createdAt = Date() - _ = try? dbManager.save(contact) + _ = try? dbManager.saveContact(contact) toastController.enqueueToast(model: .init( title: contact.nickname ?? contact.username, @@ -367,24 +331,4 @@ public final class Session: SessionType { } }.store(in: &cancellables) } - - public func getTextFromMessage(messageId: Data) -> String? { - guard let message: Message = try? dbManager.fetch(.withUniqueId(messageId)).first else { return nil } - return message.payload.text - } - - public func getTextFromGroupMessage(messageId: Data) -> String? { - guard let message: GroupMessage = try? dbManager.fetch(.withUniqueId(messageId)).first else { return nil } - return message.payload.text - } - - public func getContactWith(userId: Data) -> Contact? { - let contact: Contact? = try? dbManager.fetch(.withUserId(userId)).first - return contact - } - - public func getGroupChatInfoWith(groupId: Data) -> GroupChatInfo? { - let info: GroupChatInfo? = try? dbManager.fetch(.fromGroup(groupId)).first - return info - } } diff --git a/Sources/Integration/Session/SessionType.swift b/Sources/Integration/Session/SessionType.swift index e32ecf0ad1e8a8a7b159550670909c517e8d012b..0c5d67824121e6282376872a3fd17b096bd23cda 100644 --- a/Sources/Integration/Session/SessionType.swift +++ b/Sources/Integration/Session/SessionType.swift @@ -12,12 +12,6 @@ public protocol SessionType { func deleteMyself() throws func getId(from: Data) -> Data? - func forceFailMessages() - - func hideRequestOf(group: Group) - - func hideRequestOf(contact: Contact) - func send(imageData: Data, to: Contact, completion: @escaping (Result<Void, Error>) -> Void) func verify(contact: Contact) @@ -54,17 +48,11 @@ public protocol SessionType { func delete(groupMessages: [Int64]) func send(_: Payload, toContact: Contact) - func getTextFromMessage(messageId: Data) -> String? - func getTextFromGroupMessage(messageId: Data) -> String? - // Contacts - func update(_: Contact) func add(_: Contact) throws func confirm(_: Contact) throws func find(by: String) -> Contact? - func delete<T: Persistable>(_: T, isRequest: Bool) - func deleteContact(_: Contact) throws func retryRequest(_: Contact) throws @@ -82,7 +70,4 @@ public protocol SessionType { members: [Contact], _ completion: @escaping (Result<(Group, [GroupMember]), Error>) -> Void ) - - func getContactWith(userId: Data) -> Contact? - func getGroupChatInfoWith(groupId: Data) -> GroupChatInfo? } diff --git a/Sources/Models/Contact.swift b/Sources/Models/Contact.swift index 1959743eb66d6888db0d7c65e07f5cfd0e11826a..c0ca99ed09353cfc8afc8d9e4fa0ee0c0b62a088 100644 --- a/Sources/Models/Contact.swift +++ b/Sources/Models/Contact.swift @@ -41,83 +41,83 @@ public class IndexedListCollator<Item: IndexableItem> { return (sections: sections.filter { !$0.isEmpty }, collation: collation) } } - -public struct Contact: Codable, Hashable, Equatable { - public enum Request { - case all - case failed - case friends - case received - case requested - case isRecent - case verificationInProgress - case withUserId(Data) - case withUserIds([Data]) - case withUsername(String) - } - - public enum Status: Int64, Codable { - case friend - case stranger - case verified - case verificationFailed - case verificationInProgress - case requested - case requesting - case requestFailed - case confirming - case confirmationFailed - case hidden - } - - public var id: Int64? - public var photo: Data? - public let userId: Data - public var email: String? - public var phone: String? - public var status: Status - public var marshaled: Data - public var createdAt: Date - public let username: String - public var nickname: String? - public var isRecent: Bool - - public init( - photo: Data?, - userId: Data, - email: String?, - phone: String?, - status: Status, - marshaled: Data, - username: String, - nickname: String?, - createdAt: Date, - isRecent: Bool - ) { - self.email = email - self.phone = phone - self.photo = photo - self.status = status - self.userId = userId - self.username = username - self.nickname = nickname - self.marshaled = marshaled - self.createdAt = createdAt - self.isRecent = isRecent - } - - public var differenceIdentifier: Data { userId } - - public static var databaseTableName: String { "contacts" } -} - -extension Contact: Differentiable {} -extension Contact: IndexableItem { - public var indexedOn: NSString { - guard let nickname = nickname else { - return "\(username.first!)" as NSString - } - - return "\(nickname.first!)" as NSString - } -} +// +//public struct Contact: Codable, Hashable, Equatable { +// public enum Request { +// case all +// case failed +// case friends +// case received +// case requested +// case isRecent +// case verificationInProgress +// case withUserId(Data) +// case withUserIds([Data]) +// case withUsername(String) +// } +// +// public enum Status: Int64, Codable { +// case friend +// case stranger +// case verified +// case verificationFailed +// case verificationInProgress +// case requested +// case requesting +// case requestFailed +// case confirming +// case confirmationFailed +// case hidden +// } +// +// public var id: Int64? +// public var photo: Data? +// public let userId: Data +// public var email: String? +// public var phone: String? +// public var status: Status +// public var marshaled: Data +// public var createdAt: Date +// public let username: String +// public var nickname: String? +// public var isRecent: Bool +// +// public init( +// photo: Data?, +// userId: Data, +// email: String?, +// phone: String?, +// status: Status, +// marshaled: Data, +// username: String, +// nickname: String?, +// createdAt: Date, +// isRecent: Bool +// ) { +// self.email = email +// self.phone = phone +// self.photo = photo +// self.status = status +// self.userId = userId +// self.username = username +// self.nickname = nickname +// self.marshaled = marshaled +// self.createdAt = createdAt +// self.isRecent = isRecent +// } +// +// public var differenceIdentifier: Data { userId } +// +// public static var databaseTableName: String { "contacts" } +//} +// +//extension Contact: Differentiable {} +//extension Contact: IndexableItem { +// public var indexedOn: NSString { +// guard let nickname = nickname else { +// return "\(username.first!)" as NSString +// } +// +// return "\(nickname.first!)" as NSString +// } +//} diff --git a/Sources/Models/Group.swift b/Sources/Models/Group.swift index feda834cb266a933e2470e3d6ab5910b22d4588b..20634688bc4312cfae2f1daaf708889f799803ce 100644 --- a/Sources/Models/Group.swift +++ b/Sources/Models/Group.swift @@ -1,42 +1,42 @@ -import Foundation -import KeychainAccess - -public struct Group: Codable, Equatable, Hashable { - public enum Status: Int64, Codable { - case hidden - case pending - case deleting - case participating - } - - public enum Request { - case pending - case accepted - case withGroupId(Data) - } - - public var id: Int64? - public var name: String - public var leader: Data - public var groupId: Data - public var status: Status - public var serialize: Data - public var createdAt: Date - public static var databaseTableName: String { "groups" } - - public init( - leader: Data, - name: String, - groupId: Data, - status: Status, - createdAt: Date, - serialize: Data - ) { - self.name = name - self.leader = leader - self.status = status - self.groupId = groupId - self.createdAt = createdAt - self.serialize = serialize - } -} +//import Foundation +//import KeychainAccess +// +//public struct Group: Codable, Equatable, Hashable { +// public enum Status: Int64, Codable { +// case hidden +// case pending +// case deleting +// case participating +// } +// +// public enum Request { +// case pending +// case accepted +// case withGroupId(Data) +// } +// +// public var id: Int64? +// public var name: String +// public var leader: Data +// public var groupId: Data +// public var status: Status +// public var serialize: Data +// public var createdAt: Date +// public static var databaseTableName: String { "groups" } +// +// public init( +// leader: Data, +// name: String, +// groupId: Data, +// status: Status, +// createdAt: Date, +// serialize: Data +// ) { +// self.name = name +// self.leader = leader +// self.status = status +// self.groupId = groupId +// self.createdAt = createdAt +// self.serialize = serialize +// } +//} diff --git a/Sources/Models/SingleChatInfo.swift b/Sources/Models/SingleChatInfo.swift index 21c7f7d28bb4fb98b32c4239101cc8308b4be6ae..79fc4ba0766c688464b17b1a9f71924ef0423c70 100644 --- a/Sources/Models/SingleChatInfo.swift +++ b/Sources/Models/SingleChatInfo.swift @@ -1,18 +1,18 @@ -import Foundation - -public struct SingleChatInfo: Codable, Equatable, Hashable { - public enum Request { - case all - } - - public var contact: Contact - public var lastMessage: Message? - - public init( - contact: Contact, - lastMessage: Message? - ) { - self.contact = contact - self.lastMessage = lastMessage - } -} +//import Foundation +// +//public struct SingleChatInfo: Codable, Equatable, Hashable { +// public enum Request { +// case all +// } +// +// public var contact: Contact +// public var lastMessage: Message? +// +// public init( +// contact: Contact, +// lastMessage: Message? +// ) { +// self.contact = contact +// self.lastMessage = lastMessage +// } +//} diff --git a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved index e65586a6cb720b7524ee3e8f605a9dc87aed2a62..435cb2c1f5f93033e366ee014b39cb6643fdf95b 100644 --- a/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/client-ios.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -50,7 +50,7 @@ "kind" : "remoteSourceControl", "location" : "https://git.xx.network/elixxir/client-ios-db.git", "state" : { - "revision" : "e1b3b1a8d1df6d259c99289e8d09e73fbfa9fe63" + "revision" : "2e51a960216340cf12a4c6cbc7ac18a9f07d5ee6" } }, {