NetNewsWire/Frameworks/Account/CloudKit/CloudKitAccountZone.swift

88 lines
2.4 KiB
Swift
Raw Normal View History

//
// CloudKitAccountZone.swift
// Account
//
// Created by Maurice Parker on 3/21/20.
// Copyright © 2020 Ranchero Software, LLC. All rights reserved.
//
import Foundation
import os.log
import RSWeb
import CloudKit
final class CloudKitAccountZone: CloudKitZone {
static var zoneID: CKRecordZone.ID {
return CKRecordZone.ID(zoneName: "Account", ownerName: CKCurrentUserDefaultName)
}
var log = OSLog(subsystem: Bundle.main.bundleIdentifier!, category: "CloudKit")
weak var container: CKContainer?
weak var database: CKDatabase?
weak var refreshProgress: DownloadProgress?
2020-03-29 18:53:52 +02:00
var delegate: CloudKitZoneDelegate? = nil
2020-03-28 14:53:03 +01:00
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
}
2020-03-29 15:52:59 +02:00
/// Persist a web feed record to iCloud and return the external key
2020-03-29 18:53:52 +02:00
func createWebFeed(url: String, editedName: String?, completion: @escaping (Result<String, Error>) -> Void) {
2020-03-28 14:53:03 +01:00
let record = CKRecord(recordType: CloudKitWebFeed.recordType, recordID: generateRecordID())
record[CloudKitWebFeed.Fields.url] = url
2020-03-27 19:59:42 +01:00
if let editedName = editedName {
2020-03-28 14:53:03 +01:00
record[CloudKitWebFeed.Fields.editedName] = editedName
2020-03-27 19:59:42 +01:00
}
2020-03-29 15:52:59 +02:00
save(record: record) { result in
switch result {
case .success:
completion(.success(record.externalID))
2020-03-29 15:52:59 +02:00
case .failure(let error):
completion(.failure(error))
}
}
2020-03-27 19:59:42 +01:00
}
2020-03-30 00:53:11 +02:00
func renameWebFeed(_ webFeed: WebFeed, editedName: String?, completion: @escaping (Result<Void, Error>) -> Void) {
guard let externalID = webFeed.externalID else {
completion(.failure(CloudKitZoneError.invalidParameter))
return
}
let recordID = CKRecord.ID(recordName: externalID, zoneID: Self.zoneID)
let record = CKRecord(recordType: CloudKitWebFeed.recordType, recordID: recordID)
record[CloudKitWebFeed.Fields.editedName] = editedName
save(record: record) { result in
switch result {
case .success:
completion(.success(()))
case .failure(let error):
completion(.failure(error))
}
}
}
/// Deletes a web feed from iCloud
2020-03-29 15:52:59 +02:00
func removeWebFeed(_ webFeed: WebFeed, completion: @escaping (Result<Void, Error>) -> Void) {
guard let externalID = webFeed.externalID else {
completion(.failure(CloudKitZoneError.invalidParameter))
return
}
delete(externalID: externalID, completion: completion)
}
}