diff --git a/Frameworks/Account/Credentials/URLRequest+RSWeb.swift b/Frameworks/Account/Credentials/URLRequest+RSWeb.swift index d056a8666..1edd0ac8e 100755 --- a/Frameworks/Account/Credentials/URLRequest+RSWeb.swift +++ b/Frameworks/Account/Credentials/URLRequest+RSWeb.swift @@ -26,24 +26,13 @@ public extension URLRequest { let auth = "Basic \(base64 ?? "")" setValue(auth, forHTTPHeaderField: HTTPRequestHeader.authorization) case .feedWranglerBasic: - - guard var components = URLComponents(url: url, resolvingAgainstBaseURL: false) else { - return - } - components.queryItems = [ + self.url = url.appendingQueryItems([ URLQueryItem(name: "email", value: credentials.username), URLQueryItem(name: "password", value: credentials.secret), URLQueryItem(name: "client_key", value: FeedWranglerConfig.clientKey) - ] - self.url = components.url + ]) case .feedWranglerToken: - guard var components = URLComponents(url: url, resolvingAgainstBaseURL: false) else { - return - } - var queryItems = components.queryItems ?? [] - queryItems.append(URLQueryItem(name: "access_token", value: credentials.secret)) - components.queryItems = queryItems - self.url = components.url + self.url = url.appendingQueryItem(URLQueryItem(name: "access_token", value: credentials.secret)) case .readerBasic: setValue("application/x-www-form-urlencoded", forHTTPHeaderField: "Content-Type") httpMethod = "POST" diff --git a/Frameworks/Account/FeedWrangler/FeedWranglerAPICaller.swift b/Frameworks/Account/FeedWrangler/FeedWranglerAPICaller.swift index bbb30fc6c..a53f0ce91 100644 --- a/Frameworks/Account/FeedWrangler/FeedWranglerAPICaller.swift +++ b/Frameworks/Account/FeedWrangler/FeedWranglerAPICaller.swift @@ -73,21 +73,20 @@ final class FeedWranglerAPICaller: NSObject { } func renameSubscription(feedID: String, newName: String, completion: @escaping (Result) -> Void) { - guard var components = URLComponents(url: FeedWranglerConfig.clientURL.appendingPathComponent("subscriptions/rename_feed"), resolvingAgainstBaseURL: false) else { - completion(.failure(TransportError.noURL)) - return - } - components.queryItems = [ - URLQueryItem(name: "feed_id", value: feedID), - URLQueryItem(name: "feed_name", value: newName), - ] - guard let url = components.url else { + let url = FeedWranglerConfig.clientURL + .appendingPathComponent("subscriptions/rename_feed") + .appendingQueryItems([ + URLQueryItem(name: "feed_id", value: feedID), + URLQueryItem(name: "feed_name", value: newName), + ]) + + guard let callURL = url else { completion(.failure(TransportError.noURL)) return } - let request = URLRequest(url: url, credentials: credentials) + let request = URLRequest(url: callURL, credentials: credentials) transport.send(request: request, resultType: FeedWranglerSubscriptionsRequest.self) { result in switch result { @@ -101,20 +100,17 @@ final class FeedWranglerAPICaller: NSObject { } func removeSubscription(feedID: String, completion: @escaping (Result) -> Void) { - guard var components = URLComponents(url: FeedWranglerConfig.clientURL.appendingPathComponent("subscriptions/remove_feed"), resolvingAgainstBaseURL: false) else { - completion(.failure(TransportError.noURL)) - return - } - components.queryItems = [ - URLQueryItem(name: "feed_id", value: feedID) - ] - guard let url = components.url else { + let url = FeedWranglerConfig.clientURL + .appendingPathComponent("subscriptions/remove_feed") + .appendingQueryItem(URLQueryItem(name: "feed_id", value: feedID)) + + guard let callURL = url else { completion(.failure(TransportError.noURL)) return } - let request = URLRequest(url: url, credentials: credentials) + let request = URLRequest(url: callURL, credentials: credentials) transport.send(request: request, resultType: FeedWranglerGenericResult.self) { result in switch result { @@ -129,24 +125,21 @@ final class FeedWranglerAPICaller: NSObject { // MARK: FeedItems func retrieveFeedItems(page: Int = 0, completion: @escaping (Result<[FeedWranglerFeedItem], Error>) -> Void) { - guard var components = URLComponents(url: FeedWranglerConfig.clientURL.appendingPathComponent("feed_items/list"), resolvingAgainstBaseURL: false) else { - completion(.failure(TransportError.noURL)) - return - } + // todo: handle initial sync better - components.queryItems = [ - URLQueryItem(name: "read", value: "false"), - URLQueryItem(name: "offset", value: String(page * FeedWranglerConfig.pageSize)), -// URLQueryItem(name: "created_since", value: feedID), -// URLQueryItem(name: "updated_since", value: feedID), - ] + let url = FeedWranglerConfig.clientURL + .appendingPathComponent("feed_items/list") + .appendingQueryItems([ + URLQueryItem(name: "read", value: "false"), + URLQueryItem(name: "offset", value: String(page * FeedWranglerConfig.pageSize)), + ]) - guard let url = components.url else { + guard let callURL = url else { completion(.failure(TransportError.noURL)) return } - let request = URLRequest(url: url, credentials: credentials) + let request = URLRequest(url: callURL, credentials: credentials) transport.send(request: request, resultType: FeedWranglerFeedItemsRequest.self) { result in switch result { @@ -160,23 +153,20 @@ final class FeedWranglerAPICaller: NSObject { } func retrieveUnreadFeedItems(page: Int = 0, completion: @escaping (Result<[FeedWranglerFeedItem], Error>) -> Void) { - guard var components = URLComponents(url: FeedWranglerConfig.clientURL.appendingPathComponent("feed_items/list"), resolvingAgainstBaseURL: false) else { - completion(.failure(TransportError.noURL)) - return - } - components.queryItems = [ - URLQueryItem(name: "read", value: "false"), - URLQueryItem(name: "offset", value: String(page * FeedWranglerConfig.pageSize)), -// URLQueryItem(name: "created_since", value: feedID), -// URLQueryItem(name: "updated_since", value: feedID), - ] + + let url = FeedWranglerConfig.clientURL + .appendingPathComponent("feed_items/list") + .appendingQueryItems([ + URLQueryItem(name: "read", value: "false"), + URLQueryItem(name: "offset", value: String(page * FeedWranglerConfig.pageSize)), + ]) - guard let url = components.url else { + guard let callURL = url else { completion(.failure(TransportError.noURL)) return } - let request = URLRequest(url: url, credentials: credentials) + let request = URLRequest(url: callURL, credentials: credentials) transport.send(request: request, resultType: FeedWranglerFeedItemsRequest.self) { result in switch result { @@ -206,34 +196,31 @@ final class FeedWranglerAPICaller: NSObject { } func retrieveStarredFeedItems(page: Int = 0, completion: @escaping (Result<[FeedWranglerFeedItem], Error>) -> Void) { - guard var components = URLComponents(url: FeedWranglerConfig.clientURL.appendingPathComponent("feed_items/list"), resolvingAgainstBaseURL: false) else { - completion(.failure(TransportError.noURL)) - return - } - components.queryItems = [ + + let url = FeedWranglerConfig.clientURL + .appendingPathComponent("feed_items/list") + .appendingQueryItems([ URLQueryItem(name: "starred", value: "true"), URLQueryItem(name: "offset", value: String(page * FeedWranglerConfig.pageSize)), - // URLQueryItem(name: "created_since", value: feedID), - // URLQueryItem(name: "updated_since", value: feedID), - ] + ]) - guard let url = components.url else { - completion(.failure(TransportError.noURL)) - return - } + guard let callURL = url else { + completion(.failure(TransportError.noURL)) + return + } - let request = URLRequest(url: url, credentials: credentials) + let request = URLRequest(url: callURL, credentials: credentials) - transport.send(request: request, resultType: FeedWranglerFeedItemsRequest.self) { result in - switch result { - case .success(let (_, results)): - completion(.success(results?.feedItems ?? [])) + transport.send(request: request, resultType: FeedWranglerFeedItemsRequest.self) { result in + switch result { + case .success(let (_, results)): + completion(.success(results?.feedItems ?? [])) - case .failure(let error): - completion(.failure(error)) - } + case .failure(let error): + completion(.failure(error)) } } + } func retrieveAllStarredFeedItems(foundItems: [FeedWranglerFeedItem] = [], page: Int = 0, completion: @escaping (Result<[FeedWranglerFeedItem], Error>) -> Void) { retrieveStarredFeedItems(page: page) { result in @@ -252,10 +239,7 @@ final class FeedWranglerAPICaller: NSObject { } func updateArticleStatus(_ articleID: String, _ statuses: [SyncStatus], completion: @escaping () -> Void) { - guard var components = URLComponents(url: FeedWranglerConfig.clientURL.appendingPathComponent("feed_items/update"), resolvingAgainstBaseURL: false) else { - completion() - return - } + var queryItems = statuses.compactMap { status -> URLQueryItem? in switch status.key { case .read: @@ -269,14 +253,16 @@ final class FeedWranglerAPICaller: NSObject { } } queryItems.append(URLQueryItem(name: "feed_item_id", value: articleID)) - components.queryItems = (components.queryItems ?? []) + queryItems + let url = FeedWranglerConfig.clientURL + .appendingPathComponent("feed_items/update") + .appendingQueryItems(queryItems) - guard let url = components.url else { + guard let callURL = url else { completion() return } - let request = URLRequest(url: url, credentials: credentials) + let request = URLRequest(url: callURL, credentials: credentials) transport.send(request: request, resultType: FeedWranglerGenericResult.self) { result in completion() diff --git a/Frameworks/Account/ReaderAPI/ReaderAPICaller.swift b/Frameworks/Account/ReaderAPI/ReaderAPICaller.swift index ba1234a81..3fddb2bd8 100644 --- a/Frameworks/Account/ReaderAPI/ReaderAPICaller.swift +++ b/Frameworks/Account/ReaderAPI/ReaderAPICaller.swift @@ -875,18 +875,15 @@ final class ReaderAPICaller: NSObject { return } - guard var components = URLComponents(url: baseURL.appendingPathComponent(ReaderAPIEndpoints.itemIds.rawValue), resolvingAgainstBaseURL: false) else { - completion(.failure(TransportError.noURL)) - return - } + let url = baseURL + .appendingPathComponent(ReaderAPIEndpoints.itemIds.rawValue) + .appendingQueryItems([ + URLQueryItem(name: "s", value: "user/-/state/com.google/starred"), + URLQueryItem(name: "n", value: "10000"), + URLQueryItem(name: "output", value: "json") + ]) - components.queryItems = [ - URLQueryItem(name: "s", value: "user/-/state/com.google/starred"), - URLQueryItem(name: "n", value: "10000"), - URLQueryItem(name: "output", value: "json") - ] - - guard let callURL = components.url else { + guard let callURL = url else { completion(.failure(TransportError.noURL)) return }