diff --git a/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift b/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift index b59aef760..5df09c1d8 100644 --- a/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift +++ b/Frameworks/Account/CloudKit/CloudKitAccountDelegate.swift @@ -30,9 +30,10 @@ final class CloudKitAccountDelegate: AccountDelegate { return CKContainer(identifier: "iCloud.\(orgID).NetNewsWire") }() - private lazy var zones: [CloudKitZone] = [accountZone, articlesZone] + private lazy var zones: [CloudKitZone] = [accountZone, articlesZone, publicZone] private let accountZone: CloudKitAccountZone private let articlesZone: CloudKitArticlesZone + private let publicZone: CloudKitPublicZone private let refresher = LocalAccountRefresher() @@ -48,6 +49,7 @@ final class CloudKitAccountDelegate: AccountDelegate { init(dataFolder: String) { accountZone = CloudKitAccountZone(container: container) articlesZone = CloudKitArticlesZone(container: container) + publicZone = CloudKitPublicZone(container: container) let databaseFilePath = (dataFolder as NSString).appendingPathComponent("Sync.sqlite3") database = SyncDatabase(databaseFilePath: databaseFilePath) @@ -259,9 +261,13 @@ final class CloudKitAccountDelegate: AccountDelegate { accountZone.removeWebFeed(feed, from: container) { result in self.refreshProgress.completeTask() switch result { - case .success: + case .success(let deleted): container.removeWebFeed(feed) - completion(.success(())) + if deleted { + self.publicZone.removeSubscription(feed, completion: completion) + } else { + completion(.success(())) + } case .failure(let error): completion(.failure(error)) } diff --git a/Frameworks/Account/CloudKit/CloudKitAccountZone.swift b/Frameworks/Account/CloudKit/CloudKitAccountZone.swift index 30611af51..132e99618 100644 --- a/Frameworks/Account/CloudKit/CloudKitAccountZone.swift +++ b/Frameworks/Account/CloudKit/CloudKitAccountZone.swift @@ -125,8 +125,8 @@ final class CloudKitAccountZone: CloudKitZone { } } - /// Deletes a web feed from iCloud - func removeWebFeed(_ webFeed: WebFeed, from: Container, completion: @escaping (Result) -> Void) { + /// Removes a web feed from a container and optionally deletes it, calling the completion with true if deleted + func removeWebFeed(_ webFeed: WebFeed, from: Container, completion: @escaping (Result) -> Void) { guard let fromContainerExternalID = from.externalID else { completion(.failure(CloudKitZoneError.invalidParameter)) return @@ -135,16 +135,36 @@ final class CloudKitAccountZone: CloudKitZone { fetch(externalID: webFeed.externalID) { result in switch result { case .success(let record): + if let containerExternalIDs = record[CloudKitWebFeed.Fields.containerExternalIDs] as? [String] { var containerExternalIDSet = Set(containerExternalIDs) containerExternalIDSet.remove(fromContainerExternalID) + if containerExternalIDSet.isEmpty { - self.delete(externalID: webFeed.externalID , completion: completion) + self.delete(externalID: webFeed.externalID) { result in + switch result { + case .success: + completion(.success(true)) + case .failure(let error): + completion(.failure(error)) + } + } + } else { + record[CloudKitWebFeed.Fields.containerExternalIDs] = Array(containerExternalIDSet) - self.save(record, completion: completion) + self.save(record) { result in + switch result { + case .success: + completion(.success(false)) + case .failure(let error): + completion(.failure(error)) + } + } + } } + case .failure(let error): completion(.failure(error)) } diff --git a/Frameworks/Account/CloudKit/CloudKitPublicZone.swift b/Frameworks/Account/CloudKit/CloudKitPublicZone.swift index 653ac72d4..c6ce1cffc 100644 --- a/Frameworks/Account/CloudKit/CloudKitPublicZone.swift +++ b/Frameworks/Account/CloudKit/CloudKitPublicZone.swift @@ -31,14 +31,6 @@ final class CloudKitPublicZone: CloudKitZone { } } - struct CloudKitWebFeedCheck { - static let recordType = "UserSubscription" - struct Fields { - static let webFeed = "webFeed" - static let subscriptionID = "oldestPossibleCheckTime" - } - } - struct CloudKitUserSubscription { static let recordType = "UserSubscription" struct Fields { @@ -48,11 +40,19 @@ final class CloudKitPublicZone: CloudKitZone { } } + init(container: CKContainer) { + self.container = container + self.database = container.publicCloudDatabase + } + func subscribe() {} func receiveRemoteNotification(userInfo: [AnyHashable : Any], completion: @escaping () -> Void) { } - + func removeSubscription(_ webFeed: WebFeed, completion: @escaping (Result) -> Void) { + + } + }