Reduce ping logging and detect API version

This commit is contained in:
Micha
2025-11-16 14:12:11 +01:00
parent 27b8779952
commit d759a51ace
3 changed files with 37 additions and 44 deletions

View File

@@ -6,3 +6,4 @@
- Migrated the updated API layer and unified `ServerInfo` model from the previous branch. - Migrated the updated API layer and unified `ServerInfo` model from the previous branch.
- Added verbose logging in `MainView` to trace server loading, selection, and fetch/ping activity when the list appears empty. - Added verbose logging in `MainView` to trace server loading, selection, and fetch/ping activity when the list appears empty.
- Switched `MainView` and `ServerFormView` to the version-aware API client (`APIFactory`/`APIv2_12`) for server summaries and introduced a shared `PingService`. - Switched `MainView` and `ServerFormView` to the version-aware API client (`APIFactory`/`APIv2_12`) for server summaries and introduced a shared `PingService`.
- Detection now probes `meta.api_version` so future API versions are selected automatically, and the ping loop logs only failures to keep output quiet.

View File

@@ -77,8 +77,37 @@ class APIFactory {
return createAPI(baseURL: baseURL, version: version) return createAPI(baseURL: baseURL, version: version)
} }
static func detectAndCreateAPI(baseURL: URL) async throws -> AnyServerAPI { static func detectAndCreateAPI(baseURL: URL, apiKey: String? = nil) async throws -> AnyServerAPI {
// For now we only support API v2.12, so return that implementation directly. if let apiKey, !apiKey.isEmpty {
do {
let versionURL = baseURL.appendingPathComponent("api/v2/server")
var request = URLRequest(url: versionURL)
request.httpMethod = "GET"
request.setValue(apiKey, forHTTPHeaderField: "X-API-KEY")
request.timeoutInterval = 15
let (data, response) = try await URLSession.shared.data(for: request)
if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
let decoder = JSONDecoder()
decoder.keyDecodingStrategy = .convertFromSnakeCase
let probe = try decoder.decode(ServerMetaProbe.self, from: data)
if let api = createAPI(baseURL: baseURL, versionString: probe.meta.apiVersion) {
return api
}
}
} catch {
// Fall back to default version below
}
}
return AnyServerAPIWrapper(APIv2_12(baseURL: baseURL)) return AnyServerAPIWrapper(APIv2_12(baseURL: baseURL))
} }
} }
private struct ServerMetaProbe: Decodable {
struct Meta: Decodable {
let apiVersion: String
}
let meta: Meta
}

View File

@@ -119,7 +119,6 @@ struct MainView: View {
} }
pingAllServers() pingAllServers()
pingTimer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: true) { _ in pingTimer = Timer.scheduledTimer(withTimeInterval: 10.0, repeats: true) { _ in
print("📡 [MainView] Ping timer firing")
pingAllServers() pingAllServers()
} }
} }
@@ -147,7 +146,7 @@ struct MainView: View {
Task { Task {
defer { isFetchingInfo = false } defer { isFetchingInfo = false }
do { do {
let api = try await APIFactory.detectAndCreateAPI(baseURL: baseURL) let api = try await APIFactory.detectAndCreateAPI(baseURL: baseURL, apiKey: apiKey)
let info = try await api.fetchServerSummary(apiKey: apiKey) let info = try await api.fetchServerSummary(apiKey: apiKey)
await MainActor.run { await MainActor.run {
if let index = servers.firstIndex(where: { $0.id == id }) { if let index = servers.firstIndex(where: { $0.id == id }) {
@@ -178,44 +177,6 @@ struct MainView: View {
let response: String let response: String
} }
// func pingServer(_ server: Server) async -> Bool {
// let hostname = server.hostname
// guard let url = URL(string: "https://\(hostname)/api/v2/ping") else {
// return false
// }
//
// var request = URLRequest(url: url)
// request.httpMethod = "GET"
// request.timeoutInterval = 5
// request.setValue("application/json", forHTTPHeaderField: "Content-Type")
//
// let apiKey = KeychainHelper.loadApiKey(for: hostname)?.trimmingCharacters(in: .whitespacesAndNewlines) ?? ""
// request.setValue(apiKey, forHTTPHeaderField: "X-API-KEY")
//
// do {
// let (data, response) = try await URLSession.shared.data(for: request)
// if let httpResponse = response as? HTTPURLResponse, httpResponse.statusCode == 200 {
// do {
// let decoded = try JSONDecoder().decode(PingResponse.self, from: data)
// if decoded.response == "pong" {
// return true
// } else {
// print(" Unexpected response: \(decoded.response)")
// return false
// }
// } catch {
// print(" Failed to decode JSON: \(error)")
// return false
// }
// } else {
// return false
// }
// } catch {
// print("[Ping] \(server.hostname): \(error.localizedDescription)")
// return false
// }
// }
func pingAllServers() { func pingAllServers() {
for (index, server) in servers.enumerated() { for (index, server) in servers.enumerated() {
Task { Task {
@@ -224,7 +185,9 @@ struct MainView: View {
await MainActor.run { await MainActor.run {
servers[index].pingable = pingable servers[index].pingable = pingable
} }
print("📶 [MainView] Ping \(server.hostname): \(pingable ? "online" : "offline")") if !pingable {
print("📶 [MainView] Ping \(server.hostname): offline")
}
} }
} }
} }