diff --git a/Frameworks/Account/Account.swift b/Frameworks/Account/Account.swift index 51426da29..a6322b7ee 100644 --- a/Frameworks/Account/Account.swift +++ b/Frameworks/Account/Account.swift @@ -743,12 +743,12 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container, update(webFeed.webFeedID, with: parsedItems, completion: completion) } - func update(_ webFeedID: String, with parsedItems: Set, completion: @escaping UpdateArticlesCompletionBlock) { + func update(_ webFeedID: String, with parsedItems: Set, deleteOlder: Bool = true, completion: @escaping UpdateArticlesCompletionBlock) { // Used only by an On My Mac or iCloud account. precondition(Thread.isMainThread) precondition(type == .onMyMac || type == .cloudKit) - database.update(with: parsedItems, webFeedID: webFeedID) { updateArticlesResult in + database.update(with: parsedItems, webFeedID: webFeedID, deleteOlder: deleteOlder) { updateArticlesResult in switch updateArticlesResult { case .success(let articleChanges): self.sendNotificationAbout(articleChanges) diff --git a/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift b/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift index a5fff9ab3..74a7dc1a5 100644 --- a/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift +++ b/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift @@ -136,7 +136,7 @@ private extension CloudKitArticlesZoneDelegate { let webFeedIDsAndItems = Dictionary(grouping: parsedItems, by: { item in item.feedURL } ).mapValues { Set($0) } for (webFeedID, parsedItems) in webFeedIDsAndItems { group.enter() - self.account?.update(webFeedID, with: parsedItems) { result in + self.account?.update(webFeedID, with: parsedItems, deleteOlder: false) { result in switch result { case .success(let articleChanges): guard let deletes = articleChanges.deletedArticles, !deletes.isEmpty else { diff --git a/Frameworks/ArticlesDatabase/ArticlesDatabase.swift b/Frameworks/ArticlesDatabase/ArticlesDatabase.swift index 6bbe3035e..ddb33073e 100644 --- a/Frameworks/ArticlesDatabase/ArticlesDatabase.swift +++ b/Frameworks/ArticlesDatabase/ArticlesDatabase.swift @@ -204,9 +204,9 @@ public final class ArticlesDatabase { // MARK: - Saving, Updating, and Deleting Articles /// Update articles and save new ones — for feed-based systems (local and iCloud). - public func update(with parsedItems: Set, webFeedID: String, completion: @escaping UpdateArticlesCompletionBlock) { + public func update(with parsedItems: Set, webFeedID: String, deleteOlder: Bool, completion: @escaping UpdateArticlesCompletionBlock) { precondition(retentionStyle == .feedBased) - articlesTable.update(parsedItems, webFeedID, completion) + articlesTable.update(parsedItems, webFeedID, deleteOlder, completion) } /// Update articles and save new ones — for sync systems (Feedbin, Feedly, etc.). diff --git a/Frameworks/ArticlesDatabase/ArticlesTable.swift b/Frameworks/ArticlesDatabase/ArticlesTable.swift index b82117381..65fea954e 100644 --- a/Frameworks/ArticlesDatabase/ArticlesTable.swift +++ b/Frameworks/ArticlesDatabase/ArticlesTable.swift @@ -172,7 +172,7 @@ final class ArticlesTable: DatabaseTable { // MARK: - Updating and Deleting - func update(_ parsedItems: Set, _ webFeedID: String, _ completion: @escaping UpdateArticlesCompletionBlock) { + func update(_ parsedItems: Set, _ webFeedID: String, _ deleteOlder: Bool, _ completion: @escaping UpdateArticlesCompletionBlock) { precondition(retentionStyle == .feedBased) if parsedItems.isEmpty { callUpdateArticlesCompletionBlock(nil, nil, nil, completion) @@ -210,9 +210,14 @@ final class ArticlesTable: DatabaseTable { let updatedArticles = self.findAndSaveUpdatedArticles(incomingArticles, fetchedArticlesDictionary, database) //6 // Articles to delete are 1) not starred and 2) older than 30 days and 3) no longer in feed. - let cutoffDate = Date().bySubtracting(days: 30) - let articlesToDelete = fetchedArticles.filter { (article) -> Bool in - return !article.status.starred && article.status.dateArrived < cutoffDate && !articleIDs.contains(article.articleID) + let articlesToDelete: Set
+ if deleteOlder { + let cutoffDate = Date().bySubtracting(days: 30) + articlesToDelete = fetchedArticles.filter { (article) -> Bool in + return !article.status.starred && article.status.dateArrived < cutoffDate && !articleIDs.contains(article.articleID) + } + } else { + articlesToDelete = Set
() } self.callUpdateArticlesCompletionBlock(newArticles, updatedArticles, articlesToDelete, completion) //7