Fix deletion handling

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

@ -174,12 +174,14 @@ public final class OpenGroupAPIV2 : NSObject {
} }
return nil 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] ?? [] let moderators = json["moderators"] as? [String] ?? []
return try? parseMessages(from: json, for: room, on: server).map { messages in 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 CompactPollResponseBody(room: room, messages: messages, deletions: deletions, moderators: moderators)
} }
} }
}
return when(fulfilled: promises) return when(fulfilled: promises)
} }
} }
@ -333,29 +335,34 @@ public final class OpenGroupAPIV2 : NSObject {
return send(request).map(on: DispatchQueue.global(qos: .userInitiated)) { _ in } 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 let storage = SNMessagingKitConfiguration.shared.storage
var queryParameters: [String:String] = [:] var queryParameters: [String:String] = [:]
if let lastDeletionServerID = storage.getLastDeletionServerID(for: room, on: server) { if let lastDeletionServerID = storage.getLastDeletionServerID(for: room, on: server) {
queryParameters["from_server_id"] = String(lastDeletionServerID) queryParameters["from_server_id"] = String(lastDeletionServerID)
} }
let request = Request(verb: .get, room: room, server: server, endpoint: "deleted_messages", queryParameters: queryParameters) 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 } guard let rawDeletions = json["ids"] as? [JSON] else { throw Error.parsingFailed }
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 deletions = rawDeletions.compactMap { Deletion.from($0) }
let serverID = deletions.map { $0.id }.max() ?? 0 let serverID = deletions.map { $0.id }.max() ?? 0
let lastDeletionServerID = storage.getLastDeletionServerID(for: room, on: server) ?? 0 let lastDeletionServerID = storage.getLastDeletionServerID(for: room, on: server) ?? 0
if serverID > lastDeletionServerID { if serverID > lastDeletionServerID {
let (promise, seal) = Promise<[Int64]>.pending() let (promise, seal) = Promise<[Deletion]>.pending()
storage.write(with: { transaction in storage.write(with: { transaction in
storage.setLastDeletionServerID(for: room, on: server, to: serverID, using: transaction) storage.setLastDeletionServerID(for: room, on: server, to: serverID, using: transaction)
}, completion: { }, completion: {
seal.fulfill(deletions.map { $0.deletedMessageID }) seal.fulfill(deletions)
}) })
return promise return promise
} else { } else {
return Promise.value(deletions.map { $0.deletedMessageID }) return Promise.value(deletions)
}
} }
} }

Loading…
Cancel
Save