diff --git a/Frameworks/Account/Account.xcodeproj/project.pbxproj b/Frameworks/Account/Account.xcodeproj/project.pbxproj index 755ee05fe..2573a06a5 100644 --- a/Frameworks/Account/Account.xcodeproj/project.pbxproj +++ b/Frameworks/Account/Account.xcodeproj/project.pbxproj @@ -68,9 +68,6 @@ 51E490362288C37100C791F0 /* FeedbinDate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E490352288C37100C791F0 /* FeedbinDate.swift */; }; 51E4DB2E242633ED0091EB5B /* CloudKitZone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4DB2D242633ED0091EB5B /* CloudKitZone.swift */; }; 51E4DB302426353D0091EB5B /* CloudKitAccountZone.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4DB2F2426353D0091EB5B /* CloudKitAccountZone.swift */; }; - 51E4DB3224264B470091EB5B /* WebFeed+CloudKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4DB3124264B470091EB5B /* WebFeed+CloudKit.swift */; }; - 51E4DB3424264CD50091EB5B /* Folder+CloudKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4DB3324264CD50091EB5B /* Folder+CloudKit.swift */; }; - 51E4DB362426693F0091EB5B /* CloudKitRecordConvertable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E4DB352426693F0091EB5B /* CloudKitRecordConvertable.swift */; }; 51E59599228C77BC00FCC42B /* FeedbinUnreadEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E59598228C77BC00FCC42B /* FeedbinUnreadEntry.swift */; }; 51E5959B228C781500FCC42B /* FeedbinStarredEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 51E5959A228C781500FCC42B /* FeedbinStarredEntry.swift */; }; 552032F8229D5D5A009559E0 /* ReaderAPIEntry.swift in Sources */ = {isa = PBXBuildFile; fileRef = 552032ED229D5D5A009559E0 /* ReaderAPIEntry.swift */; }; @@ -302,9 +299,6 @@ 51E490352288C37100C791F0 /* FeedbinDate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinDate.swift; sourceTree = ""; }; 51E4DB2D242633ED0091EB5B /* CloudKitZone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudKitZone.swift; sourceTree = ""; }; 51E4DB2F2426353D0091EB5B /* CloudKitAccountZone.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudKitAccountZone.swift; sourceTree = ""; }; - 51E4DB3124264B470091EB5B /* WebFeed+CloudKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "WebFeed+CloudKit.swift"; sourceTree = ""; }; - 51E4DB3324264CD50091EB5B /* Folder+CloudKit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Folder+CloudKit.swift"; sourceTree = ""; }; - 51E4DB352426693F0091EB5B /* CloudKitRecordConvertable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudKitRecordConvertable.swift; sourceTree = ""; }; 51E59598228C77BC00FCC42B /* FeedbinUnreadEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinUnreadEntry.swift; sourceTree = ""; }; 51E5959A228C781500FCC42B /* FeedbinStarredEntry.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinStarredEntry.swift; sourceTree = ""; }; 552032ED229D5D5A009559E0 /* ReaderAPIEntry.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReaderAPIEntry.swift; sourceTree = ""; }; @@ -520,11 +514,8 @@ 51C034E0242D660D0014DC71 /* CKError+Extensions.swift */, 5103A9D82422546800410853 /* CloudKitAccountDelegate.swift */, 51E4DB2F2426353D0091EB5B /* CloudKitAccountZone.swift */, - 51E4DB352426693F0091EB5B /* CloudKitRecordConvertable.swift */, 51C034DE242D65D20014DC71 /* CloudKitResult.swift */, 51E4DB2D242633ED0091EB5B /* CloudKitZone.swift */, - 51E4DB3324264CD50091EB5B /* Folder+CloudKit.swift */, - 51E4DB3124264B470091EB5B /* WebFeed+CloudKit.swift */, ); path = CloudKit; sourceTree = ""; @@ -1111,11 +1102,9 @@ 51E490362288C37100C791F0 /* FeedbinDate.swift in Sources */, 9EEAE06E235D002D00E3FEE4 /* FeedlyGetCollectionsService.swift in Sources */, 5165D72922835F7A00D9D53D /* FeedSpecifier.swift in Sources */, - 51E4DB3424264CD50091EB5B /* Folder+CloudKit.swift in Sources */, 9E85C8ED2367020700D0F1F7 /* FeedlyGetEntriesService.swift in Sources */, 9E5EC15923E01D8A00A4E503 /* FeedlyCollectionParser.swift in Sources */, 9E84DC492359A73600D6E809 /* FeedlyCheckpointOperation.swift in Sources */, - 51E4DB3224264B470091EB5B /* WebFeed+CloudKit.swift in Sources */, 9E85C8EB236700E600D0F1F7 /* FeedlyGetEntriesOperation.swift in Sources */, 9E1D154D233370D800F4944C /* FeedlySyncAllOperation.swift in Sources */, 9E44C90F23C6FF3600CCC286 /* FeedlyIngestStreamArticleIdsOperation.swift in Sources */, @@ -1156,7 +1145,6 @@ 51E59599228C77BC00FCC42B /* FeedbinUnreadEntry.swift in Sources */, 552032F8229D5D5A009559E0 /* ReaderAPIEntry.swift in Sources */, 552032FB229D5D5A009559E0 /* ReaderAPITag.swift in Sources */, - 51E4DB362426693F0091EB5B /* CloudKitRecordConvertable.swift in Sources */, 5165D72822835F7800D9D53D /* FeedFinder.swift in Sources */, 9EBD49C023C67602005AD5CD /* FeedlyDownloadArticlesOperation.swift in Sources */, 51D58755227F53BE00900287 /* FeedbinTag.swift in Sources */, diff --git a/Frameworks/Account/CloudKit/CloudKitAccountZone.swift b/Frameworks/Account/CloudKit/CloudKitAccountZone.swift index 5296588ee..e215c734a 100644 --- a/Frameworks/Account/CloudKit/CloudKitAccountZone.swift +++ b/Frameworks/Account/CloudKit/CloudKitAccountZone.swift @@ -18,6 +18,14 @@ final class CloudKitAccountZone: CloudKitZone { let container: CKContainer let database: CKDatabase + struct CloudKitWebFeed { + static let recordType = "WebFeed" + struct Fields { + static let url = "url" + static let editedName = "editedName" + } + } + init(container: CKContainer) { self.container = container self.database = container.privateCloudDatabase @@ -25,20 +33,13 @@ final class CloudKitAccountZone: CloudKitZone { /// Persist a feed record to iCloud and return the external key func createFeed(url: String, editedName: String?, completion: @escaping (Result) -> Void) { - let record = CKRecord(recordType: "Feed", recordID: generateRecordID()) - record["url"] = url + let record = CKRecord(recordType: CloudKitWebFeed.recordType, recordID: generateRecordID()) + record[CloudKitWebFeed.Fields.url] = url if let editedName = editedName { - record["editedName"] = editedName + record[CloudKitWebFeed.Fields.editedName] = editedName } - modify(recordsToStore: [record], recordIDsToDelete: []) { result in - switch result { - case .success: - completion(.success(record.recordID.recordName)) - case .failure(let error): - completion(.failure(error)) - } - } + save(recordToStore: record, completion: completion) } // private func fetchChangesInZones(_ callback: ((Error?) -> Void)? = nil) { diff --git a/Frameworks/Account/CloudKit/CloudKitRecordConvertable.swift b/Frameworks/Account/CloudKit/CloudKitRecordConvertable.swift deleted file mode 100644 index b4463f63a..000000000 --- a/Frameworks/Account/CloudKit/CloudKitRecordConvertable.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// CloudKitRecordConvertable.swift -// Account -// -// Created by Maurice Parker on 3/21/20. -// Copyright © 2020 Ranchero Software, LLC. All rights reserved. -// - -import Foundation -import CloudKit - -protocol CloudKitRecordConvertible { - static var cloudKitRecordType: String { get } - static var cloudKitZoneID: CKRecordZone.ID { get } - - var cloudKitPrimaryKey: String { get } - var recordID: CKRecord.ID { get } - var cloudKitRecord: CKRecord { get } - - func assignCloudKitPrimaryKeyIfNecessary() -} - -extension CloudKitRecordConvertible { - - public static var cloudKitRecordType: String { - return String(describing: self) - } - - public var recordID: CKRecord.ID { - return CKRecord.ID(recordName: cloudKitPrimaryKey, zoneID: Self.cloudKitZoneID) - } - -} diff --git a/Frameworks/Account/CloudKit/CloudKitZone.swift b/Frameworks/Account/CloudKit/CloudKitZone.swift index 6ef9ca242..680afe349 100644 --- a/Frameworks/Account/CloudKit/CloudKitZone.swift +++ b/Frameworks/Account/CloudKit/CloudKitZone.swift @@ -113,6 +113,17 @@ extension CloudKitZone { // }) // } + public func save(recordToStore: CKRecord, completion: @escaping (Result) -> Void) { + modify(recordsToStore: [recordToStore], recordIDsToDelete: []) { result in + switch result { + case .success: + completion(.success(recordToStore.recordID.recordName)) + case .failure(let error): + completion(.failure(error)) + } + } + } + /// Sync local data to CloudKit /// For more about the savePolicy: https://developer.apple.com/documentation/cloudkit/ckrecordsavepolicy public func modify(recordsToStore: [CKRecord], recordIDsToDelete: [CKRecord.ID], completion: @escaping (Result) -> Void) { diff --git a/Frameworks/Account/CloudKit/Folder+CloudKit.swift b/Frameworks/Account/CloudKit/Folder+CloudKit.swift deleted file mode 100644 index cc9271b20..000000000 --- a/Frameworks/Account/CloudKit/Folder+CloudKit.swift +++ /dev/null @@ -1,49 +0,0 @@ -// -// Folder+CloudKit.swift -// Account -// -// Created by Maurice Parker on 3/21/20. -// Copyright © 2020 Ranchero Software, LLC. All rights reserved. -// - -import Foundation -import CloudKit - -extension Folder: CloudKitRecordConvertible { - - enum CloudKitKey: String { - case name - } - - static var cloudKitZoneID: CKRecordZone.ID { - return CloudKitAccountZone.zoneID - } - - var cloudKitPrimaryKey: String { - return externalID! - } - - var cloudKitRecord: CKRecord { - let record = CKRecord(recordType: Self.cloudKitRecordType) - record[.name] = name - return record - } - - func assignCloudKitPrimaryKeyIfNecessary() { - if externalID == nil { - externalID = UUID().uuidString - } - } - -} - -extension CKRecord { - subscript(key: Folder.CloudKitKey) -> Any? { - get { - return self[key.rawValue] - } - set { - self[key.rawValue] = newValue as? CKRecordValue - } - } -} diff --git a/Frameworks/Account/CloudKit/WebFeed+CloudKit.swift b/Frameworks/Account/CloudKit/WebFeed+CloudKit.swift deleted file mode 100644 index 8c6fe43c8..000000000 --- a/Frameworks/Account/CloudKit/WebFeed+CloudKit.swift +++ /dev/null @@ -1,51 +0,0 @@ -// -// WebFeed+CloudKit.swift -// Account -// -// Created by Maurice Parker on 3/21/20. -// Copyright © 2020 Ranchero Software, LLC. All rights reserved. -// - -import Foundation -import CloudKit - -extension WebFeed: CloudKitRecordConvertible { - - enum CloudKitKey: String { - case url - case editedName - } - - static var cloudKitZoneID: CKRecordZone.ID { - return CloudKitAccountZone.zoneID - } - - var cloudKitPrimaryKey: String { - return externalID! - } - - var cloudKitRecord: CKRecord { - let record = CKRecord(recordType: Self.cloudKitRecordType) - record[.url] = url - record[.editedName] = editedName - return record - } - - func assignCloudKitPrimaryKeyIfNecessary() { - if externalID == nil { - externalID = UUID().uuidString - } - } - -} - -extension CKRecord { - subscript(key: WebFeed.CloudKitKey) -> Any? { - get { - return self[key.rawValue] - } - set { - self[key.rawValue] = newValue as? CKRecordValue - } - } -}