Skip to content

Instantly share code, notes, and snippets.

@satishbabariya
Created January 8, 2018 11:14
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save satishbabariya/dd57d03c510d02477e33faa071c646dd to your computer and use it in GitHub Desktop.
Save satishbabariya/dd57d03c510d02477e33faa071c646dd to your computer and use it in GitHub Desktop.
// 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)
}
}
//
// 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
}
}
//
// 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