Fix deletion handling

pull/400/head
Niels Andriesse 3 years ago
parent 9b2f1fc2a4
commit 3daa6e8de1

@ -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)
}
}

Loading…
Cancel
Save