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

5 years ago
5 years ago
5 years ago
5 years ago
  1. //
  2. // APIRouter.swift
  3. // GME Remit
  4. //
  5. // Created by InKwon James Kim on 09/08/2019.
  6. // Copyright © 2019 Gobal Money Express Co. Ltd. All rights reserved.
  7. //
  8. import Foundation
  9. import Alamofire
  10. import Localize_Swift
  11. import ObjectMapper
  12. enum APIRouter: ApiServiceType {
  13. case accesscode(username: String, password: String)
  14. case customerProfile(firebaseToken: String)
  15. case customerRegister(registerModel: RegisterRequestModel, firebaseToken: String)
  16. case passwordReset(userName: String)
  17. case validation(userName: String, idNumber: String, idType: String)
  18. case countriesServices
  19. case calculateDefExRate(model: ExchangeRateRequestModel)
  20. case recipientRequirement(country: String)
  21. }
  22. extension APIRouter {
  23. private var manager: SessionManager {
  24. let manager = Alamofire.SessionManager.default
  25. manager.session.configuration.timeoutIntervalForRequest = 150
  26. return manager
  27. }
  28. private var uuid: String {
  29. guard let uuid = GMEDB.shared.app.string(.uuid) else {
  30. let uuid = UUID().uuidString
  31. GMEDB.shared.app.set(uuid, .uuid)
  32. return uuid
  33. }
  34. return uuid
  35. }
  36. private var beforeLoginHeader: [String: String] {
  37. let currentLanguage = Localize.currentLanguage()
  38. let lang = Utility.getLanguageHeader(for: currentLanguage)
  39. let authValue = "172017F9EC11222E8107142733:QRK2UM0Q:\(uuid)".toBase64()
  40. return [
  41. "Authorization": "Basic \(authValue)",
  42. "GME-TOKEN" : "39587YT398@FBQOW8RY3#948R7GB@CNEQW987GF87$TD18$1981..919@@##joghndvberteiru",
  43. "Content-Type": "application/json",
  44. "lang" : lang
  45. ]
  46. }
  47. private var afterLoginHeader: [String: String] {
  48. let accessCode = GMEDB.shared.user.string(.accessCode) ?? ""
  49. let currentLanguage = Localize.currentLanguage()
  50. let lang = Utility.getLanguageHeader(for: currentLanguage)
  51. return [
  52. "Authorization": "Bearer " + accessCode,
  53. "GME-TOKEN" : "39587YT398@FBQOW8RY3#948R7GB@CNEQW987GF87$TD18$1981..919@@##joghndvberteiru",
  54. "Content-Type": "application/json",
  55. "clientId": Utility.getMyKftcClientId(),
  56. "lang" : lang
  57. ]
  58. }
  59. func request<T: Mappable>(
  60. encoding: ParameterEncoding = JSONEncoding.default,
  61. needsAuthorization: Bool = true,
  62. success: @escaping (T) -> Void,
  63. failure: @escaping (Error) -> Void
  64. ) {
  65. guard
  66. let isReachable = NetworkReachabilityManager()?.isReachable,
  67. isReachable else {
  68. let error = NSError(
  69. domain: "NETWORK_REACHABILITY_DOMAIN",
  70. code: -99,
  71. message: "No Internet connection found. Check your connection."
  72. )
  73. return failure(error)
  74. }
  75. manager.request(
  76. self.endpoint,
  77. method: self.method,
  78. parameters: self.parameters,
  79. encoding: encoding,
  80. headers: needsAuthorization ? afterLoginHeader : beforeLoginHeader
  81. ).handle(success: success, failure: failure)
  82. }
  83. func kftcRequest<T: Mappable>(
  84. method: HTTPMethod,
  85. header: [String: String],
  86. url: String,
  87. params: [String: Any]?,
  88. encoding: ParameterEncoding = JSONEncoding.default,
  89. needsAuthorization: Bool = true,
  90. success: @escaping (T) -> Void,
  91. failure: @escaping (Error) -> Void
  92. ) {
  93. guard
  94. let isReachable = NetworkReachabilityManager()?.isReachable,
  95. isReachable else {
  96. let error = NSError(
  97. domain: "NETWORK_REACHABILITY_DOMAIN",
  98. code: -99,
  99. message: "No Internet connection found. Check your connection."
  100. )
  101. return failure(error)
  102. }
  103. manager.request(
  104. url,
  105. method: method,
  106. parameters: params,
  107. encoding: encoding,
  108. headers: header
  109. ).handle(success: success, failure: failure)
  110. }
  111. func requestMultipart<T: Mappable>(
  112. method: HTTPMethod,
  113. _ URLString: URLConvertible,
  114. parameters: [String: String]? = nil,
  115. images: [String: Data],
  116. encoding: Alamofire.ParameterEncoding = URLEncoding.default,
  117. needsAuthorization: Bool = true,
  118. success: @escaping (T) -> Void,
  119. failure: @escaping (Error) -> Void
  120. ) {
  121. guard
  122. let isReachable = NetworkReachabilityManager()?.isReachable,
  123. isReachable else {
  124. let error = NSError(
  125. domain: "NETWORK_REACHABILITY_DOMAIN",
  126. code: -99,
  127. message: "No Internet connection found. Check your connection."
  128. )
  129. return failure(error)
  130. }
  131. manager.upload(
  132. multipartFormData: { multipartFormData in
  133. if !images.isEmpty {
  134. images.forEach({ (data) in
  135. multipartFormData.append(
  136. data.value,
  137. withName: data.key,
  138. fileName: data.key + ".jpeg",
  139. mimeType: "image/jpeg"
  140. )
  141. })
  142. }
  143. parameters?.forEach { (params) in
  144. multipartFormData.append(
  145. params.value.data(
  146. using: String.Encoding.utf8,
  147. allowLossyConversion: false
  148. )!,
  149. withName: params.key
  150. )
  151. }
  152. },
  153. to: URLString,
  154. method: method,
  155. headers: needsAuthorization ? afterLoginHeader : beforeLoginHeader,
  156. encodingCompletion: { encodingResult in
  157. switch encodingResult {
  158. case .success(let upload, _, _):
  159. upload.handle(success: success, failure: failure)
  160. case .failure:
  161. let error = NSError(
  162. domain: "NETWORK_REACHABILITY_DOMAIN",
  163. code: -99,
  164. message: "No Internet connection found. Check your connection."
  165. )
  166. failure(error)
  167. }
  168. }
  169. )
  170. }
  171. }
  172. extension APIRouter {
  173. private var endpoint: String {
  174. switch self {
  175. case .accesscode: return "\(baseUrl)/users/access-code"
  176. case .customerProfile: return "\(baseUrl)/mobile/CustomerProfile"
  177. case .customerRegister: return "\(baseUrlWithoutVersion)/v3/mobile/customerRegister"
  178. case .passwordReset: return "\(baseUrl)/mobile/passwordReset"
  179. case .validation: return "\(baseUrlWithoutVersion)/v3/validation"
  180. case .countriesServices: return "\(baseUrl)/mobile/countriesServices"
  181. case .calculateDefExRate: return "\(baseUrl)/mobile/calculateDefExRate"
  182. case .recipientRequirement(let country): return "\(country)"
  183. }
  184. }
  185. private var method: HTTPMethod {
  186. switch self {
  187. case .accesscode: return .post
  188. case .customerProfile: return .post
  189. case .customerRegister: return .post
  190. case .passwordReset: return .post
  191. case .validation: return .post
  192. case .countriesServices: return .get
  193. case .calculateDefExRate: return .post
  194. case .recipientRequirement: return .get
  195. }
  196. }
  197. private var parameters: Parameters? {
  198. switch self {
  199. case .accesscode(let username, let password):
  200. return [
  201. "userId": username,
  202. "password": password
  203. ]
  204. case .customerProfile(let firebaseToken):
  205. return [
  206. "userId" : Utility.getMyUserName(),
  207. "uuid": self.uuid,
  208. "appVersion": Utility.getAppVersion() ?? "",
  209. "phoneBrand": Utility.getPhoneBrand(),
  210. "phoneOs": Utility.getPhoneOs(),
  211. "fcmId": firebaseToken,
  212. "osVersion": Utility.getOsVersion()
  213. ]
  214. case .customerRegister(let registerModel, let firebaseToken):
  215. return [
  216. "username": registerModel.username ?? "",
  217. "password": registerModel.encryptedPassword ?? "",
  218. "nativecountry": registerModel.nativeCountry ?? "",
  219. "mobilenumber": registerModel.mobileNumber ?? "",
  220. "clientId": Utility.getCliendId(),
  221. "uuid": self.uuid,
  222. "appVersion": Utility.getAppVersion() ?? "",
  223. "phoneBrand": Utility.getPhoneBrand(),
  224. "phoneOs": Utility.getPhoneOs(),
  225. "fcmId": firebaseToken,
  226. "osVersion": Utility.getOsVersion()
  227. ]
  228. case .passwordReset(let userName):
  229. return ["username": userName]
  230. case .validation(let userName, let idNumber, let idType):
  231. return [
  232. "Username": userName,
  233. "IdNumber": idNumber,
  234. "IdType": idType
  235. ]
  236. case .countriesServices: return nil
  237. case .calculateDefExRate(let model):
  238. return [
  239. "cAmount" : model.senderAmount,
  240. "sCurrency" : model.senderCurrency,
  241. "pAmount" : model.recipientAmount,
  242. "pCurrency" : model.recipientCurrency,
  243. "pCountry" : model.recipientCountryID,
  244. "serviceType": model.serviceType,
  245. "calcBy" : model.calcBy,
  246. "sCountry" : model.senderCountryID,
  247. "pCountryName": model.recipientCountry
  248. ]
  249. case .recipientRequirement: return nil
  250. }
  251. }
  252. }