|
|
|
|
@ -89,7 +89,7 @@ public class Services { |
|
|
|
|
fileprivate func _runRequest<T: Decodable>(_ request: URLRequest, apiCallId: String? = nil) async throws -> T { |
|
|
|
|
Logger.log("Run \(request.httpMethod ?? "") \(request.url?.absoluteString ?? "")") |
|
|
|
|
let task: (Data, URLResponse) = try await URLSession.shared.data(for: request) |
|
|
|
|
Logger.log("response = \(String(describing: String(data: task.0, encoding: .utf8)))") |
|
|
|
|
Logger.log("response = \(String(data: task.0, encoding: .utf8) ?? "")") |
|
|
|
|
|
|
|
|
|
if let response = task.1 as? HTTPURLResponse { |
|
|
|
|
let statusCode = response.statusCode |
|
|
|
|
@ -104,12 +104,11 @@ public class Services { |
|
|
|
|
} |
|
|
|
|
default: |
|
|
|
|
Logger.log("Failed Run \(request.httpMethod ?? "") \(request.url?.absoluteString ?? "")") |
|
|
|
|
var errorString = String(describing: String(data: task.0, encoding: .utf8)) |
|
|
|
|
if let nfe: NonFieldError = try? JSONDecoder().decode(NonFieldError.self, from: task.0) { |
|
|
|
|
if let reason = nfe.non_field_errors.first { |
|
|
|
|
errorString = reason |
|
|
|
|
} |
|
|
|
|
var errorString: String = String(data: task.0, encoding: .utf8) ?? "" |
|
|
|
|
if let message = self.errorMessageFromResponse(data: task.0) { |
|
|
|
|
errorString = message |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if let apiCallId, let type = (T.self as? any Storable.Type) { |
|
|
|
|
try Store.main.rescheduleApiCall(id: apiCallId, type: type) |
|
|
|
|
@ -287,6 +286,18 @@ public class Services { |
|
|
|
|
try self.keychainStore.deleteToken() |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
fileprivate func errorMessageFromResponse(data: Data) -> String? { |
|
|
|
|
do { |
|
|
|
|
if let jsonObject = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any], let stringsArray = jsonObject.values.first as? [String] { |
|
|
|
|
return stringsArray.first |
|
|
|
|
} |
|
|
|
|
} catch { |
|
|
|
|
print("Failed to parse JSON: \(error.localizedDescription)") |
|
|
|
|
} |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
struct AuthResponse: Codable { |
|
|
|
|
@ -303,9 +314,6 @@ struct Token: Codable { |
|
|
|
|
struct Email: Codable { |
|
|
|
|
var email: String |
|
|
|
|
} |
|
|
|
|
struct NonFieldError: Codable { |
|
|
|
|
var non_field_errors: [String] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public protocol UserBase: Codable { |
|
|
|
|
var id: String { get } |
|
|
|
|
|