diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 69aa8a5c8..51ea64a90 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -382,6 +382,8 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, feed.name = name feed.homePageURL = homePageURL + addFeed(feed) + return feed } diff --git a/Frameworks/Account/Feedbin/FeedbinAPICaller.swift b/Frameworks/Account/Feedbin/FeedbinAPICaller.swift index 41bad4b39..41fafdf03 100644 --- a/Frameworks/Account/Feedbin/FeedbinAPICaller.swift +++ b/Frameworks/Account/Feedbin/FeedbinAPICaller.swift @@ -299,6 +299,31 @@ final class FeedbinAPICaller: NSObject { } + func retrieveEntries(feedID: String, completion: @escaping (Result<([FeedbinEntry]?, String?), Error>) -> Void) { + + let since = Calendar.current.date(byAdding: .month, value: -3, to: Date()) ?? Date() + let sinceString = FeedbinDate.formatter.string(from: since) + + var callURL = URLComponents(url: feedbinBaseURL.appendingPathComponent("/feeds/\(feedID)/entries.json"), resolvingAgainstBaseURL: false)! + callURL.queryItems = [URLQueryItem(name: "since", value: sinceString), URLQueryItem(name: "per_page", value: "100")] + let request = URLRequest(url: callURL.url!, credentials: credentials) + + transport.send(request: request, resultType: [FeedbinEntry].self) { result in + + switch result { + case .success(let (response, entries)): + + let pagingInfo = HTTPLinkPagingInfo(urlResponse: response) + completion(.success((entries, pagingInfo.nextPage))) + + case .failure(let error): + completion(.failure(error)) + } + + } + + } + func retrieveEntries(completion: @escaping (Result<([FeedbinEntry]?, String?), Error>) -> Void) { let since: Date = { diff --git a/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift b/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift index 9d4f4e7cd..a30c780a5 100644 --- a/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift +++ b/Frameworks/Account/Feedbin/FeedbinAccountDelegate.swift @@ -839,11 +839,38 @@ private extension FeedbinAccountDelegate { } func createFeed( account: Account, subscription sub: FeedbinSubscription, completion: @escaping (Result) -> Void) { - DispatchQueue.main.async { + + DispatchQueue.main.async { [weak self] in + let feed = account.createFeed(with: sub.name, url: sub.url, feedID: String(sub.feedID), homePageURL: sub.homePageURL) feed.subscriptionID = String(sub.subscriptionID) - completion(.success(feed)) + + // Download the initial articles + self?.caller.retrieveEntries(feedID: feed.feedID) { [weak self] result in + + switch result { + case .success(let (entries, page)): + + self?.processEntries(account: account, entries: entries) { + self?.refreshArticles(account, page: page) { + DispatchQueue.main.async { + completion(.success(feed)) + } + } + } + + case .failure(let error): + guard let self = self else { return } + os_log(.error, log: self.log, "Initial articles download failed: %@.", error.localizedDescription) + DispatchQueue.main.async { + completion(.success(feed)) + } + } + + } + } + } func refreshArticles(_ account: Account, completion: @escaping (() -> Void)) { @@ -866,6 +893,7 @@ private extension FeedbinAccountDelegate { case .failure(let error): guard let self = self else { return } os_log(.error, log: self.log, "Refresh articles failed: %@.", error.localizedDescription) + completion() } } @@ -914,6 +942,8 @@ private extension FeedbinAccountDelegate { group.leave() } } + } else { + group.leave() } }