From 7c640d51576d8e91ef0973ca07e7b42b27952370 Mon Sep 17 00:00:00 2001 From: Laurent Date: Wed, 19 Jun 2024 14:11:11 +0200 Subject: [PATCH] Improves user error message --- LeStorage/Services.swift | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/LeStorage/Services.swift b/LeStorage/Services.swift index 62def65..aedb521 100644 --- a/LeStorage/Services.swift +++ b/LeStorage/Services.swift @@ -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 }