added subscription delete

This commit is contained in:
Maurice Parker 2019-05-09 07:25:45 -05:00
parent 49116fd8e3
commit 50d3a5799c
12 changed files with 95 additions and 18 deletions

View File

@ -593,14 +593,22 @@ public final class Account: DisplayNameProvider, UnreadCountProvider, Container,
return _flattenedFeeds return _flattenedFeeds
} }
func deleteFeeds(_ feeds: Set<Feed>) { public func deleteFeed(_ feed: Feed, completion: @escaping (Result<Void, Error>) -> Void) {
topLevelFeeds.subtract(feeds) delegate.deleteFeed(for: self, container: self, feed: feed, completion: completion)
}
func deleteFeed(_ feed: Feed, from container: Container, completion: @escaping (Result<Void, Error>) -> Void) {
delegate.deleteFeed(for: self, container: container, feed: feed, completion: completion)
}
func deleteFeed(_ feed: Feed) {
topLevelFeeds.remove(feed)
structureDidChange() structureDidChange()
postChildrenDidChangeNotification() postChildrenDidChangeNotification()
} }
public func deleteFeed(_ feed: Feed) { func deleteFeeds(_ feeds: Set<Feed>) {
topLevelFeeds.remove(feed) topLevelFeeds.subtract(feeds)
structureDidChange() structureDidChange()
postChildrenDidChangeNotification() postChildrenDidChangeNotification()
} }

View File

