Files
ratebubble/ios/Ratebubble/Shared/APIClient.swift

66 lines
2.0 KiB
Swift
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import Foundation
enum APIClientError: LocalizedError {
case invalidBaseURL
case invalidResponse
case server(String)
var errorDescription: String? {
switch self {
case .invalidBaseURL:
return "API_BASE_URL geçersiz."
case .invalidResponse:
return "Sunucudan geçerli yanıt alınamadı."
case .server(let message):
return message
}
}
}
final class APIClient {
static let shared = APIClient()
private init() {}
private var baseURL: URL? {
guard let raw = Bundle.main.object(forInfoDictionaryKey: "API_BASE_URL") as? String else {
return nil
}
return URL(string: raw)
}
private var mobileAPIKey: String {
Bundle.main.object(forInfoDictionaryKey: "MOBILE_API_KEY") as? String
?? "mobile-dev-key-change-me"
}
func getInfo(url: String) async throws -> GetInfoResponse {
guard let baseURL else { throw APIClientError.invalidBaseURL }
var request = URLRequest(url: baseURL.appending(path: "/api/getinfo"))
request.httpMethod = "POST"
request.timeoutInterval = 20
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.setValue(mobileAPIKey, forHTTPHeaderField: "X-API-Key")
request.httpBody = try JSONEncoder().encode(GetInfoRequest(url: url))
let (data, response) = try await URLSession.shared.data(for: request)
guard let http = response as? HTTPURLResponse else {
throw APIClientError.invalidResponse
}
let decoder = JSONDecoder()
let envelope = try decoder.decode(APIEnvelope<GetInfoResponse>.self, from: data)
if (200..<300).contains(http.statusCode), envelope.success, let payload = envelope.data {
return payload
}
if let errorMessage = envelope.error?.message {
throw APIClientError.server(errorMessage)
}
throw APIClientError.server("İstek başarısız oldu (\(http.statusCode)).")
}
}