From cfaacd0ada43f8dd1478a1c5f5dbdfd885a8e330 Mon Sep 17 00:00:00 2001 From: Anh Do Date: Sun, 22 Mar 2020 00:46:42 -0400 Subject: [PATCH] Fix starred story hashes being parsed incorrectly --- .../NewsBlur/Models/NewsBlurStoryHash.swift | 26 +++++++++++++++---- .../Account/NewsBlur/NewsBlurAPICaller.swift | 2 +- 2 files changed, 22 insertions(+), 6 deletions(-) diff --git a/Frameworks/Account/NewsBlur/Models/NewsBlurStoryHash.swift b/Frameworks/Account/NewsBlur/Models/NewsBlurStoryHash.swift index fd76f7915..48286df00 100644 --- a/Frameworks/Account/NewsBlur/Models/NewsBlurStoryHash.swift +++ b/Frameworks/Account/NewsBlur/Models/NewsBlurStoryHash.swift @@ -15,8 +15,8 @@ typealias NewsBlurStoryHash = NewsBlurStoryHashesResponse.StoryHash struct NewsBlurStoryHashesResponse: Decodable { typealias StoryHashDictionary = [String: [StoryHash]] - var unread: StoryHashDictionary? - var starred: StoryHashDictionary? + var unread: [StoryHash]? + var starred: [StoryHash]? struct StoryHash: Hashable, Codable { var hash: String @@ -35,12 +35,13 @@ extension NewsBlurStoryHashesResponse { // Parse unread if let unreadContainer = try? container.nestedContainer(keyedBy: NewsBlurGenericCodingKeys.self, forKey: .unread) { - self.unread = try NewsBlurStoryHashesResponse.extractHashes(container: unreadContainer) + let storyHashes = try NewsBlurStoryHashesResponse.extractHashes(container: unreadContainer) + self.unread = storyHashes.values.flatMap { $0 } } // Parse starred - if let starredContainer = try? container.nestedContainer(keyedBy: NewsBlurGenericCodingKeys.self, forKey: .starred) { - self.starred = try NewsBlurStoryHashesResponse.extractHashes(container: starredContainer) + if let starredContainer = try? container.nestedUnkeyedContainer(forKey: .starred) { + self.starred = try NewsBlurStoryHashesResponse.extractArray(container: starredContainer) } } @@ -61,4 +62,19 @@ extension NewsBlurStoryHashesResponse { return dict } + + static func extractArray(container: UnkeyedDecodingContainer) throws -> [StoryHash] { + var hashes: [StoryHash] = [] + var hashArrayContainer = container + while !hashArrayContainer.isAtEnd { + var hashContainer = try hashArrayContainer.nestedUnkeyedContainer() + let hash = try hashContainer.decode(String.self) + let timestamp = try (hashContainer.decode(String.self) as NSString).doubleValue + let storyHash = StoryHash(hash: hash, timestamp: Date(timeIntervalSince1970: timestamp)) + + hashes.append(storyHash) + } + + return hashes + } } diff --git a/Frameworks/Account/NewsBlur/NewsBlurAPICaller.swift b/Frameworks/Account/NewsBlur/NewsBlurAPICaller.swift index b87a82bdb..9c974b2cd 100644 --- a/Frameworks/Account/NewsBlur/NewsBlurAPICaller.swift +++ b/Frameworks/Account/NewsBlur/NewsBlurAPICaller.swift @@ -104,7 +104,7 @@ final class NewsBlurAPICaller: NSObject { switch result { case .success((_, let payload)): let hashes = payload?.unread ?? payload?.starred - completion(.success(hashes?.values.flatMap { $0 })) + completion(.success(hashes)) case .failure(let error): completion(.failure(error)) }