From 3daa6e8de1257026852d660fe05076bd0ef10ec6 Mon Sep 17 00:00:00 2001 From: Niels Andriesse Date: Mon, 3 May 2021 13:14:01 +1000 Subject: [PATCH] Fix deletion handling --- .../Open Groups/V2/OpenGroupAPIV2.swift | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift b/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift index 1aa517d63..3a9670037 100644 --- a/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift +++ b/SessionMessagingKit/Open Groups/V2/OpenGroupAPIV2.swift @@ -174,10 +174,12 @@ public final class OpenGroupAPIV2 : NSObject { } return nil } - let deletions = given(json["deletions"] as? [JSON]) { $0.compactMap { Deletion.from($0) } } ?? [] + let rawDeletions = json["deletions"] as? [JSON] ?? [] let moderators = json["moderators"] as? [String] ?? [] - return try? parseMessages(from: json, for: room, on: server).map { messages in - return CompactPollResponseBody(room: room, messages: messages, deletions: deletions, moderators: moderators) + return try? parseMessages(from: json, for: room, on: server).then(on: DispatchQueue.global(qos: .userInitiated)) { messages in + parseDeletions(from: rawDeletions, for: room, on: server).map(on: DispatchQueue.global(qos: .userInitiated)) { deletions in + return CompactPollResponseBody(room: room, messages: messages, deletions: deletions, moderators: moderators) + } } } return when(fulfilled: promises) @@ -333,29 +335,34 @@ public final class OpenGroupAPIV2 : NSObject { return send(request).map(on: DispatchQueue.global(qos: .userInitiated)) { _ in } } - public static func getDeletedMessages(for room: String, on server: String) -> Promise<[Int64]> { + public static func getDeletedMessages(for room: String, on server: String) -> Promise<[Deletion]> { let storage = SNMessagingKitConfiguration.shared.storage var queryParameters: [String:String] = [:] if let lastDeletionServerID = storage.getLastDeletionServerID(for: room, on: server) { queryParameters["from_server_id"] = String(lastDeletionServerID) } let request = Request(verb: .get, room: room, server: server, endpoint: "deleted_messages", queryParameters: queryParameters) - return send(request).then(on: DispatchQueue.global(qos: .userInitiated)) { json -> Promise<[Int64]> in + return send(request).then(on: DispatchQueue.global(qos: .userInitiated)) { json -> Promise<[Deletion]> in guard let rawDeletions = json["ids"] as? [JSON] else { throw Error.parsingFailed } - let deletions = rawDeletions.compactMap { Deletion.from($0) } - let serverID = deletions.map { $0.id }.max() ?? 0 - let lastDeletionServerID = storage.getLastDeletionServerID(for: room, on: server) ?? 0 - if serverID > lastDeletionServerID { - let (promise, seal) = Promise<[Int64]>.pending() - storage.write(with: { transaction in - storage.setLastDeletionServerID(for: room, on: server, to: serverID, using: transaction) - }, completion: { - seal.fulfill(deletions.map { $0.deletedMessageID }) - }) - return promise - } else { - return Promise.value(deletions.map { $0.deletedMessageID }) - } + return parseDeletions(from: rawDeletions, for: room, on: server) + } + } + + private static func parseDeletions(from rawDeletions: [JSON], for room: String, on server: String) -> Promise<[Deletion]> { + let storage = SNMessagingKitConfiguration.shared.storage + let deletions = rawDeletions.compactMap { Deletion.from($0) } + let serverID = deletions.map { $0.id }.max() ?? 0 + let lastDeletionServerID = storage.getLastDeletionServerID(for: room, on: server) ?? 0 + if serverID > lastDeletionServerID { + let (promise, seal) = Promise<[Deletion]>.pending() + storage.write(with: { transaction in + storage.setLastDeletionServerID(for: room, on: server, to: serverID, using: transaction) + }, completion: { + seal.fulfill(deletions) + }) + return promise + } else { + return Promise.value(deletions) } }