From 694be77e966d2c4fe6ddb8ab4a17c31cdba7ed01 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 1 Apr 2020 14:10:07 -0500 Subject: [PATCH] Add CloudKit status syncing --- .../CloudKit/CloudKitAccountDelegate.swift | 7 ++- .../CloudKitArticlesZoneDelegate.swift | 51 ++++++++++++++++++- 2 files changed, 55 insertions(+), 3 deletions(-) diff --git a/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift b/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift index 77ca681ee..c769c526b 100644 --- a/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift +++ b/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift @@ -116,6 +116,11 @@ final class CloudKitAccountDelegate: AccountDelegate { database.selectForProcessing { result in func processStatuses(_ syncStatuses: [SyncStatus]) { + guard syncStatuses.count > 0 else { + completion(.success(())) + return + } + self.articlesZone.sendArticleStatus(syncStatuses) { result in switch result { case .success: @@ -409,7 +414,7 @@ final class CloudKitAccountDelegate: AccountDelegate { func accountDidInitialize(_ account: Account) { accountZone.delegate = CloudKitAcountZoneDelegate(account: account, refreshProgress: refreshProgress) - articlesZone.delegate = CloudKitArticlesZoneDelegate(account: account) + articlesZone.delegate = CloudKitArticlesZoneDelegate(account: account, database: database) if account.externalID == nil { accountZone.findOrCreateAccount() { result in diff --git a/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift b/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift index 1774ae16f..5d469558f 100644 --- a/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift +++ b/Frameworks/Account/CloudKit/CloudKitArticlesZoneDelegate.swift @@ -9,15 +9,18 @@ import Foundation import os.log import CloudKit +import SyncDatabase class CloudKitArticlesZoneDelegate: CloudKitZoneDelegate { private var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "CloudKit") weak var account: Account? + var database: SyncDatabase - init(account: Account) { + init(account: Account, database: SyncDatabase) { self.account = account + self.database = database } func cloudKitDidChange(record: CKRecord) { @@ -29,7 +32,28 @@ class CloudKitArticlesZoneDelegate: CloudKitZoneDelegate { } func cloudKitDidChange(records: [CKRecord]) { - // TODO + database.selectPendingReadStatusArticleIDs() { result in + switch result { + case .success(let pendingReadStatusArticleIDs): + + self.database.selectPendingStarredStatusArticleIDs() { result in + switch result { + case .success(let pendingStarredStatusArticleIDs): + + self.process(records: records, + pendingReadStatusArticleIDs: pendingReadStatusArticleIDs, + pendingStarredStatusArticleIDs: pendingStarredStatusArticleIDs) + + case .failure(let error): + os_log(.error, log: self.log, "Error occurred geting pending starred records: %@", error.localizedDescription) + } + } + case .failure(let error): + os_log(.error, log: self.log, "Error occurred getting pending read status records: %@", error.localizedDescription) + } + + } + } func cloudKitDidDelete(recordKeys: [CloudKitRecordKey]) { @@ -37,3 +61,26 @@ class CloudKitArticlesZoneDelegate: CloudKitZoneDelegate { } } + +private extension CloudKitArticlesZoneDelegate { + + func process(records: [CKRecord], pendingReadStatusArticleIDs: Set, pendingStarredStatusArticleIDs: Set) { + + let receivedUnreadArticleIDs = Set(records.filter( { $0[CloudKitArticlesZone.CloudKitArticleStatus.Fields.read] == "0" }).map({ $0.externalID })) + let receivedReadArticleIDs = Set(records.filter( { $0[CloudKitArticlesZone.CloudKitArticleStatus.Fields.read] == "1" }).map({ $0.externalID })) + let receivedUnstarredArticleIDs = Set(records.filter( { $0[CloudKitArticlesZone.CloudKitArticleStatus.Fields.starred] == "0" }).map({ $0.externalID })) + let receivedStarredArticleIDs = Set(records.filter( { $0[CloudKitArticlesZone.CloudKitArticleStatus.Fields.starred] == "1" }).map({ $0.externalID })) + + let updateableUnreadArticleIDs = receivedUnreadArticleIDs.subtracting(pendingReadStatusArticleIDs) + let updateableReadArticleIDs = receivedReadArticleIDs.subtracting(pendingReadStatusArticleIDs) + let updateableUnstarredArticleIDs = receivedUnstarredArticleIDs.subtracting(pendingStarredStatusArticleIDs) + let updateableStarredArticleIDs = receivedStarredArticleIDs.subtracting(pendingStarredStatusArticleIDs) + + account?.markAsUnread(updateableUnreadArticleIDs) + account?.markAsRead(updateableReadArticleIDs) + account?.markAsUnstarred(updateableUnstarredArticleIDs) + account?.markAsStarred(updateableStarredArticleIDs) + + } + +}