Created
January 8, 2018 11:14
-
-
Save satishbabariya/dd57d03c510d02477e33faa071c646dd to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// MARK: - Server Request - | |
internal func userDetailsRequest() { | |
if reachability.connection != .none { | |
operationQueue.addOperation { [weak self] in | |
if self == nil { | |
return | |
} | |
self!.isRunningRequest = true | |
_ = APIClient.shared.request(Client: DribbbleClient.user).subscribe({ [weak self] event in | |
if self == nil { | |
return | |
} | |
switch event { | |
case .completed: | |
break | |
case .next(let element): | |
if let user: User = element as? User { | |
let cache: CacheManager<User> = CacheManager<User>(key: CacheKey.userInfo) | |
if let cacheUser: User = cache.get() { | |
if cacheUser != user { | |
do { | |
try cache.set(value: user) | |
SwiftEventBus.postToMainThread(SwiftyNotification.updateUserInfo) | |
} catch { | |
self?.displayBottomMessage(message: error.localizedDescription, type: .error) | |
} | |
} | |
} else { | |
do { | |
try cache.set(value: user) | |
SwiftEventBus.postToMainThread(SwiftyNotification.updateUserInfo) | |
} catch { | |
self?.displayBottomMessage(message: error.localizedDescription, type: .error) | |
} | |
} | |
} | |
break | |
case .error(let error): | |
if let errorMessage : String = APIClient.shared.parseError(error: error){ | |
self?.displayBottomMessage(message: errorMessage, type: .error) | |
} | |
break | |
} | |
}) | |
} | |
}else { | |
self.displayBottomMessage(message: Localizations.nointernet, type: .warning) | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// APIRequest.swift | |
// Tribbble | |
// | |
// Created by Satish Babariya on 1/4/18. | |
// Copyright © 2018 Satish Babariya. All rights reserved. | |
// | |
import Foundation | |
import RxSwift | |
import RxCocoa | |
import Moya | |
class APIClient: NSObject { | |
// MARK: - Attribute - | |
static let shared: APIClient = APIClient() | |
fileprivate var provider: MoyaProvider<DribbbleClient>! | |
fileprivate var decoder: JSONDecoder! | |
// MARK: - Lifecycle - | |
override init() { | |
super.init() | |
provider = MoyaProvider<DribbbleClient>() | |
decoder = JSONDecoder() | |
} | |
// MARK: - Public Interface - | |
func request(Client client: DribbbleClient) -> Observable<Any> { | |
return Observable.create({ [unowned self] (observer) -> Disposable in | |
self.provider.rx.request(client) | |
.asObservable() | |
.subscribe({ [weak self] event in | |
if self == nil { | |
return | |
} | |
print("===================================================") | |
print("DribbbleClient Request Debug Description\nBaseURL : \(client.baseURL)\nMethod : \(client.method)\nPath : \(client.path)\nHeaders : \(String(describing: client.headers))\nParameters : \(String(describing: client.parameters))\nTask : \(client.task)") | |
print("Responce Description : ", event.debugDescription) | |
print("===================================================") | |
switch event { | |
case .next(let element): | |
do { | |
switch client { | |
case .user: | |
let responceData: User = try self!.decoder.decode(User.self, from: element.data) | |
observer.onNext(responceData as Any) | |
break | |
default: | |
observer.onNext(element) | |
break | |
} | |
} catch { | |
observer.onError(error) | |
} | |
break | |
case .error(let error): | |
observer.onError(error) | |
break | |
case .completed: | |
observer.onCompleted() | |
break | |
} | |
}) | |
}) | |
} | |
// MARK: - Internal Helpers - | |
func parseError(error: Error) -> String? { | |
if let moyaError: MoyaError = error as? MoyaError { | |
switch moyaError.response!.statusCode { | |
case 498: | |
ApplicationUtility.shared.getAppDelegate().loadLoginUI() | |
case 429: | |
return "Please Try again after sometime." | |
/// Informational - Request received, continuing process. | |
case 100...199: | |
return nil | |
/// Success - The action was successfully received, understood, and accepted. | |
case 200...299: | |
return nil | |
/// Redirection - Further action must be taken in order to complete the request. | |
case 300...399: | |
return nil | |
/// Client Error - The request contains bad syntax or cannot be fulfilled. | |
case 400...499: | |
return moyaError.errorDescription | |
/// Server Error - The server failed to fulfill an apparently valid request. | |
case 500...599: | |
return moyaError.errorDescription | |
default: | |
return moyaError.errorDescription | |
} | |
} else { | |
return error.localizedDescription | |
} | |
return nil | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// | |
// ServerRequest.swift | |
// Tribbble | |
// | |
// Created by Satish Babariya on 1/4/18. | |
// Copyright © 2018 Satish Babariya. All rights reserved. | |
// | |
import Foundation | |
import Moya | |
import SwiftyUserDefaults | |
// MARK: - TargetType Protocol Implementation | |
enum DribbbleClient { | |
case user | |
case listShots | |
case shotsFromID(String) | |
case createShots([String: Any]) | |
case updateShot(String, [String: Any]) | |
case deleteShot(String) | |
case listProjects | |
case createProject([String: Any]) | |
case updateProject(String, [String: Any]) | |
case deleteProject(String) | |
case createJob([String: Any]) | |
case updateJob(String, [String: Any]) | |
case jobDetails(String) | |
} | |
extension DribbbleClient: TargetType { | |
internal var headers: [String: String]? { | |
return ["Authorization": ("Bearer " + Defaults[.authToken])] | |
} | |
internal var baseURL: URL { | |
return URL(string: "https://api.dribbble.com/v2/")! | |
} | |
internal var path: String { | |
switch self { | |
case .user: | |
return "user" | |
case .listShots: | |
return "user/shots" | |
case .shotsFromID(let id): | |
return "shots/" + id | |
case .createShots: | |
return "shots" | |
case .updateShot(let id, _): | |
return "shots/" + id | |
case .deleteShot(let id): | |
return "shots/" + id | |
case .listProjects: | |
return "user/projects" | |
case .createProject: | |
return "projects" | |
case .deleteProject(let id): | |
return "projects/" + id | |
case .updateProject(let id, _): | |
return "projects/" + id | |
case .createJob: | |
return "jobs" | |
case .updateJob(let id, _): | |
return "jobs/" + id | |
case .jobDetails(let id): | |
return "jobs/" + id | |
} | |
} | |
internal var method: Moya.Method { | |
switch self { | |
case .user, .listShots, .shotsFromID,.listProjects,.jobDetails: | |
return .get | |
case .createShots,.createProject,.createJob: | |
return .post | |
case .updateShot,.updateProject,.updateJob: | |
return .put | |
case .deleteShot,.deleteProject: | |
return .delete | |
} | |
} | |
internal var parameters: [String: Any]? { | |
switch self { | |
case .createShots(let params): | |
return params | |
case .updateShot(_, let params): | |
return params | |
case .createProject(let params): | |
return params | |
case .updateProject(_, let params): | |
return params | |
case .createJob(let params): | |
return params | |
case .updateJob(_, let params): | |
return params | |
default: | |
return nil | |
} | |
} | |
internal var sampleData: Data { | |
return Data() | |
} | |
internal var task: Task { | |
return .requestPlain | |
} | |
internal var validate: Bool { | |
return true | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment