Update Router.swift

This commit is contained in:
Jungpyo Hong
2021-05-19 23:16:36 -05:00
committed by GitHub
parent 1a19cfa35c
commit eb5ed75ae1

View File

@ -1,21 +1,23 @@
// //
// Router.swift // Router.swift
// MapDemoApp //
// //
// Created by JungpyoHong on 4/25/21. // Created by JungpyoHong on 5/11/21.
// //
import Foundation import Foundation
typealias NetworkRouterCompletion<T> = (Result<T, AppError>)->() typealias NetworkRouterCompletion<T> = (Result<T, AppError>) -> Void
class Router<EndPoint: EndPointType>: NetworkRouter { class Router<EndPoint: EndPointType>: NetworkRouter {
private var task: URLSessionTask? private var task: URLSessionTask?
private let session = URLSession(configuration: .default) private let session = URLSession(configuration: .default)
func cancel() {
self.task?.cancel()
}
func request<T: Decodable>(_ route: EndPoint, completion: @escaping NetworkRouterCompletion<T>) { func request<T: Decodable>(_ route: EndPoint, completion: @escaping NetworkRouterCompletion<T>) {
do { do {
let request = try self.buildRequest(from: route) let request = try self.buildRequest(from: route)
task = session.dataTask(with: request) { data, response, error in task = session.dataTask(with: request) { data, response, error in
@ -45,11 +47,6 @@ class Router<EndPoint: EndPointType>: NetworkRouter {
print(error) print(error)
completionOnMain(.failure(.parseError)) completionOnMain(.failure(.parseError))
} }
case 401...500: return print(NetworkResponse.authenticationError.rawValue)
case 501...599: return print(NetworkResponse.badRequest.rawValue)
case 600: return print(NetworkResponse.outdated.rawValue)
default: default:
completionOnMain(.failure(.genericError("Something went wrong"))) completionOnMain(.failure(.genericError("Something went wrong")))
@ -58,41 +55,29 @@ class Router<EndPoint: EndPointType>: NetworkRouter {
} catch { } catch {
completion(.failure(.badRequest)) completion(.failure(.badRequest))
} }
task?.resume() self.task?.resume()
}
func cancel() {
self.task?.cancel()
} }
private func buildRequest(from route: EndPoint) throws -> URLRequest { private func buildRequest(from route: EndPoint) throws -> URLRequest {
var request = URLRequest(url: route.baseURL.appendingPathComponent(route.path), var request = URLRequest(url: route.baseURL.appendingPathComponent(route.path),
cachePolicy: .reloadIgnoringLocalAndRemoteCacheData, cachePolicy: .reloadIgnoringLocalAndRemoteCacheData,
timeoutInterval: 10.0) timeoutInterval: 10.0)
request.httpMethod = route.httpMethod.rawValue request.httpMethod = route.httpMethod.rawValue
do { do {
switch route.task { switch route.task {
case .request: case .request:
request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.setValue("application/json", forHTTPHeaderField: "Content-Type")
case .requestParameters(let bodyParameters,
let bodyEncoding,
let urlParameters):
case .requestParameters(let (bodyParameters, urlParameters)):
try self.configureParameters(bodyParameters: bodyParameters, try self.configureParameters(bodyParameters: bodyParameters,
bodyEncoding: bodyEncoding,
urlParameters: urlParameters, urlParameters: urlParameters,
request: &request) request: &request)
case .requestParametersAndHeaders(let bodyParameters, case .requestParametersAndHeaders(let (bodyParameters,
let bodyEncoding, urlParameters,
let urlParameters, additionalHeaders)):
let additionalHeaders):
self.addAdditionalHeaders(additionalHeaders, request: &request) self.addAdditionalHeaders(additionalHeaders, request: &request)
try self.configureParameters(bodyParameters: bodyParameters, try self.configureParameters(bodyParameters: bodyParameters,
bodyEncoding: bodyEncoding,
urlParameters: urlParameters, urlParameters: urlParameters,
request: &request) request: &request)
} }
@ -103,12 +88,15 @@ class Router<EndPoint: EndPointType>: NetworkRouter {
} }
private func configureParameters(bodyParameters: Parameters?, private func configureParameters(bodyParameters: Parameters?,
bodyEncoding: ParameterEncoding,
urlParameters: Parameters?, urlParameters: Parameters?,
request: inout URLRequest) throws { request: inout URLRequest) throws {
do { do {
try bodyEncoding.encode(urlRequest: &request, if let bodyParameters = bodyParameters {
bodyParameters: bodyParameters, urlParameters: urlParameters) try JSONParameterEncoder.encode(urlRequest: &request, with: bodyParameters)
}
if let urlParameters = urlParameters {
try URLParameterEncoder.encode(urlRequest: &request, with: urlParameters)
}
} catch { } catch {
throw error throw error
} }