From 2cff1a6f72f59da4a42bf357ae2c305b8562695e Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 25 Apr 2022 10:09:45 -0700 Subject: [PATCH] filter feeditems on needsDeletion server sync status --- .../Sources/App/Views/Home/HomeFeedViewModel.swift | 3 +++ .../CoreDataModel.xcdatamodel/contents | 6 +++--- .../OmnivoreKit/Sources/Models/DataModels/FeedItem.swift | 7 ++++++- .../Sources/Models/DataModels/ServerSyncStatus.swift | 9 +++++++++ .../Sources/Services/DataService/DataService.swift | 8 ++++++-- 5 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 apple/OmnivoreKit/Sources/Models/DataModels/ServerSyncStatus.swift diff --git a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift index fc9e5330d..aa714f261 100644 --- a/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift +++ b/apple/OmnivoreKit/Sources/App/Views/Home/HomeFeedViewModel.swift @@ -69,6 +69,9 @@ import Views dataService.viewContext.perform { let fetchRequest: NSFetchRequest = LinkedItem.fetchRequest() fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \LinkedItem.savedAt, ascending: false)] + fetchRequest.predicate = NSPredicate( + format: "serverSyncStatus != %@", ServerSyncStatus.needsDeletion.rawValue + ) if let fetchedItems = try? dataService.viewContext.fetch(fetchRequest) { self?.items = fetchedItems self?.cursor = nil diff --git a/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents b/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents index cff7f7d55..d85af33e8 100644 --- a/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents +++ b/apple/OmnivoreKit/Sources/Models/CoreData/CoreDataModel.xcdatamodeld/CoreDataModel.xcdatamodel/contents @@ -6,10 +6,10 @@ - + @@ -29,7 +29,6 @@ - @@ -37,6 +36,7 @@ + @@ -53,7 +53,7 @@ - + diff --git a/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift b/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift index 3df45fda1..afda2c4a6 100644 --- a/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift +++ b/apple/OmnivoreKit/Sources/Models/DataModels/FeedItem.swift @@ -77,7 +77,8 @@ public extension LinkedItem { inContext context: NSManagedObjectContext, newReadingProgress: Double? = nil, newAnchorIndex: Int? = nil, - newIsArchivedValue: Bool? = nil + newIsArchivedValue: Bool? = nil, + needsServerSync: Bool = false ) { context.perform { if let newReadingProgress = newReadingProgress { @@ -92,6 +93,10 @@ public extension LinkedItem { self.isArchived = newIsArchivedValue } + if needsServerSync { + self.serverSyncStatus = Int64(ServerSyncStatus.needsUpdate.rawValue) + } + guard context.hasChanges else { return } do { diff --git a/apple/OmnivoreKit/Sources/Models/DataModels/ServerSyncStatus.swift b/apple/OmnivoreKit/Sources/Models/DataModels/ServerSyncStatus.swift new file mode 100644 index 000000000..f911cc4de --- /dev/null +++ b/apple/OmnivoreKit/Sources/Models/DataModels/ServerSyncStatus.swift @@ -0,0 +1,9 @@ +import Foundation + +public enum ServerSyncStatus: Int { + case isNSync + case isSyncing + case needsDeletion + case needsCreation + case needsUpdate +} diff --git a/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift b/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift index 7930373fe..60ec412c1 100644 --- a/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift +++ b/apple/OmnivoreKit/Sources/Services/DataService/DataService.swift @@ -72,8 +72,12 @@ public extension DataService { guard let linkedItem = try? persistentContainer.viewContext.fetch(linkedItemFetchRequest).first else { return nil } guard let htmlContent = linkedItem.htmlContent else { return nil } - let highlights = linkedItem.highlights.asArray(of: Highlight.self - ) + + let highlights = linkedItem + .highlights + .asArray(of: Highlight.self) + .filter { $0.serverSyncStatus != ServerSyncStatus.needsDeletion.rawValue } + return ArticleContent( htmlContent: htmlContent, highlightsJSONString: highlights.map { InternalHighlight.make(from: $0) }.asJSONString