|
|
|
|
@ -110,19 +110,21 @@ public class Services { |
|
|
|
|
{"detail":"Informations d'authentification non fournies."} |
|
|
|
|
*/ |
|
|
|
|
Logger.log("Failed Run \(request.httpMethod ?? "") \(request.url?.absoluteString ?? "")") |
|
|
|
|
var errorString: String = String(data: task.0, encoding: .utf8) ?? "" |
|
|
|
|
let errorString: String = String(data: task.0, encoding: .utf8) ?? "" |
|
|
|
|
var errorMessage = ErrorMessage(error: errorString, domain: "") |
|
|
|
|
|
|
|
|
|
if let message = self.errorMessageFromResponse(data: task.0) { |
|
|
|
|
errorString = message |
|
|
|
|
errorMessage = message |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if let apiCallId, let type = (T.self as? any Storable.Type) { |
|
|
|
|
try Store.main.rescheduleApiCalls(id: apiCallId, type: type) |
|
|
|
|
Store.main.logFailedAPICall(apiCallId, request: request, collectionName: type.resourceName(), error: errorString) |
|
|
|
|
Store.main.logFailedAPICall(apiCallId, request: request, collectionName: type.resourceName(), error: errorMessage.message) |
|
|
|
|
} else { |
|
|
|
|
Store.main.logFailedAPICall(request: request, error: errorString) |
|
|
|
|
Store.main.logFailedAPICall(request: request, error: errorMessage.message) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
throw ServiceError.responseError(response: errorString) |
|
|
|
|
throw ServiceError.responseError(response: errorMessage.error) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return try jsonDecoder.decode(T.self, from: task.0) |
|
|
|
|
@ -358,7 +360,7 @@ public class Services { |
|
|
|
|
/// Parse a json data and tries to extract its error message |
|
|
|
|
/// - Parameters: |
|
|
|
|
/// - data: some JSON data |
|
|
|
|
fileprivate func errorMessageFromResponse(data: Data) -> String? { |
|
|
|
|
fileprivate func errorMessageFromResponse(data: Data) -> ErrorMessage? { |
|
|
|
|
do { |
|
|
|
|
if let jsonObject = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any] { |
|
|
|
|
if let tuple = jsonObject.first { |
|
|
|
|
@ -368,7 +370,7 @@ public class Services { |
|
|
|
|
} else if let string = tuple.value as? String { |
|
|
|
|
error = string |
|
|
|
|
} |
|
|
|
|
return "\(error) (\(tuple.key))" |
|
|
|
|
return ErrorMessage(error: error, domain: tuple.key) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} catch { |
|
|
|
|
@ -379,6 +381,15 @@ public class Services { |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
struct ErrorMessage { |
|
|
|
|
let error: String |
|
|
|
|
let domain: String |
|
|
|
|
|
|
|
|
|
var message: String { |
|
|
|
|
return "\(self.error) (\(self.domain))" |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
struct AuthResponse: Codable { |
|
|
|
|
let token: String |
|
|
|
|
} |
|
|
|
|
|