Fix new deletion method

pull/402/head
nielsandriesse 4 years ago
parent 47daf16d5c
commit 964cb8b326

@ -178,7 +178,6 @@ extension Storage {
// MARK: - Metadata // MARK: - Metadata
private static let openGroupUserCountCollection = "SNOpenGroupUserCountCollection" private static let openGroupUserCountCollection = "SNOpenGroupUserCountCollection"
private static let openGroupMessageIDCollection = "LKMessageIDCollection"
private static let openGroupImageCollection = "SNOpenGroupImageCollection" private static let openGroupImageCollection = "SNOpenGroupImageCollection"
public func getUserCount(forV2OpenGroupWithID openGroupID: String) -> UInt64? { public func getUserCount(forV2OpenGroupWithID openGroupID: String) -> UInt64? {

@ -121,11 +121,6 @@ public final class OpenGroupAPI : DotNetAPI {
SNLog("Ignoring open group message with invalid signature.") SNLog("Ignoring open group message with invalid signature.")
return nil return nil
} }
let existingMessageID = storage.getIDForMessage(withServerID: result.serverID!)
guard existingMessageID == nil else {
SNLog("Ignoring duplicate open group message.")
return nil
}
return result return result
}.sorted { $0.serverTimestamp < $1.serverTimestamp} }.sorted { $0.serverTimestamp < $1.serverTimestamp}
} }

