// // FeedlyGetEntriesOperation.swift // Account // // Created by Kiel Gillard on 28/10/19. // Copyright © 2019 Ranchero Software, LLC. All rights reserved. // import Foundation import os.log import RSParser /// Single responsibility is to get full entries for the entry identifiers. final class FeedlyGetEntriesOperation: FeedlyOperation, FeedlyEntryProviding, FeedlyParsedItemProviding { let account: Account let service: FeedlyGetEntriesService let provider: FeedlyEntryIdentifierProviding let log: OSLog init(account: Account, service: FeedlyGetEntriesService, provider: FeedlyEntryIdentifierProviding, log: OSLog) { self.account = account self.service = service self.provider = provider self.log = log } private (set) var entries = [FeedlyEntry]() private var storedParsedEntries: Set? var parsedEntries: Set { if let entries = storedParsedEntries { return entries } let parsed = Set(entries.compactMap { FeedlyEntryParser(entry: $0).parsedItemRepresentation }) if parsed.count != entries.count { let entryIds = Set(entries.map { $0.id }) let parsedIds = Set(parsed.map { $0.uniqueID }) let difference = entryIds.subtracting(parsedIds) os_log(.debug, log: log, "%{public}@ dropping articles with ids: %{public}@.", self, difference) } storedParsedEntries = parsed return parsed } var parsedItemProviderName: String { return name ?? String(describing: Self.self) } override func main() { guard !isCancelled else { didFinish() return } service.getEntries(for: provider.entryIds) { result in switch result { case .success(let entries): self.entries = entries self.didFinish() case .failure(let error): os_log(.debug, log: self.log, "Unable to get entries: %{public}@.", error as NSError) self.didFinish(error) } } } }