· 6 years ago · Sep 07, 2019, 07:20 AM
1//
2// ApiManager.swift
3// RajaOngkir
4//
5// Created by Agus Cahyono on 16/04/18.
6// Copyright © 2018 Agus Cahyono. All rights reserved.
7//
8
9import Foundation
10import Alamofire
11
12
13struct APIManager {
14
15 /// GET FROM API
16 ///
17 /// - Parameters:
18 /// - url: URL API
19 /// - method: methods
20 /// - parameters: parameters
21 /// - encoding: encoding
22 /// - headers: headers
23 /// - completion: completion
24 /// - failure: failure
25 static func request(_ url: String, method: HTTPMethod, parameters: Parameters, encoding: ParameterEncoding, headers: HTTPHeaders, completion: @escaping (_ response: Data) ->(), failure: @escaping (_ error: String, _ errorCode: Int) -> ()) {
26
27 let manager = Alamofire.SessionManager.default
28 manager.session.configuration.timeoutIntervalForRequest = 120
29
30 let apiURL = APIEnvironment.baseURL + url
31 print("-- URL API: \(apiURL), \n\n-- headers: \(headers), \n\n-- Parameters: \(parameters)")
32
33 manager.request(
34 apiURL,
35 method: method,
36 parameters: parameters,
37 encoding: encoding,
38 headers: headers).responseString(
39 queue: DispatchQueue.main,
40 encoding: String.Encoding.utf8) { response in
41
42 switch (response.result) {
43 case .success:
44 guard let callback = response.data else {
45 failure(self.generateRandomError(), 0)
46 return
47 }
48
49 DispatchQueue.main.async {
50 completion(callback)
51 }
52 case .failure(let error):
53
54 if error._code == NSURLErrorTimedOut {
55 failure("Request is Timeout", 500)
56 } else {
57 guard let callbackError = response.data else {
58 failure(self.generateRandomError(), 0)
59 return
60 }
61
62 do {
63 let decoded = try JSONDecoder().decode(
64 APIError.self, from: callbackError)
65 if let messageError = decoded.data?.errors?.messages, let errorCode = decoded.statusCode {
66 let messages = messageError.joined(separator: ", ")
67 failure(messages, errorCode)
68 } else {
69 failure(APIManager.generateRandomError(), 0)
70 }
71 } catch _ {
72 failure(APIManager.generateRandomError(), 0)
73 }
74 }
75
76 }
77
78 print("--\n \n CALLBACK RESPONSE: \(response)")
79
80// if response.response?.statusCode == 200 {
81//
82//
83// } else if response.response?.statusCode == 401 {
84//// StopAppBaseView.logoutApp()
85// } else {
86//
87// }
88
89 }
90
91 }
92
93 static func upload(_ url: String, headers: HTTPHeaders, parameters: [String: Any], images: [String: UIImage], completion: @escaping (_ response: Data) ->(), failure: @escaping (_ error: String) -> ()) {
94
95 let manager = Alamofire.SessionManager.default
96 manager.session.configuration.timeoutIntervalForRequest = 120
97
98 let apiURL = APIEnvironment.baseURL + url
99 debugPrint("URL API: \(apiURL)")
100
101 manager.upload(multipartFormData: { partData in
102
103 // parameters
104 for (key, value) in parameters {
105 partData.append(key.data(using: .utf8)!, withName: value as! String)
106 }
107
108 if !images.isEmpty {
109 for (key, value) in images {
110 let imageData = value.jpegData(compressionQuality: 0.4)
111 partData.append(imageData!, withName: key)
112 }
113 }
114
115
116 },
117 usingThreshold: UInt64.init(),
118 to: apiURL,
119 method: .post,
120 headers: APIManager.requestHeader()) { encodingResult in
121
122 switch encodingResult {
123 case .success(let upload, _, _):
124 upload.responseString(
125 queue: DispatchQueue.main,
126 encoding: .utf8,
127 completionHandler: { response in
128
129 debugPrint("RESPONSE UPLOAD: \(response)")
130
131 if response.response?.statusCode == 200 {
132 guard let callback = response.data else {
133 failure(self.generateRandomError())
134 return
135 }
136 completion(callback)
137
138 } else if response.response?.statusCode == 401 {
139// StopAppBaseView.logoutApp()
140 } else {
141 guard let callbackError = response.data else {
142 return
143 }
144
145 do {
146 let decoded = try JSONDecoder().decode(
147 APIError.self, from: callbackError)
148 if let messageError = decoded.data?.errors?.messages {
149 let messages = messageError.joined(separator: ", ")
150 failure(messages)
151 } else {
152 failure(APIManager.generateRandomError())
153 }
154 } catch _ {
155 failure(APIManager.generateRandomError())
156 }
157 }
158
159 return
160
161 })
162 case .failure(let encodingError):
163
164 debugPrint(encodingError)
165 }
166
167 }
168
169 }
170
171
172 /// GENERATE RANDOM ERROR
173 ///
174 /// - Returns: string error randoms
175 static func generateRandomError() -> String {
176 return "Oops. Please reload again."
177 }
178
179 static func requestHeader() -> HTTPHeaders {
180
181 let token = "UserToken.token()"
182
183 return [
184 "Content-Type": "application/json",
185 "Authorization": "Bearer \(token)",
186// "X-localization": Profile.shared?.lang ?? "en",
187 ]
188 }
189
190}