added create subscription service
This commit is contained in:
parent
c5b0bfcd91
commit
e52dc84f13
@ -9,6 +9,13 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import RSWeb
|
import RSWeb
|
||||||
|
|
||||||
|
enum CreateSubscriptionResult {
|
||||||
|
case created(String?)
|
||||||
|
case multipleChoice([FeedbinSubscription]?)
|
||||||
|
case alreadySubscribed
|
||||||
|
case notFound
|
||||||
|
}
|
||||||
|
|
||||||
final class FeedbinAPICaller: NSObject {
|
final class FeedbinAPICaller: NSObject {
|
||||||
|
|
||||||
private let feedbinBaseURL = URL(string: "https://api.feedbin.com/v2/")!
|
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
|
transport.send(request: request, resultType: [FeedbinTag].self) { [weak self] result in
|
||||||
|
|
||||||
switch result {
|
switch result {
|
||||||
case .success(let (headers, tags)):
|
case .success(let (response, tags)):
|
||||||
self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.tags, headers: headers)
|
self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.tags, headers: response.allHeaderFields)
|
||||||
completion(.success(tags))
|
completion(.success(tags))
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
completion(.failure(error))
|
completion(.failure(error))
|
||||||
@ -102,8 +109,8 @@ final class FeedbinAPICaller: NSObject {
|
|||||||
transport.send(request: request, resultType: [FeedbinSubscription].self) { [weak self] result in
|
transport.send(request: request, resultType: [FeedbinSubscription].self) { [weak self] result in
|
||||||
|
|
||||||
switch result {
|
switch result {
|
||||||
case .success(let (headers, subscriptions)):
|
case .success(let (response, subscriptions)):
|
||||||
self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.subscriptions, headers: headers)
|
self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.subscriptions, headers: response.allHeaderFields)
|
||||||
completion(.success(subscriptions))
|
completion(.success(subscriptions))
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
completion(.failure(error))
|
completion(.failure(error))
|
||||||
@ -113,6 +120,52 @@ final class FeedbinAPICaller: NSObject {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func createSubscription(url: String, completionHandler completion: @escaping (Result<CreateSubscriptionResult, Error>) -> 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) {
|
func retrieveTaggings(completionHandler completion: @escaping (Result<[FeedbinTagging]?, Error>) -> Void) {
|
||||||
|
|
||||||
let callURL = feedbinBaseURL.appendingPathComponent("taggings.json")
|
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
|
transport.send(request: request, resultType: [FeedbinTagging].self) { [weak self] result in
|
||||||
|
|
||||||
switch result {
|
switch result {
|
||||||
case .success(let (headers, taggings)):
|
case .success(let (response, taggings)):
|
||||||
self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.taggings, headers: headers)
|
self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.taggings, headers: response.allHeaderFields)
|
||||||
completion(.success(taggings))
|
completion(.success(taggings))
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
completion(.failure(error))
|
completion(.failure(error))
|
||||||
@ -142,8 +195,8 @@ final class FeedbinAPICaller: NSObject {
|
|||||||
transport.send(request: request, resultType: [FeedbinIcon].self) { [weak self] result in
|
transport.send(request: request, resultType: [FeedbinIcon].self) { [weak self] result in
|
||||||
|
|
||||||
switch result {
|
switch result {
|
||||||
case .success(let (headers, icons)):
|
case .success(let (response, icons)):
|
||||||
self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.icons, headers: headers)
|
self?.storeConditionalGet(metadata: self?.accountMetadata, key: AccountMetadata.ConditionalGetKeys.icons, headers: response.allHeaderFields)
|
||||||
completion(.success(icons))
|
completion(.success(icons))
|
||||||
case .failure(let error):
|
case .failure(let error):
|
||||||
completion(.failure(error))
|
completion(.failure(error))
|
||||||
@ -159,7 +212,7 @@ final class FeedbinAPICaller: NSObject {
|
|||||||
|
|
||||||
extension FeedbinAPICaller {
|
extension FeedbinAPICaller {
|
||||||
|
|
||||||
func storeConditionalGet(metadata: AccountMetadata?, key: String, headers: HTTPHeaders) {
|
func storeConditionalGet(metadata: AccountMetadata?, key: String, headers: [AnyHashable : Any]) {
|
||||||
if var conditionalGet = accountMetadata?.conditionalGetInfo {
|
if var conditionalGet = accountMetadata?.conditionalGetInfo {
|
||||||
conditionalGet[key] = HTTPConditionalGetInfo(headers: headers)
|
conditionalGet[key] = HTTPConditionalGetInfo(headers: headers)
|
||||||
accountMetadata?.conditionalGetInfo = conditionalGet
|
accountMetadata?.conditionalGetInfo = conditionalGet
|
||||||
|
@ -27,3 +27,13 @@ struct FeedbinSubscription: Codable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct FeedbinCreateSubscription: Codable {
|
||||||
|
|
||||||
|
let feedURL: String
|
||||||
|
|
||||||
|
enum CodingKeys: String, CodingKey {
|
||||||
|
case feedURL = "feed_url"
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
@ -1 +1 @@
|
|||||||
Subproject commit 4cf5b71a292573c71ca212997a453f9158e95db2
|
Subproject commit bb6839d82ef733d473cdc09925cc70fb2de238aa
|
Loading…
x
Reference in New Issue
Block a user