From 1c208cd4baced5b5c59e7a8135e350234b0aef9c Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Sun, 25 Oct 2020 16:10:10 -0500 Subject: [PATCH] Accommodate The Old Reader's unusual item ids when syncing article status. --- .../ReaderAPI/ReaderAPIAccountDelegate.swift | 8 ++++---- .../Account/ReaderAPI/ReaderAPICaller.swift | 20 +++++++++++-------- 2 files changed, 16 insertions(+), 12 deletions(-) diff --git a/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift b/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift index 1bb6a31e6..f4d0a650f 100644 --- a/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift +++ b/Account/Sources/Account/ReaderAPI/ReaderAPIAccountDelegate.swift @@ -779,7 +779,7 @@ private extension ReaderAPIAccountDelegate { return d } - func sendArticleStatuses(_ statuses: [SyncStatus], apiCall: ([Int], @escaping (Result) -> Void) -> Void, completion: @escaping (() -> Void)) { + func sendArticleStatuses(_ statuses: [SyncStatus], apiCall: ([String], @escaping (Result) -> Void) -> Void, completion: @escaping (() -> Void)) { guard !statuses.isEmpty else { completion() return @@ -787,7 +787,7 @@ private extension ReaderAPIAccountDelegate { let group = DispatchGroup() - let articleIDs = statuses.compactMap { Int($0.articleID) } + let articleIDs = statuses.compactMap { $0.articleID } let articleIDGroups = articleIDs.chunked(into: 1000) for articleIDGroup in articleIDGroups { @@ -795,11 +795,11 @@ private extension ReaderAPIAccountDelegate { apiCall(articleIDGroup) { result in switch result { case .success: - self.database.deleteSelectedForProcessing(articleIDGroup.map { String($0) } ) + self.database.deleteSelectedForProcessing(articleIDGroup.map { $0 } ) group.leave() case .failure(let error): os_log(.error, log: self.log, "Article status sync call failed: %@.", error.localizedDescription) - self.database.resetSelectedForProcessing(articleIDGroup.map { String($0) } ) + self.database.resetSelectedForProcessing(articleIDGroup.map { $0 } ) group.leave() } } diff --git a/Account/Sources/Account/ReaderAPI/ReaderAPICaller.swift b/Account/Sources/Account/ReaderAPI/ReaderAPICaller.swift index 465bde73d..8571bc509 100644 --- a/Account/Sources/Account/ReaderAPI/ReaderAPICaller.swift +++ b/Account/Sources/Account/ReaderAPI/ReaderAPICaller.swift @@ -842,7 +842,7 @@ final class ReaderAPICaller: NSObject { } - func updateStateToEntries(entries: [Int], state: ReaderState, add: Bool, completion: @escaping (Result) -> Void) { + func updateStateToEntries(entries: [String], state: ReaderState, add: Bool, completion: @escaping (Result) -> Void) { guard let baseURL = APIBaseURL else { completion(.failure(CredentialsError.incompleteCredentials)) return @@ -858,9 +858,13 @@ final class ReaderAPICaller: NSObject { request.httpMethod = "POST" // Get ids from above into hex representation of value - let idsToFetch = entries.map({ (idValue) -> String in - let idHexString = String(format: "%.16llx", idValue) - return "i=\(idHexString)" + let idsToFetch = entries.map({ idValue -> String in + if self.variant == .theOldReader { + return "i=tag:google.com,2005:reader/item/\(idValue)" + } else { + let idHexString = String(format: "%.16llx", idValue) + return "i=\(idHexString)" + } }).joined(separator:"&") let actionIndicator = add ? "a" : "r" @@ -883,21 +887,21 @@ final class ReaderAPICaller: NSObject { } } - func createUnreadEntries(entries: [Int], completion: @escaping (Result) -> Void) { + func createUnreadEntries(entries: [String], completion: @escaping (Result) -> Void) { updateStateToEntries(entries: entries, state: .read, add: false, completion: completion) } - func deleteUnreadEntries(entries: [Int], completion: @escaping (Result) -> Void) { + func deleteUnreadEntries(entries: [String], completion: @escaping (Result) -> Void) { updateStateToEntries(entries: entries, state: .read, add: true, completion: completion) } - func createStarredEntries(entries: [Int], completion: @escaping (Result) -> Void) { + func createStarredEntries(entries: [String], completion: @escaping (Result) -> Void) { updateStateToEntries(entries: entries, state: .starred, add: true, completion: completion) } - func deleteStarredEntries(entries: [Int], completion: @escaping (Result) -> Void) { + func deleteStarredEntries(entries: [String], completion: @escaping (Result) -> Void) { updateStateToEntries(entries: entries, state: .starred, add: false, completion: completion) }