Fix compact poll deletion handling

pull/396/head
Niels Andriesse 4 years ago
parent 5c16a95472
commit c747acfc04

@ -77,9 +77,19 @@ public final class OpenGroupAPIV2 : NSObject {
public struct CompactPollResponseBody {
let room: String
let messages: [OpenGroupMessageV2]
let deletions: [Int64]
let deletions: [Deletion]
let moderators: [String]
}
public struct Deletion {
let id: Int64
let deletedMessageID: Int64
public static func from(_ json: JSON) -> Deletion? {
guard let id = json["id"] as? Int64, let deletedMessageID = json["deleted_message_id"] as? Int64 else { return nil }
return Deletion(id: id, deletedMessageID: deletedMessageID)
}
}
// MARK: Convenience
private static func send(_ request: Request) -> Promise<JSON> {
@ -164,7 +174,7 @@ public final class OpenGroupAPIV2 : NSObject {
}
return nil
}
let deletions = json["deletions"] as? [Int64] ?? []
let deletions = given(json["deletions"] as? [JSON]) { $0.compactMap { Deletion.from($0) } } ?? []
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)
@ -331,21 +341,20 @@ public final class OpenGroupAPIV2 : NSObject {
}
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
guard let deletions = json["ids"] as? [JSON] else { throw Error.parsingFailed }
let deletedMessageIDs = deletions.compactMap { $0["deleted_message_id"] as? Int64 }
let serverIDs = deletions.compactMap { $0["id"] as? Int64 }
let serverID = serverIDs.max() ?? 0
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(deletedMessageIDs)
seal.fulfill(deletions.map { $0.deletedMessageID })
})
return promise
} else {
return Promise.value(deletedMessageIDs)
return Promise.value(deletions.map { $0.deletedMessageID })
}
}
}

@ -85,7 +85,7 @@ public final class OpenGroupPollerV2 : NSObject {
}
}
// - Deletions
let messageIDs = body.deletions.compactMap { Storage.shared.getIDForMessage(withServerID: UInt64($0)) }
let messageIDs = body.deletions.compactMap { Storage.shared.getIDForMessage(withServerID: UInt64($0.deletedMessageID)) }
SNMessagingKitConfiguration.shared.storage.write { transaction in
let transaction = transaction as! YapDatabaseReadWriteTransaction
messageIDs.forEach { messageID in

Loading…
Cancel
Save