@ -26,6 +26,7 @@ protocol AccountDelegate {
func createFeed(for account: Account, with name: String?, url: String, completion: @escaping (Result<AccountCreateFeedResult, Error>) -> Void) func createFeed(for account: Account, with name: String?, url: String, completion: @escaping (Result<AccountCreateFeedResult, Error>) -> Void)
func renameFeed(for account: Account, with feed: Feed, to name: String, completion: @escaping (Result<Void, Error>) -> Void) func renameFeed(for account: Account, with feed: Feed, to name: String, completion: @escaping (Result<Void, Error>) -> Void)
func deleteFeed(for account: Account, container: Container, feed: Feed, completion: @escaping (Result<Void, Error>) -> Void)
// Called at the end of accounts init method. // Called at the end of accounts init method.
func accountDidInitialize(_ account: Account) func accountDidInitialize(_ account: Account)

View File

@ -27,7 +27,7 @@ public protocol Container: class {
func hasChildFolder(with: String) -> Bool func hasChildFolder(with: String) -> Bool
func childFolder(with: String) -> Folder? func childFolder(with: String) -> Folder?
func deleteFeed(_ feed: Feed) func deleteFeed(_ feed: Feed, completion: @escaping (Result<Void, Error>) -> Void)
func deleteFolder(_ folder: Folder, completion: @escaping (Result<Void, Error>) -> Void) func deleteFolder(_ folder: Folder, completion: @escaping (Result<Void, Error>) -> Void)
func addFeed(_ feed: Feed) func addFeed(_ feed: Feed)

View File

@ -124,7 +124,6 @@ final class FeedbinAPICaller: NSObject {
let callURL = feedbinBaseURL.appendingPathComponent("subscriptions.json") let callURL = feedbinBaseURL.appendingPathComponent("subscriptions.json")
var request = URLRequest(url: callURL, credentials: credentials) var request = URLRequest(url: callURL, credentials: credentials)
request.httpMethod = HTTPMethod.post
request.addValue("application/json; charset=utf-8", forHTTPHeaderField: HTTPRequestHeader.contentType) request.addValue("application/json; charset=utf-8", forHTTPHeaderField: HTTPRequestHeader.contentType)
let payload: Data let payload: Data
@ -135,7 +134,7 @@ final class FeedbinAPICaller: NSObject {
return return
} }
transport.send(request: request, payload: payload) { result in transport.send(request: request, method: HTTPMethod.post, payload: payload) { result in
switch result { switch result {
case .success(let (response, data)): case .success(let (response, data)):
@ -188,13 +187,19 @@ final class FeedbinAPICaller: NSObject {
} }
func renameFeed(subscriptionID: String, newName: String, completion: @escaping (Result<Void, Error>) -> Void) { func renameSubscription(subscriptionID: String, newName: String, completion: @escaping (Result<Void, Error>) -> Void) {
let callURL = feedbinBaseURL.appendingPathComponent("subscriptions/\(subscriptionID)/update.json") let callURL = feedbinBaseURL.appendingPathComponent("subscriptions/\(subscriptionID)/update.json")
let request = URLRequest(url: callURL, credentials: credentials) let request = URLRequest(url: callURL, credentials: credentials)
let payload = FeedbinUpdateSubscription(title: newName) let payload = FeedbinUpdateSubscription(title: newName)
transport.send(request: request, method: HTTPMethod.post, payload: payload, completion: completion) transport.send(request: request, method: HTTPMethod.post, payload: payload, completion: completion)
} }
func deleteSubscription(subscriptionID: String, completion: @escaping (Result<Void, Error>) -> Void) {
let callURL = feedbinBaseURL.appendingPathComponent("subscriptions/\(subscriptionID).json")
let request = URLRequest(url: callURL, credentials: credentials)
transport.send(request: request, method: HTTPMethod.delete, completion: completion)
}
func retrieveTaggings(completionHandler completion: @escaping (Result<[FeedbinTagging]?, Error>) -> Void) { func retrieveTaggings(completionHandler completion: @escaping (Result<[FeedbinTagging]?, Error>) -> Void) {
let callURL = feedbinBaseURL.appendingPathComponent("taggings.json") let callURL = feedbinBaseURL.appendingPathComponent("taggings.json")

View File

@ -158,7 +158,7 @@ final class FeedbinAccountDelegate: AccountDelegate {
return return
} }
caller.renameFeed(subscriptionID: subscriptionID, newName: name) { result in caller.renameSubscription(subscriptionID: subscriptionID, newName: name) { result in
switch result { switch result {
case .success: case .success:
DispatchQueue.main.async { DispatchQueue.main.async {
@ -174,6 +174,35 @@ final class FeedbinAccountDelegate: AccountDelegate {
} }
func deleteFeed(for account: Account, container: Container, feed: Feed, completion: @escaping (Result<Void, Error>) -> Void) {
// This error should never happen
guard let subscriptionID = feed.subscriptionID else {
completion(.failure(FeedbinAccountDelegateError.invalidParameter))
return
}
caller.deleteSubscription(subscriptionID: subscriptionID) { result in
switch result {
case .success:
DispatchQueue.main.async {
if let account = container as? Account {
account.deleteFeed(feed)
}
if let folder = container as? Folder {
folder.deleteFeed(feed)
}
completion(.success(()))
}
case .failure(let error):
DispatchQueue.main.async {
completion(.failure(error))
}
}
}
}
func accountDidInitialize(_ account: Account) { func accountDidInitialize(_ account: Account) {
credentials = try? account.retrieveBasicCredentials() credentials = try? account.retrieveBasicCredentials()
accountMetadata = account.metadata accountMetadata = account.metadata

View File

@ -95,7 +95,11 @@ public final class Folder: DisplayNameProvider, Renamable, Container, UnreadCoun
return topLevelFeeds.contains(feed) return topLevelFeeds.contains(feed)
} }
public func deleteFeed(_ feed: Feed) { public func deleteFeed(_ feed: Feed, completion: @escaping (Result<Void, Error>) -> Void) {
// TODO: Something here...
}
func deleteFeed(_ feed: Feed) {
topLevelFeeds.remove(feed) topLevelFeeds.remove(feed)
postChildrenDidChangeNotification() postChildrenDidChangeNotification()
} }

View File

@ -65,6 +65,19 @@ final class LocalAccountDelegate: AccountDelegate {
completion(.success(())) completion(.success(()))
} }
func deleteFeed(for account: Account, container: Container, feed: Feed, completion: @escaping (Result<Void, Error>) -> Void) {
if let account = container as? Account {
account.deleteFeed(feed)
}
if let folder = container as? Folder {
folder.deleteFeed(feed)
}
completion(.success(()))
}
func accountDidInitialize(_ account: Account) { func accountDidInitialize(_ account: Account) {
} }

View File

@ -244,8 +244,14 @@ private extension SidebarOutlineDataSource {
} }
let sourceContainer = node.parent?.representedObject as? Container let sourceContainer = node.parent?.representedObject as? Container
let destinationFolder = parentNode.representedObject as? Folder let destinationFolder = parentNode.representedObject as? Folder
sourceContainer?.deleteFeed(feed) sourceContainer?.deleteFeed(feed) { result in
switch result {
case .success:
account.addFeed(feed, to: destinationFolder) account.addFeed(feed, to: destinationFolder)
case .failure(let error):
NSApplication.shared.presentError(error)
}
}
} }
func acceptLocalFeedsDrop(_ outlineView: NSOutlineView, _ draggedFeeds: Set<PasteboardFeed>, _ parentNode: Node, _ index: Int) -> Bool { func acceptLocalFeedsDrop(_ outlineView: NSOutlineView, _ draggedFeeds: Set<PasteboardFeed>, _ parentNode: Node, _ index: Int) -> Bool {

View File

@ -55,7 +55,8 @@ class ScriptableAccount: NSObject, UniqueIdScriptingObject, ScriptingObjectConta
} }
} else if let scriptableFeed = element as? ScriptableFeed { } else if let scriptableFeed = element as? ScriptableFeed {
BatchUpdate.shared.perform { BatchUpdate.shared.perform {
account.deleteFeed(scriptableFeed.feed) account.deleteFeed(scriptableFeed.feed) { result in
}
} }
} }
} }

View File

@ -57,7 +57,7 @@ class ScriptableFolder: NSObject, UniqueIdScriptingObject, ScriptingObjectContai
} }
} else if let scriptableFeed = element as? ScriptableFeed { } else if let scriptableFeed = element as? ScriptableFeed {
BatchUpdate.shared.perform { BatchUpdate.shared.perform {
folder.deleteFeed(scriptableFeed.feed) folder.deleteFeed(scriptableFeed.feed) { result in }
} }
} }
} }

View File

@ -139,9 +139,19 @@ private struct SidebarItemSpecifier {
} }
if let feed = feed { if let feed = feed {
container.deleteFeed(feed) container.deleteFeed(feed) { result in
switch result {
case .success():
break
case .failure(let error):
#if os(macOS)
NSApplication.shared.presentError(error)
#else
UIApplication.shared.presentError(error)
#endif
} }
else if let folder = folder { }
} else if let folder = folder {
container.deleteFolder(folder) { result in container.deleteFolder(folder) { result in
switch result { switch result {
case .success(): case .success():

@ -1 +1 @@
Subproject commit bb6839d82ef733d473cdc09925cc70fb2de238aa Subproject commit 9e8ef66b5cba0316926f243d0465dfbb1fdc307e