You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

277 lines
8.4 KiB

//
// APIRouter.swift
// GME Remit
//
// Created by InKwon James Kim on 09/08/2019.
// Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
//
import Foundation
import Alamofire
import Localize_Swift
import ObjectMapper
enum APIRouter: ApiServiceType {
case accesscode(username: String, password: String)
case customerProfile(firebaseToken: String)
case customerRegister(registerModel: RegisterRequestModel, firebaseToken: String)
case passwordReset(userName: String)
case validation(userName: String, idNumber: String, idType: String)
case countriesServices
case calculateDefExRate(model: ExchangeRateRequestModel)
case recipientRequirement(country: String)
}
extension APIRouter {
private var manager: SessionManager {
let manager = Alamofire.SessionManager.default
manager.session.configuration.timeoutIntervalForRequest = 150
return manager
}
private var uuid: String {
guard let uuid = GMEDB.shared.app.string(.uuid) else {
let uuid = UUID().uuidString
GMEDB.shared.app.set(uuid, .uuid)
return uuid
}
return uuid
}
private var beforeLoginHeader: [String: String] {
let currentLanguage = Localize.currentLanguage()
let lang = Utility.getLanguageHeader(for: currentLanguage)
let authValue = "172017F9EC11222E8107142733:QRK2UM0Q:\(uuid)".toBase64()
return [
"Authorization": "Basic \(authValue)",
"GME-TOKEN" : "39587YT398@FBQOW8RY3#948R7GB@CNEQW987GF87$TD18$1981..919@@##joghndvberteiru",
"Content-Type": "application/json",
"lang" : lang
]
}
private var afterLoginHeader: [String: String] {
let accessCode = GMEDB.shared.user.string(.accessCode) ?? ""
let currentLanguage = Localize.currentLanguage()
let lang = Utility.getLanguageHeader(for: currentLanguage)
return [
"Authorization": "Bearer " + accessCode,
"GME-TOKEN" : "39587YT398@FBQOW8RY3#948R7GB@CNEQW987GF87$TD18$1981..919@@##joghndvberteiru",
"Content-Type": "application/json",
"clientId": Utility.getMyKftcClientId(),
"lang" : lang
]
}
func request<T: Mappable>(
encoding: ParameterEncoding = JSONEncoding.default,
needsAuthorization: Bool = true,
success: @escaping (T) -> Void,
failure: @escaping (Error) -> Void
) {
guard
let isReachable = NetworkReachabilityManager()?.isReachable,
isReachable else {
let error = NSError(
domain: "NETWORK_REACHABILITY_DOMAIN",
code: -99,
message: "No Internet connection found. Check your connection."
)
return failure(error)
}
manager.request(
self.endpoint,
method: self.method,
parameters: self.parameters,
encoding: encoding,
headers: needsAuthorization ? afterLoginHeader : beforeLoginHeader
).handle(success: success, failure: failure)
}
func kftcRequest<T: Mappable>(
method: HTTPMethod,
header: [String: String],
url: String,
params: [String: Any]?,
encoding: ParameterEncoding = JSONEncoding.default,
needsAuthorization: Bool = true,
success: @escaping (T) -> Void,
failure: @escaping (Error) -> Void
) {
guard
let isReachable = NetworkReachabilityManager()?.isReachable,
isReachable else {
let error = NSError(
domain: "NETWORK_REACHABILITY_DOMAIN",
code: -99,
message: "No Internet connection found. Check your connection."
)
return failure(error)
}
manager.request(
url,
method: method,
parameters: params,
encoding: encoding,
headers: header
).handle(success: success, failure: failure)
}
func requestMultipart<T: Mappable>(
method: HTTPMethod,
_ URLString: URLConvertible,
parameters: [String: String]? = nil,
images: [String: Data],
encoding: Alamofire.ParameterEncoding = URLEncoding.default,
needsAuthorization: Bool = true,
success: @escaping (T) -> Void,
failure: @escaping (Error) -> Void
) {
guard
let isReachable = NetworkReachabilityManager()?.isReachable,
isReachable else {
let error = NSError(
domain: "NETWORK_REACHABILITY_DOMAIN",
code: -99,
message: "No Internet connection found. Check your connection."
)
return failure(error)
}
manager.upload(
multipartFormData: { multipartFormData in
if !images.isEmpty {
images.forEach({ (data) in
multipartFormData.append(
data.value,
withName: data.key,
fileName: data.key + ".jpeg",
mimeType: "image/jpeg"
)
})
}
parameters?.forEach { (params) in
multipartFormData.append(
params.value.data(
using: String.Encoding.utf8,
allowLossyConversion: false
)!,
withName: params.key
)
}
},
to: URLString,
method: method,
headers: needsAuthorization ? afterLoginHeader : beforeLoginHeader,
encodingCompletion: { encodingResult in
switch encodingResult {
case .success(let upload, _, _):
upload.handle(success: success, failure: failure)
case .failure:
let error = NSError(
domain: "NETWORK_REACHABILITY_DOMAIN",
code: -99,
message: "No Internet connection found. Check your connection."
)
failure(error)
}
}
)
}
}
extension APIRouter {
private var endpoint: String {
switch self {
case .accesscode: return "\(baseUrl)/users/access-code"
case .customerProfile: return "\(baseUrl)/mobile/CustomerProfile"
case .customerRegister: return "\(baseUrlWithoutVersion)/v3/mobile/customerRegister"
case .passwordReset: return "\(baseUrl)/mobile/passwordReset"
case .validation: return "\(baseUrlWithoutVersion)/v3/validation"
case .countriesServices: return "\(baseUrl)/mobile/countriesServices"
case .calculateDefExRate: return "\(baseUrl)/mobile/calculateDefExRate"
case .recipientRequirement(let country): return "\(country)"
}
}
private var method: HTTPMethod {
switch self {
case .accesscode: return .post
case .customerProfile: return .post
case .customerRegister: return .post
case .passwordReset: return .post
case .validation: return .post
case .countriesServices: return .get
case .calculateDefExRate: return .post
case .recipientRequirement: return .get
}
}
private var parameters: Parameters? {
switch self {
case .accesscode(let username, let password):
return [
"userId": username,
"password": password
]
case .customerProfile(let firebaseToken):
return [
"userId" : Utility.getMyUserName(),
"uuid": self.uuid,
"appVersion": Utility.getAppVersion() ?? "",
"phoneBrand": Utility.getPhoneBrand(),
"phoneOs": Utility.getPhoneOs(),
"fcmId": firebaseToken,
"osVersion": Utility.getOsVersion()
]
case .customerRegister(let registerModel, let firebaseToken):
return [
"username": registerModel.username ?? "",
"password": registerModel.encryptedPassword ?? "",
"nativecountry": registerModel.nativeCountry ?? "",
"mobilenumber": registerModel.mobileNumber ?? "",
"clientId": Utility.getCliendId(),
"uuid": self.uuid,
"appVersion": Utility.getAppVersion() ?? "",
"phoneBrand": Utility.getPhoneBrand(),
"phoneOs": Utility.getPhoneOs(),
"fcmId": firebaseToken,
"osVersion": Utility.getOsVersion()
]
case .passwordReset(let userName):
return ["username": userName]
case .validation(let userName, let idNumber, let idType):
return [
"Username": userName,
"IdNumber": idNumber,
"IdType": idType
]
case .countriesServices: return nil
case .calculateDefExRate(let model):
return [
"cAmount" : model.senderAmount,
"sCurrency" : model.senderCurrency,
"pAmount" : model.recipientAmount,
"pCurrency" : model.recipientCurrency,
"pCountry" : model.recipientCountryID,
"serviceType": model.serviceType,
"calcBy" : model.calcBy,
"sCountry" : model.senderCountryID,
"pCountryName": model.recipientCountry
]
case .recipientRequirement: return nil
}
}
}