Restrict the delete retention policy for synchronized records

This commit is contained in:
Maurice Parker 2020-06-17 11:12:30 -05:00
parent d69b313525
commit ffa152fe64
4 changed files with 14 additions and 9 deletions

View File

@ -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<ParsedItem>, completion: @escaping UpdateArticlesCompletionBlock) {
func update(_ webFeedID: String, with parsedItems: Set<ParsedItem>, 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)

View File

@ -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 {

View File

@ -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<ParsedItem>, webFeedID: String, completion: @escaping UpdateArticlesCompletionBlock) {
public func update(with parsedItems: Set<ParsedItem>, 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.).

View File

@ -172,7 +172,7 @@ final class ArticlesTable: DatabaseTable {
// MARK: - Updating and Deleting
func update(_ parsedItems: Set<ParsedItem>, _ webFeedID: String, _ completion: @escaping UpdateArticlesCompletionBlock) {
func update(_ parsedItems: Set<ParsedItem>, _ 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<Article>
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<Article>()
}
self.callUpdateArticlesCompletionBlock(newArticles, updatedArticles, articlesToDelete, completion) //7