From cd4b3260b7edfe1dac114c7e92d271d6514a6f35 Mon Sep 17 00:00:00 2001 From: Maurice Parker Date: Mon, 4 May 2020 16:32:28 -0500 Subject: [PATCH] Created reusable fetch method instead of coding a new one for each Reddit fetch --- .../Account/Account.xcodeproj/project.pbxproj | 4 ++ .../Reddit/RedditFeedProvider.swift | 38 ++++--------------- .../FeedProvider/Reddit/RedditSubreddit.swift | 19 ++++++++++ .../FeedProvider/Reddit/RedditUser.swift | 21 ---------- 4 files changed, 31 insertions(+), 51 deletions(-) create mode 100644 Frameworks/Account/FeedProvider/Reddit/RedditSubreddit.swift diff --git a/Frameworks/Account/Account.xcodeproj/project.pbxproj b/Frameworks/Account/Account.xcodeproj/project.pbxproj index 34f422214..827baf242 100644 --- a/Frameworks/Account/Account.xcodeproj/project.pbxproj +++ b/Frameworks/Account/Account.xcodeproj/project.pbxproj @@ -46,6 +46,7 @@ 5133230C2281088A00C30F19 /* subscriptions_add.json in Resources */ = {isa = PBXBuildFile; fileRef = 5133230B2281088A00C30F19 /* subscriptions_add.json */; }; 5133BB47245FD8140001E3D0 /* RedditLinkListing.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5133BB46245FD8140001E3D0 /* RedditLinkListing.swift */; }; 5133BB49246078910001E3D0 /* RedditLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5133BB48246078910001E3D0 /* RedditLink.swift */; }; + 5133BB4B2460BDF30001E3D0 /* RedditSubreddit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5133BB4A2460BDF30001E3D0 /* RedditSubreddit.swift */; }; 5139A6382459822D004D960C /* CloudKitArticleStatusUpdate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5139A6372459822D004D960C /* CloudKitArticleStatusUpdate.swift */; }; 5144EA49227B497600D19003 /* FeedbinAPICaller.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5144EA48227B497600D19003 /* FeedbinAPICaller.swift */; }; 5144EA4E227B829A00D19003 /* FeedbinAccountDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5144EA4D227B829A00D19003 /* FeedbinAccountDelegate.swift */; }; @@ -304,6 +305,7 @@ 5133230B2281088A00C30F19 /* subscriptions_add.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = subscriptions_add.json; sourceTree = ""; }; 5133BB46245FD8140001E3D0 /* RedditLinkListing.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RedditLinkListing.swift; sourceTree = ""; }; 5133BB48246078910001E3D0 /* RedditLink.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RedditLink.swift; sourceTree = ""; }; + 5133BB4A2460BDF30001E3D0 /* RedditSubreddit.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RedditSubreddit.swift; sourceTree = ""; }; 5139A6372459822D004D960C /* CloudKitArticleStatusUpdate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CloudKitArticleStatusUpdate.swift; sourceTree = ""; }; 5144EA48227B497600D19003 /* FeedbinAPICaller.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinAPICaller.swift; sourceTree = ""; }; 5144EA4D227B829A00D19003 /* FeedbinAccountDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbinAccountDelegate.swift; sourceTree = ""; }; @@ -639,6 +641,7 @@ 5193CD53245E3F7A0092735E /* RedditFeedProvider.swift */, 5133BB48246078910001E3D0 /* RedditLink.swift */, 5133BB46245FD8140001E3D0 /* RedditLinkListing.swift */, + 5133BB4A2460BDF30001E3D0 /* RedditSubreddit.swift */, 5193CD80245F295E0092735E /* RedditUser.swift */, ); path = Reddit; @@ -1246,6 +1249,7 @@ 51B3630F244B6CB9000DEF2A /* TwitterExtendedEntities.swift in Sources */, 84B99C9F1FAE8D3200ECDEDB /* ContainerPath.swift in Sources */, 51BC8FCC237EC055004F8B56 /* Feed.swift in Sources */, + 5133BB4B2460BDF30001E3D0 /* RedditSubreddit.swift in Sources */, 846E77501F6EF9C400A165E2 /* LocalAccountRefresher.swift in Sources */, 9EA643CF2391D3560018A28C /* FeedlyAddExistingFeedOperation.swift in Sources */, 55203300229D5D5A009559E0 /* ReaderAPICaller.swift in Sources */, diff --git a/Frameworks/Account/FeedProvider/Reddit/RedditFeedProvider.swift b/Frameworks/Account/FeedProvider/Reddit/RedditFeedProvider.swift index 67f7fb525..41fbd1808 100644 --- a/Frameworks/Account/FeedProvider/Reddit/RedditFeedProvider.swift +++ b/Frameworks/Account/FeedProvider/Reddit/RedditFeedProvider.swift @@ -106,8 +106,8 @@ public final class RedditFeedProvider: FeedProvider { completion(.failure(TwitterFeedProviderError.unknown)) return } - let api = urlComponents.path - retrieveListing(api: api, parameters: [:]) { result in + let api = "\(urlComponents.path).json" + fetch(api: api, parameters: [:], resultType: RedditLinkListing.self) { result in switch result { case .success(let linkListing): let parsedItems = self.makeParsedItems(webFeed.url, linkListing) @@ -124,7 +124,7 @@ public final class RedditFeedProvider: FeedProvider { let oauthRefreshToken = tokenSuccess.credential.oauthRefreshToken let redditFeedProvider = RedditFeedProvider(oauthToken: oauthToken, oauthRefreshToken: oauthRefreshToken) - redditFeedProvider.retrieveUser(api: "/api/v1/me") { result in + redditFeedProvider.fetch(api: "/api/v1/me", resultType: RedditUser.self) { result in switch result { case .success(let user): guard let username = user.name else { @@ -185,35 +185,13 @@ extension RedditFeedProvider: OAuth2SwiftProvider { private extension RedditFeedProvider { - func retrieveUser(api: String, completion: @escaping (Result) -> Void) { + func fetch(api: String, parameters: [String: Any] = [:], resultType: R.Type, completion: @escaping (Result) -> Void) { guard let client = client else { completion(.failure(RedditFeedProviderError.unknown)) return } - + let url = "\(Self.apiBase)\(api)" - - client.request(url, method: .GET, headers: Self.userAgentHeaders) { result in - switch result { - case .success(let response): - if let redditUser = try? JSONDecoder().decode(RedditUser.self, from: response.data) { - completion(.success(redditUser)) - } else { - completion(.failure(RedditFeedProviderError.unknown)) - } - case .failure(let error): - completion(.failure(error)) - } - } - } - - func retrieveListing(api: String, parameters: [String: Any], completion: @escaping (Result) -> Void) { - guard let client = client else { - completion(.failure(RedditFeedProviderError.unknown)) - return - } - - let url = "\(Self.apiBase)\(api).json" var expandedParameters = parameters expandedParameters["raw_json"] = "1" @@ -230,8 +208,8 @@ private extension RedditFeedProvider { let decoder = JSONDecoder() do { - let listing = try decoder.decode(RedditLinkListing.self, from: response.data) - completion(.success(listing)) + let result = try decoder.decode(resultType, from: response.data) + completion(.success(result)) } catch { completion(.failure(error)) } @@ -241,7 +219,7 @@ private extension RedditFeedProvider { if let error = error { completion(.failure(error)) } else { - self.retrieveListing(api: api, parameters: parameters, completion: completion) + self.fetch(api: api, parameters: parameters, resultType: resultType, completion: completion) } } } diff --git a/Frameworks/Account/FeedProvider/Reddit/RedditSubreddit.swift b/Frameworks/Account/FeedProvider/Reddit/RedditSubreddit.swift new file mode 100644 index 000000000..d38e845b6 --- /dev/null +++ b/Frameworks/Account/FeedProvider/Reddit/RedditSubreddit.swift @@ -0,0 +1,19 @@ +// +// RedditSubreddit.swift +// Account +// +// Created by Maurice Parker on 5/4/20. +// Copyright © 2020 Ranchero Software, LLC. All rights reserved. +// + +import Foundation + +struct RedditSubreddit: Codable { + + let iconImg: String? + + enum CodingKeys: String, CodingKey { + case iconImg = "iconImg" + } + +} diff --git a/Frameworks/Account/FeedProvider/Reddit/RedditUser.swift b/Frameworks/Account/FeedProvider/Reddit/RedditUser.swift index ade2acdc7..5488eb96c 100644 --- a/Frameworks/Account/FeedProvider/Reddit/RedditUser.swift +++ b/Frameworks/Account/FeedProvider/Reddit/RedditUser.swift @@ -16,25 +16,4 @@ struct RedditUser: Codable { case name = "name" } -// var url: String { -// return "https://twitter.com/\(screenName ?? "")" -// } -// -// func renderAsHTML() -> String? { -// var html = String() -// html += "" -// return html -// } - }