From e52dc84f13249212a9060d1bd99943a3334b7c65 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Wed, 8 May 2019 06:56:15 -0500 Subject: [PATCH] added create subscription service --- .../Account/Feedbin/FeedbinAPICaller.swift | 71 ++++++++++++++++--- .../Account/Feedbin/FeedbinSubscription.swift | 10 +++ submodules/RSWeb | 2 +- 3 files changed, 73 insertions(+), 10 deletions(-) diff --git a/Frameworks/Account/Feedbin/FeedbinAPICaller.swift b/Frameworks/Account/Feedbin/FeedbinAPICaller.swift index 16344fe80..aca381d73 100644 --- a/Frameworks/Account/Feedbin/FeedbinAPICaller.swift +++ b/Frameworks/Account/Feedbin/FeedbinAPICaller.swift @@ -9,6 +9,13 @@ import Foundation import RSWeb +enum CreateSubscriptionResult { + case created(String?) + case multipleChoice([FeedbinSubscription]?) + case alreadySubscribed + case notFound +} + final class FeedbinAPICaller: NSObject { private let feedbinBaseURL = URL(string: "https://api.feedbin.com/v2/")! @@ -56,8 +63,8 @@ final class FeedbinAPICaller: NSObject { transport.send(request: request, resultType: [FeedbinTag].self) { [weak self] result in switch result { - case .success(let (headers, tags)): - self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.tags, headers: headers) + case .success(let (response, tags)): + self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.tags, headers: response.allHeaderFields) completion(.success(tags)) case .failure(let error): completion(.failure(error)) @@ -102,8 +109,8 @@ final class FeedbinAPICaller: NSObject { transport.send(request: request, resultType: [FeedbinSubscription].self) { [weak self] result in switch result { - case .success(let (headers, subscriptions)): - self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.subscriptions, headers: headers) + case .success(let (response, subscriptions)): + self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.subscriptions, headers: response.allHeaderFields) completion(.success(subscriptions)) case .failure(let error): completion(.failure(error)) @@ -113,6 +120,52 @@ final class FeedbinAPICaller: NSObject { } + func createSubscription(url: String, completionHandler completion: @escaping (Result) -> Void) { + + let callURL = feedbinBaseURL.appendingPathComponent("subscriptions.json") + let conditionalGet = accountMetadata?.conditionalGetInfo[AccountMetadata.ConditionalGetKeys.subscriptions] + let request = URLRequest(url: callURL, credentials: credentials, conditionalGet: conditionalGet) + let payload = FeedbinCreateSubscription(feedURL: url) + + + transport.send(request: request, method: HTTPMethod.post, payload: payload, resultType: [FeedbinSubscription].self) { [weak self] result in + + switch result { + case .success(let (response, subscriptions)): + + self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.subscriptions, headers: response.allHeaderFields) + + switch response.forcedStatusCode { + case 201: + let location = response.valueForHTTPHeaderField(HTTPResponseHeader.location) + completion(.success(.created(location))) + case 300: + completion(.success(.multipleChoice(subscriptions))) + case 302: + completion(.success(.alreadySubscribed)) + default: + completion(.failure(TransportError.httpError(status: response.forcedStatusCode))) + } + + case .failure(let error): + + switch error { + case TransportError.httpError(let status): + if status == 404 { + completion(.success(.notFound)) + } else { + completion(.failure(error)) + } + default: + completion(.failure(error)) + } + + } + + } + + } + func retrieveTaggings(completionHandler completion: @escaping (Result<[FeedbinTagging]?, Error>) -> Void) { let callURL = feedbinBaseURL.appendingPathComponent("taggings.json") @@ -122,8 +175,8 @@ final class FeedbinAPICaller: NSObject { transport.send(request: request, resultType: [FeedbinTagging].self) { [weak self] result in switch result { - case .success(let (headers, taggings)): - self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.taggings, headers: headers) + case .success(let (response, taggings)): + self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.taggings, headers: response.allHeaderFields) completion(.success(taggings)) case .failure(let error): completion(.failure(error)) @@ -142,8 +195,8 @@ final class FeedbinAPICaller: NSObject { transport.send(request: request, resultType: [FeedbinIcon].self) { [weak self] result in switch result { - case .success(let (headers, icons)): - self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.icons, headers: headers) + case .success(let (response, icons)): + self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.icons, headers: response.allHeaderFields) completion(.success(icons)) case .failure(let error): completion(.failure(error)) @@ -159,7 +212,7 @@ final class FeedbinAPICaller: NSObject { extension FeedbinAPICaller { - func storeConditionalGet(metadata: AccountMetadata?, key: String, headers: HTTPHeaders) { + func storeConditionalGet(metadata: AccountMetadata?, key: String, headers: [AnyHashable : Any]) { if var conditionalGet = accountMetadata?.conditionalGetInfo { conditionalGet[key] = HTTPConditionalGetInfo(headers: headers) accountMetadata?.conditionalGetInfo = conditionalGet diff --git a/Frameworks/Account/Feedbin/FeedbinSubscription.swift b/Frameworks/Account/Feedbin/FeedbinSubscription.swift index 326ac3e76..7294d3778 100644 --- a/Frameworks/Account/Feedbin/FeedbinSubscription.swift +++ b/Frameworks/Account/Feedbin/FeedbinSubscription.swift @@ -27,3 +27,13 @@ struct FeedbinSubscription: Codable { } } + +struct FeedbinCreateSubscription: Codable { + + let feedURL: String + + enum CodingKeys: String, CodingKey { + case feedURL = "feed_url" + } + +} diff --git a/submodules/RSWeb b/submodules/RSWeb index 4cf5b71a2..bb6839d82 160000 --- a/submodules/RSWeb +++ b/submodules/RSWeb @@ -1 +1 @@ -Subproject commit 4cf5b71a292573c71ca212997a453f9158e95db2 +Subproject commit bb6839d82ef733d473cdc09925cc70fb2de238aa