@ -176,13 +176,18 @@ public final class OpenGroupPoller : NSObject {
private func pollForDeletedMessages() { private func pollForDeletedMessages() {
let openGroup = self.openGroup let openGroup = self.openGroup
let storage = SNMessagingKitConfiguration.shared.storage
OpenGroupAPI.getDeletedMessageServerIDs(for: openGroup.channel, on: openGroup.server).done(on: DispatchQueue.global(qos: .default)) { deletedMessageServerIDs in OpenGroupAPI.getDeletedMessageServerIDs(for: openGroup.channel, on: openGroup.server).done(on: DispatchQueue.global(qos: .default)) { deletedMessageServerIDs in
let deletedMessageIDs = deletedMessageServerIDs.compactMap { Storage.shared.getIDForMessage(withServerID: UInt64($0)) } storage.write { transaction in
SNMessagingKitConfiguration.shared.storage.write { transaction in let transaction = transaction as! YapDatabaseReadWriteTransaction
deletedMessageIDs.forEach { messageID in guard let threadID = storage.getThreadID(for: openGroup.id),
let transaction = transaction as! YapDatabaseReadWriteTransaction let thread = TSGroupThread.fetch(uniqueId: threadID, transaction: transaction) else { return }
TSMessage.fetch(uniqueId: messageID, transaction: transaction)?.remove(with: transaction) var messagesToRemove: [TSMessage] = []
thread.enumerateInteractions(with: transaction) { interaction, stop in
guard let message = interaction as? TSMessage, deletedMessageServerIDs.contains(message.openGroupServerMessageID) else { return }
messagesToRemove.append(message)
} }
messagesToRemove.forEach { $0.remove(with: transaction) }
} }
}.retainUntilComplete() }.retainUntilComplete()
} }

@ -67,6 +67,7 @@ public final class OpenGroupPollerV2 : NSObject {
} }
private func handleCompactPollBody(_ body: OpenGroupAPIV2.CompactPollResponseBody, isBackgroundPoll: Bool) { private func handleCompactPollBody(_ body: OpenGroupAPIV2.CompactPollResponseBody, isBackgroundPoll: Bool) {
let storage = SNMessagingKitConfiguration.shared.storage
// - Messages // - Messages
// Sorting the messages by server ID before importing them fixes an issue where messages that quote older messages can't find those older messages // Sorting the messages by server ID before importing them fixes an issue where messages that quote older messages can't find those older messages
let openGroupID = "\(server).\(body.room)" let openGroupID = "\(server).\(body.room)"
@ -80,17 +81,22 @@ public final class OpenGroupPollerV2 : NSObject {
envelope.setSource(message.sender!) // Safe because messages with a nil sender are filtered out envelope.setSource(message.sender!) // Safe because messages with a nil sender are filtered out
envelope.setServerTimestamp(message.sentTimestamp) envelope.setServerTimestamp(message.sentTimestamp)
let job = MessageReceiveJob(data: try! envelope.buildSerializedData(), openGroupMessageServerID: UInt64(message.serverID!), openGroupID: openGroupID, isBackgroundPoll: isBackgroundPoll) let job = MessageReceiveJob(data: try! envelope.buildSerializedData(), openGroupMessageServerID: UInt64(message.serverID!), openGroupID: openGroupID, isBackgroundPoll: isBackgroundPoll)
SNMessagingKitConfiguration.shared.storage.write { transaction in storage.write { transaction in
SessionMessagingKit.JobQueue.shared.add(job, using: transaction) SessionMessagingKit.JobQueue.shared.add(job, using: transaction)
} }
} }
// - Deletions // - Deletions
let deletedMessageIDs = body.deletions.compactMap { Storage.shared.getIDForMessage(withServerID: UInt64($0.deletedMessageID)) } let deletedMessageServerIDs = Set(body.deletions.map { UInt64($0.deletedMessageID) })
SNMessagingKitConfiguration.shared.storage.write { transaction in storage.write { transaction in
let transaction = transaction as! YapDatabaseReadWriteTransaction let transaction = transaction as! YapDatabaseReadWriteTransaction
deletedMessageIDs.forEach { messageID in guard let threadID = storage.v2GetThreadID(for: openGroupID),
TSMessage.fetch(uniqueId: messageID, transaction: transaction)?.remove(with: transaction) let thread = TSGroupThread.fetch(uniqueId: threadID, transaction: transaction) else { return }
var messagesToRemove: [TSMessage] = []
thread.enumerateInteractions(with: transaction) { interaction, stop in
guard let message = interaction as? TSMessage, deletedMessageServerIDs.contains(message.openGroupServerMessageID) else { return }
messagesToRemove.append(message)
} }
messagesToRemove.forEach { $0.remove(with: transaction) }
} }
// - Moderators // - Moderators
if var x = OpenGroupAPIV2.moderators[server] { if var x = OpenGroupAPIV2.moderators[server] {

@ -47,6 +47,7 @@ public protocol SessionMessagingKitStorageProtocol {
func getAllV2OpenGroups() -> [String:OpenGroupV2] func getAllV2OpenGroups() -> [String:OpenGroupV2]
func getV2OpenGroup(for threadID: String) -> OpenGroupV2? func getV2OpenGroup(for threadID: String) -> OpenGroupV2?
func v2GetThreadID(for v2OpenGroupID: String) -> String?
func getThreadID(for openGroupID: String) -> String? func getThreadID(for openGroupID: String) -> String?
func updateMessageIDCollectionByPruningMessagesWithIDs(_ messageIDs: Set<String>, using transaction: Any) func updateMessageIDCollectionByPruningMessagesWithIDs(_ messageIDs: Set<String>, using transaction: Any)
@ -70,8 +71,6 @@ public protocol SessionMessagingKitStorageProtocol {
// MARK: - Open Group Metadata // MARK: - Open Group Metadata
func setUserCount(to newValue: UInt64, forV2OpenGroupWithID openGroupID: String, using transaction: Any) func setUserCount(to newValue: UInt64, forV2OpenGroupWithID openGroupID: String, using transaction: Any)
func getIDForMessage(withServerID serverID: UInt64) -> String?
func setIDForMessage(withServerID serverID: UInt64, to messageID: String, using transaction: Any)
func setOpenGroupDisplayName(to displayName: String, for publicKey: String, inOpenGroupWithID openGroupID: String, using transaction: Any) func setOpenGroupDisplayName(to displayName: String, for publicKey: String, inOpenGroupWithID openGroupID: String, using transaction: Any)
func setLastProfilePictureUploadDate(_ date: Date) // Stored in user defaults so no transaction is needed func setLastProfilePictureUploadDate(_ date: Date) // Stored in user defaults so no transaction is needed

@ -45,7 +45,7 @@ BOOL IsNoteToSelfEnabled(void);
#pragma mark Interactions #pragma mark Interactions
- (void)enumerateInteractionsWithTransaction:(YapDatabaseReadTransaction *)transaction usingBlock:(void (^)(TSInteraction *interaction, YapDatabaseReadTransaction *transaction))block; - (void)enumerateInteractionsWithTransaction:(YapDatabaseReadTransaction *)transaction usingBlock:(void (^)(TSInteraction *interaction, BOOL *stop))block;
- (void)enumerateInteractionsUsingBlock:(void (^)(TSInteraction *interaction))block; - (void)enumerateInteractionsUsingBlock:(void (^)(TSInteraction *interaction))block;

@ -158,15 +158,14 @@ BOOL IsNoteToSelfEnabled(void)
* Iterate over this thread's interactions * Iterate over this thread's interactions
*/ */
- (void)enumerateInteractionsWithTransaction:(YapDatabaseReadTransaction *)transaction - (void)enumerateInteractionsWithTransaction:(YapDatabaseReadTransaction *)transaction
usingBlock:(void (^)(TSInteraction *interaction, usingBlock:(void (^)(TSInteraction *interaction, BOOL *stop))block
YapDatabaseReadTransaction *transaction))block
{ {
YapDatabaseViewTransaction *interactionsByThread = [transaction ext:TSMessageDatabaseViewExtensionName]; YapDatabaseViewTransaction *interactionsByThread = [transaction ext:TSMessageDatabaseViewExtensionName];
[interactionsByThread [interactionsByThread
enumerateKeysAndObjectsInGroup:self.uniqueId enumerateKeysAndObjectsInGroup:self.uniqueId
usingBlock:^(NSString *collection, NSString *key, id object, NSUInteger index, BOOL *stop) { usingBlock:^(NSString *collection, NSString *key, id object, NSUInteger index, BOOL *stop) {
TSInteraction *interaction = object; TSInteraction *interaction = object;
block(interaction, transaction); block(interaction, stop);
}]; }];
} }
@ -179,7 +178,7 @@ BOOL IsNoteToSelfEnabled(void)
[self.dbReadWriteConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { [self.dbReadWriteConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) {
[self enumerateInteractionsWithTransaction:transaction [self enumerateInteractionsWithTransaction:transaction
usingBlock:^( usingBlock:^(
TSInteraction *interaction, YapDatabaseReadTransaction *t) { TSInteraction *interaction, BOOL *stop) {
block(interaction); block(interaction);
}]; }];

Loading…
Cancel
Save