// // 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 { // MARK: - Login case accesscode(username: String, password: String) case customerProfile(firebaseToken: String) // MARK: - Register case customerRegister(registerModel: RegisterRequestModel, firebaseToken: String) case passwordReset(userName: String) case validation(userName: String, idNumber: String, idType: String) case countriesServices case calculateDefExRate(model: ExchangeRateRequestModel) // MARK: - KFTC case getKFTCParamers(username: String) case deleteAutoDebitAccount(username: String, kftcLogID: String) case renewalToken(username: String) case fetchBankList case checkRealName(model: VerifyAccountRequestModel) case fetchKFTCURL(url: String) case domesticRemitStart case getRecentHistories(from: String, to: String) case fetchBalace(type: String, fintechUseNumber: String) case fetchRecipientName(bankCode: String, accountNumber: String) case sendDomesticRemit(model: DomesticRemitRequestModel) // MARK: - Receiver case fetchRecipients(senderID: String) case dynamicReceiver(username: String, countryID: String, serviceTypeID: String) case fetchCountriesAndServiceTypes(username: String) case addRecipient(senderID: String, recipient: Recipient) case editRecipient(senderID: String, recipient: Recipient) case deleteRecipient(senderID: String, recipientID: String) case fetchBranches(countryCode: String, bankID: String, branchName: String) case validateAccount(validateModel: ValidateAccountRequest) case domesticTransactionHistory(from: String, to: String) case domesticReceipt(transactionID: String) } // MARK: - Request extension APIRouter: ApiServiceType { 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 json( encoding: ParameterEncoding = JSONEncoding.default, needsAuthorization: Bool = true, success: @escaping () -> 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: { (response: ResponseContainer) in if (response.errorCode ?? "") == "1" { let error = NSError(domain: "Network", code: 0, message: response.message ?? "") failure(error) } else { success() } }, failure: failure ) } func json( encoding: ParameterEncoding = JSONEncoding.default, needsAuthorization: Bool = true, success: @escaping (Element) -> 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: { (response: ResponseContainer) in if (response.errorCode ?? "") == "1" { let error = NSError(domain: "Network", code: 0, message: response.message ?? "") failure(error) } else { guard let data = response.data else { let error = NSError(domain: "Network", code: 0, message: "Data is nil") failure(error) return } success(data) } }, failure: failure ) } func json( encoding: ParameterEncoding = JSONEncoding.default, needsAuthorization: Bool = true, success: @escaping (Element) -> 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: { (response: ResponseContainerObject) in if (response.errorCode ?? "") == "1" { let error = NSError(domain: "Network", code: 0, message: response.message ?? "") failure(error) } else { guard let data = response.data else { let error = NSError(domain: "Network", code: 0, message: "Data is nil") failure(error) return } success(data) } }, failure: failure ) } func json( encoding: ParameterEncoding = JSONEncoding.default, needsAuthorization: Bool = true, success: @escaping ([Element]) -> 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: { (response: ResponseContainerArray) in if (response.errorCode ?? "") == "1" { let error = NSError(domain: "Network", code: 0, message: response.message ?? "") failure(error) } else { guard let data = response.data else { let error = NSError(domain: "Network", code: 0, message: "Data is nil") failure(error) return } success(data) } }, failure: failure ) } func request( 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( header: [String: String], encoding: ParameterEncoding = JSONEncoding.default, 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: header ).handle(success: success, failure: failure) } func requestMultipart( 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) } } ) } } // MARK: - Endpoint 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 .dynamicReceiver(let username, let countryID, let serviceType): let path = "\(username)/dynamicField?countryId=\(countryID)&serviceType=\(serviceType)" return "\(baseUrlWithoutVersion)v3/mobile/receiver/\(path)" case .getKFTCParamers(let username): return "\(baseUrl)/kftc/GetKftcParameters/\(username)" case .deleteAutoDebitAccount(let username, _): return "\(baseUrl)/kftc/DeleteAccount/\(username)" case .renewalToken(let username): return "\(baseUrl)/kftc/CheckKFTCAccounts/\(username)" case .fetchBankList: return "\(baseUrl)/kftc/KFTCBankList" case .checkRealName: return "\(baseUrl)/kftc/CheckRealName" case .fetchKFTCURL(let url): return url case .fetchRecipients(let senderID): return "\(baseUrlWithoutVersion)v3/mobile/\(senderID)/receiverinfo" case .fetchCountriesAndServiceTypes(let username): return "\(baseUrlWithoutVersion)v3/mobile/\(username)/FetchCountriesAndServiceTypes" case .addRecipient(let senderID, _): return "\(baseUrlWithoutVersion)v3/mobile/\(senderID)/receiverinfo/add" case .editRecipient(let senderID, let recipient): let recipientID = recipient.receiverID ?? "" return "\(baseUrlWithoutVersion)/v3/mobile/\(senderID)/receiverinfo/modify/\(recipientID)" case .deleteRecipient(let senderID, let recipientID): return "\(baseUrlWithoutVersion)/v3/mobile/\(senderID)/receiverinfo/remove/\(recipientID)" case .fetchBranches(let countryCode, let bankID, let branchName): return "\(baseUrl)/mobile/sendmoney/load/branch/\(countryCode)/\(bankID)/?search=\(branchName)" case .validateAccount: return "\(baseUrl)/mobile/sendmoney/validation/account" case .domesticRemitStart: return "\(baseUrl)/kftc/DomeRemitStart" case .getRecentHistories: return "\(baseUrl)/kftc/GetRecentHistories" case .fetchBalace: return "\(baseUrl)/kftc/CheckBalance" case .fetchRecipientName: return "\(baseUrl)/kftc/GetRecipientInfo" case .sendDomesticRemit: return "\(baseUrl)/kftc/SendDomeRimit" case .domesticTransactionHistory: let userID = GMEDB.shared.user.string(.userId) ?? "" return "\(baseUrl)/mobile/DomestricTranhistory/\(userID)" case .domesticReceipt(let transactionID): return "\(baseUrl)/mobile/DomesticReceipt/\(transactionID)" } } } // MARK: - Method extension APIRouter { 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 .dynamicReceiver: return .post case .getKFTCParamers: return .get case .deleteAutoDebitAccount: return .post case .renewalToken: return .get case .fetchBankList: return .get case .checkRealName: return .post case .fetchKFTCURL: return .get case .fetchRecipients: return .get case .fetchCountriesAndServiceTypes: return .get case .addRecipient: return .post case .editRecipient: return .post case .deleteRecipient: return .post case .fetchBranches: return .post case .validateAccount: return .post case .domesticRemitStart: return .post case .getRecentHistories: return .post case .fetchBalace: return .post case .fetchRecipientName: return .post case .sendDomesticRemit: return .post case .domesticTransactionHistory: return .post case .domesticReceipt: return .post } } } // MARK: - Parameter extension APIRouter { private var parameters: Parameters? { switch self.method { case .post: 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": UIDevice.modelName, "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": UIDevice.modelName, "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 .calculateDefExRate(let model): return model.serialize() case .deleteAutoDebitAccount(_, let kftcLogID): return [ "KftcLogId" : kftcLogID ] case .checkRealName(let model): return [ "CustomerId": model.customerID, "BankCode": model.bankCode, "AccountNumber": model.accountNumber ] case .dynamicReceiver: return nil case .addRecipient(_, let recipient): let paymentMethod = [ "id": recipient.paymentMethod?.id ?? "", "name": recipient.paymentMethod?.name ?? "", "currency": recipient.paymentMethod?.currency ?? [], "localizedName": recipient.paymentMethod?.localizedName ?? "" ] as [String : Any] let branch = [ "id": recipient.agent?.branch?.id ?? "", "name": recipient.agent?.branch?.name ?? "", "localizedName": recipient.agent?.branch?.name ?? "" ] let agent = [ "id": recipient.agent?.id ?? "", "name": recipient.agent?.name ?? "", "currency": recipient.agent?.currency ?? [], "localizedName": recipient.agent?.localizedName ?? "", "branch": branch, "accountNo": recipient.agent?.accountNumber ?? "" ] as [String : Any] return [ "firstName": recipient.firstName ?? "", "middleName": recipient.middleName ?? "", "lastName": recipient.lastName ?? "", "localFirstName": recipient.localFirstName ?? "", "localMiddleName": recipient.localMiddleName ?? "", "localLastName": recipient.localLastName ?? "", "localFullName": recipient.localFullName ?? "", "paymentMethod": paymentMethod, "agent": agent, "receiverId": recipient.receiverID ?? "", "country": recipient.country ?? "", "countryId": recipient.countryID ?? "", "countryCode": recipient.countryCode ?? "", "address": recipient.address ?? "", "state": recipient.state ?? "", "stateId": recipient.stateID ?? "", "city": recipient.city ?? "", "email": recipient.email ?? "", "mobile": recipient.mobile ?? "", "relationship": recipient.relationship ?? "", "relationshipId": recipient.relationshipID ?? "", "district": recipient.district ?? "", "districtId": recipient.districtID ?? "", "purposeOfRemit": recipient.purposeOfRemit ?? "", "purposeOfRemitId": recipient.purposeOfRemitID ?? "", "fullName": recipient.fullName ?? "", "idType": recipient.idType ?? "", "idNumber": recipient.idNumber ?? "", "nativeCountry": recipient.nativeCountry ?? "", "nativeCountryID": recipient.nativeCountryID ?? "", "nativeCountryCode": recipient.nativeCountryCode ?? "" ] case .editRecipient(let senderID, let recipient): return APIRouter.addRecipient(senderID: senderID, recipient: recipient).parameters case .validateAccount(let validateModel): return [ "IdType" : "1", "IdNumber": "", "CustomerFirstName": "", "CustomerLastName": "", "ReceiverFirstName": validateModel.firstName, "ReceiverLastName": validateModel.lastName, "Country": validateModel.country?.countryCode ?? "", "AccountType": validateModel.accountType, "IssuerCode": validateModel.bank?.code ?? "", "AccountNo": validateModel.accountNumber, "BankCode": validateModel.bank?.code ?? "", "Amount": validateModel.amount, "PayoutPartner": validateModel.payoutPartner, "ProcessId": "", "BankId": validateModel.bank?.id ?? "", "ReceiverCountryId": validateModel.country?.countryId ?? "", "deliveryMethodId": validateModel.paymentMethod?.id ?? "" ] case .domesticRemitStart: let senderID = GMEDB.shared.user.string(.senderId) ?? "" return ["CustomerId": senderID] case .getRecentHistories(let from, let to): let senderID = GMEDB.shared.user.string(.senderId) ?? "" return [ "CustomerId": senderID, "FromDate": from, "ToDate": to ] case .fetchBalace(let type, let fintechUseNumber): let senderID = GMEDB.shared.user.string(.senderId) ?? "" return [ "CustomerId": senderID, "type": type, "FintechUseNo": fintechUseNumber ] case .fetchRecipientName(let bankCode, let accountNumber): let senderID = GMEDB.shared.user.string(.senderId) ?? "" return [ "CustomerId": senderID, "BankCode": bankCode, "AccountNumber": accountNumber ] case .sendDomesticRemit(let model): let senderID = GMEDB.shared.user.string(.senderId) ?? "" let userID = GMEDB.shared.user.string(.userId) ?? "" return [ "CustomerId": senderID, "userId": userID, "FintechUseNo": model.fintechID, "SentAmount": model.sendAmount, "RecipientBankCode": model.bankCode, "RecipientAccountNo": model.accountNumber, "RecipientName": model.name, "RecipientPhone": model.mobile, "isUseBiometric": model.isUseBiometric, "txnPassword": model.password, "KftcAccountId" : model.accountID, "type": model.type ] case .domesticTransactionHistory(let from, let to): return [ "FromDate": from, "ToDate": to ] default: return nil } default : return nil } } }