ServiceSpaceX 3.0.5

ServiceSpaceX 3.0.5

Maintained by nihat.basmaci.



 
Depends on:
Alamofire>= 0
SwiftDate>= 0
NVActivityIndicatorView>= 0
Moya>= 0
ReachabilitySwift>= 0
 

  • By
  • Tony Million

ServiceSpacex

**** Service Manager **** pod 'ServiceSpaceX'

ServiceSpacex

Service Manager API

Installation

pod 'ServiceSpaceX'

Usage

override func viewDidLoad() {
    super.viewDidLoad()

    self.showAccounts(page: 1) { (t) in
        switch t {
        case .success(let list):
            print(list.success.description)
            break
        default:
            //"ERROR"
            break
        }
    }
}

func showAccounts(page: Int, completion: @escaping (_ result: APIResult<PtBaseResponse<[PtMyListResponse]>>) -> Void) {
    Network<MyService>().request(target: .showAccounts, completion: completion)
}

Network

func request<M: Decodable>(target: T,completion: @escaping (_ result: APIResult<M>) -> Void ) {
    self.fetch(target: target, completion: completion)
    
    ReachabilityUtil.reachability.whenUnreachable = { _ in
        let alert = UIAlertController(title: "Uyarı", message: "İnternet bağlantısını kontrol ediniz. :(", preferredStyle: .actionSheet)
        alert.addAction(UIAlertAction(title: "Tekrar Dene", style: .default , handler:{ (UIAlertAction)in
            self.fetch(target: target, completion: completion)
        }))
        alert.addAction(UIAlertAction(title: "Vazgeç", style: .cancel , handler:{ (UIAlertAction)in
            
        }))
    }
    
    
}

    func fetch<M: Decodable>(target: T,completion: @escaping (_ result: APIResult<M>) -> Void ) {
    provider.request(target) { (result) in
        
        switch result {
        case .success(let response):
            do {
                let filteredResponse = try response.filterSuccessfulStatusCodes()
                let mappedResponse = try filteredResponse.map(M.self,
                                                              atKeyPath: nil,
                                                              using: self.jsonDecoder,
                                                              failsOnEmptyData: false)
                completion(.success(mappedResponse))
            } catch MoyaError.statusCode(let response) {
                completion(.failure(MoyaError.statusCode(response)))
            } catch {
                debugPrint("##ERROR parsing##: \(error.localizedDescription)")
                let moyaError = MoyaError.requestMapping(error.localizedDescription)
                completion(.failure(moyaError))
            }
        case .failure(let error):
            debugPrint("##ERROR service:## \(error.localizedDescription)")
            completion(.failure(error))
        }
    }
}

Refresh Token

public func adapt(_ urlRequest: URLRequest) throws -> URLRequest {
    var urlRequest = urlRequest
    
    if let urlString = urlRequest.url?.absoluteString, urlString.hasPrefix("BASE URL"), !urlString.hasSuffix("/renew") {
        if let token = accessToken {
            urlRequest.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
        }
    }
    return urlRequest
}


// MARK: - RequestRetrier

public func should(_ manager: SessionManager, retry request: Request, with error: Error, completion: @escaping RequestRetryCompletion) {
    lock.lock() ; defer { lock.unlock() }
    
    if let response = request.task?.response as? HTTPURLResponse, response.statusCode == 401 {
        self.requestsToRetry.append(completion)
        
        if !isRefreshing {
            refreshTokens { succeeded, accessToken in
                
                self.lock.lock() ; defer { self.lock.unlock() }
                
                if let accessToken = accessToken {
                    self.accessToken = accessToken
                }
                
                self.requestsToRetry.forEach { $0(succeeded, 0.0) }
                self.requestsToRetry.removeAll()
            }
        }
    } else {
        completion(false, 0.0)
    }
}
// MARK: - Private - Refresh Tokens

private func refreshTokens(completion: @escaping RefreshCompletion) {
    guard !isRefreshing else { return }
    
    isRefreshing = true
    
    let urlString = "BASEURL-token/renew"
    
    Alamofire.request(urlString, method: .get, parameters: nil, encoding: JSONEncoding.default, headers: ["Authorization":"Bearer \(refreshToken!)"]).responseJSON {  response in
        
        if
            let json = response.result.value as? [String: Any],
            let accessToken = json["accessToken"] as? String
        {
            completion(true, accessToken)
        } else {
            completion(false, nil)
        }
        self.isRefreshing = false
    }
    
}

License