From 3c7369f465517c5a3f48ddce603253a4f7cbaed6 Mon Sep 17 00:00:00 2001 From: Mikunj Date: Wed, 9 Oct 2019 10:06:26 +1100 Subject: [PATCH] Added storage functions. Minor refactor. --- Signal/src/AppDelegate.m | 2 +- .../src/Loki/Group Chat/GroupChatPoller.swift | 6 +-- .../Loki/API/Group Chat/LokiGroupChat.swift | 33 +++++++++++++---- .../Loki/Database/LokiDatabaseUtilities.swift | 20 ++++++++++ .../Database/OWSPrimaryStorage+Loki.swift | 37 ++++++++++++++++--- 5 files changed, 81 insertions(+), 17 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index 03d0f69d8..bea373092 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -1527,7 +1527,7 @@ static NSTimeInterval launchStartedAt; - (LKGroupChat *)lokiPublicChat { - return [[LKGroupChat alloc] initWithServerID:LKGroupChatAPI.publicChatServerID server:LKGroupChatAPI.publicChatServer displayName:NSLocalizedString(@"Loki Public Chat", @"") isDeletable:true]; + return [[LKGroupChat alloc] initWithChannel:LKGroupChatAPI.publicChatServerID server:LKGroupChatAPI.publicChatServer displayName:NSLocalizedString(@"Loki Public Chat", @"") isDeletable:true]; } - (LKRSSFeed *)lokiNewsFeed diff --git a/Signal/src/Loki/Group Chat/GroupChatPoller.swift b/Signal/src/Loki/Group Chat/GroupChatPoller.swift index 7ed3c1623..21eee0ce9 100644 --- a/Signal/src/Loki/Group Chat/GroupChatPoller.swift +++ b/Signal/src/Loki/Group Chat/GroupChatPoller.swift @@ -110,7 +110,7 @@ public final class GroupChatPoller : NSObject { } } // Poll - let _ = LokiGroupChatAPI.getMessages(for: group.serverID, on: group.server).done(on: .main) { messages in + let _ = LokiGroupChatAPI.getMessages(for: group.channel, on: group.server).done(on: .main) { messages in messages.forEach { message in if message.hexEncodedPublicKey != userHexEncodedPublicKey { processIncomingMessage(message) @@ -123,7 +123,7 @@ public final class GroupChatPoller : NSObject { private func pollForDeletedMessages() { let group = self.group - let _ = LokiGroupChatAPI.getDeletedMessageServerIDs(for: group.serverID, on: group.server).done { deletedMessageServerIDs in + let _ = LokiGroupChatAPI.getDeletedMessageServerIDs(for: group.channel, on: group.server).done { deletedMessageServerIDs in let storage = OWSPrimaryStorage.shared() storage.dbReadWriteConnection.readWrite { transaction in let deletedMessageIDs = deletedMessageServerIDs.compactMap { storage.getIDForMessage(withServerID: UInt($0), in: transaction) } @@ -135,6 +135,6 @@ public final class GroupChatPoller : NSObject { } private func pollForModerators() { - let _ = LokiGroupChatAPI.getModerators(for: group.serverID, on: group.server) + let _ = LokiGroupChatAPI.getModerators(for: group.channel, on: group.server) } } diff --git a/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupChat.swift b/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupChat.swift index 0f5ec66be..a25fa1338 100644 --- a/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupChat.swift +++ b/SignalServiceKit/src/Loki/API/Group Chat/LokiGroupChat.swift @@ -1,19 +1,38 @@ @objc(LKGroupChat) -public final class LokiGroupChat : NSObject { - @objc public let id: String - @objc public let serverID: UInt64 +public final class LokiGroupChat : NSObject, NSCoding { + @objc public var id: String { + return "\(server).\(channel)" + } + + @objc public let channel: UInt64 @objc public let server: String @objc public let displayName: String @objc public let isDeletable: Bool - @objc public init(serverID: UInt64, server: String, displayName: String, isDeletable: Bool) { - self.id = "\(server).\(serverID)" - self.serverID = serverID + @objc public init(channel: UInt64, server: String, displayName: String, isDeletable: Bool) { + self.channel = channel self.server = server self.displayName = displayName self.isDeletable = isDeletable } - override public var description: String { return displayName } + // MARK: Coding + + @objc public init?(coder: NSCoder) { + channel = UInt64(coder.decodeInt64(forKey: "channel")) + server = coder.decodeObject(forKey: "server") as! String + displayName = coder.decodeObject(forKey: "displayName") as! String + isDeletable = coder.decodeBool(forKey: "isDeletable") + super.init() + } + + @objc public func encode(with coder: NSCoder) { + coder.encode(Int64(channel), forKey: "channel") + coder.encode(server, forKey: "server") + coder.encode(displayName, forKey: "displayName") + coder.encode(isDeletable, forKey: "isDeletable") + } + + override public var description: String { return "\(displayName) - \(server)" } } diff --git a/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift b/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift index 2952040b4..5cbb79dfa 100644 --- a/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift +++ b/SignalServiceKit/src/Loki/Database/LokiDatabaseUtilities.swift @@ -24,4 +24,24 @@ public final class LokiDatabaseUtilities : NSObject { public static func objc_getMasterHexEncodedPublicKey(for slaveHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> String? { return OWSPrimaryStorage.shared().getMasterHexEncodedPublicKey(for: slaveHexEncodedPublicKey, in: transaction) } + + @objc(getAllGroupChats:) + public static func objc_getAllGroupChats(in transaction: YapDatabaseReadTransaction) -> [String: LokiGroupChat] { + return OWSPrimaryStorage.shared().getAllGroupChats(in: transaction) + } + + @objc(getGroupChatForThreadID:transaction:) + public static func objc_getGroupChat(for threadID: String, in transaction: YapDatabaseReadTransaction) -> LokiGroupChat? { + return OWSPrimaryStorage.shared().getGroupChat(for: threadID, in: transaction) + } + + @objc(setGroupChat:threadID:transaction:) + public static func objc_setGroupChat(_ groupChat: LokiGroupChat, for threadID: String, in transaction: YapDatabaseReadWriteTransaction) { + return OWSPrimaryStorage.shared().setGroupChat(groupChat, for: threadID, in: transaction) + } + + @objc(removeGroupChatForThreadID:transaction:) + public static func objc_removeGroupChat(for threadID: String, in transaction: YapDatabaseReadWriteTransaction) { + return OWSPrimaryStorage.shared().removeGroupChat(for: threadID, in: transaction) + } } diff --git a/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.swift b/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.swift index 542bbcc25..42d56ecc1 100644 --- a/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.swift +++ b/SignalServiceKit/src/Loki/Database/OWSPrimaryStorage+Loki.swift @@ -1,7 +1,10 @@ public extension OWSPrimaryStorage { - - private func getCollection(for primaryDevice: String) -> String { + private var groupChatCollection: String { + return "LokiGroupChatCollection" + } + + private func getDeviceLinkCollection(for primaryDevice: String) -> String { return "LokiDeviceLinkCollection-\(primaryDevice)" } @@ -13,23 +16,23 @@ public extension OWSPrimaryStorage { return } let masterHexEncodedPublicKey = masterHexEncodedPublicKeys.first! - let collection = getCollection(for: masterHexEncodedPublicKey) + let collection = getDeviceLinkCollection(for: masterHexEncodedPublicKey) transaction.removeAllObjects(inCollection: collection) deviceLinks.forEach { addDeviceLink($0, in: transaction) } // TODO: Check the performance impact of this } public func addDeviceLink(_ deviceLink: DeviceLink, in transaction: YapDatabaseReadWriteTransaction) { - let collection = getCollection(for: deviceLink.master.hexEncodedPublicKey) + let collection = getDeviceLinkCollection(for: deviceLink.master.hexEncodedPublicKey) transaction.setObject(deviceLink, forKey: deviceLink.slave.hexEncodedPublicKey, inCollection: collection) } public func removeDeviceLink(_ deviceLink: DeviceLink, in transaction: YapDatabaseReadWriteTransaction) { - let collection = getCollection(for: deviceLink.master.hexEncodedPublicKey) + let collection = getDeviceLinkCollection(for: deviceLink.master.hexEncodedPublicKey) transaction.removeObject(forKey: deviceLink.slave.hexEncodedPublicKey, inCollection: collection) } public func getDeviceLinks(for masterHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> Set { - let collection = getCollection(for: masterHexEncodedPublicKey) + let collection = getDeviceLinkCollection(for: masterHexEncodedPublicKey) var result: Set = [] transaction.enumerateRows(inCollection: collection) { _, object, _, _ in guard let deviceLink = object as? DeviceLink else { return } @@ -51,4 +54,26 @@ public extension OWSPrimaryStorage { public func getMasterHexEncodedPublicKey(for slaveHexEncodedPublicKey: String, in transaction: YapDatabaseReadTransaction) -> String? { return getDeviceLink(for: slaveHexEncodedPublicKey, in: transaction)?.master.hexEncodedPublicKey } + + public func getAllGroupChats(in transaction: YapDatabaseReadTransaction) -> [String: LokiGroupChat] { + var dict = [String: LokiGroupChat]() + transaction.enumerateKeysAndObjects(inCollection: groupChatCollection) { (threadID, object, _) in + if let groupChat = object as? LokiGroupChat { + dict[threadID] = groupChat + } + } + return dict + } + + public func getGroupChat(for threadID: String, in transaction: YapDatabaseReadTransaction) -> LokiGroupChat? { + return transaction.object(forKey: threadID, inCollection: groupChatCollection) as? LokiGroupChat + } + + public func setGroupChat(_ groupChat: LokiGroupChat, for threadID: String, in transaction: YapDatabaseReadWriteTransaction) { + transaction.setObject(groupChat, forKey: threadID, inCollection: groupChatCollection) + } + + public func removeGroupChat(for threadID: String, in transaction: YapDatabaseReadWriteTransaction) { + transaction.removeObject(forKey: threadID, inCollection: groupChatCollection) + } }