use crate::models::{ResponseStatus, ServerResponse, TestRequest};
use crate::state::AppState;
use axum::{extract::State, http::StatusCode, response::IntoResponse, Json};
use hyper::Uri;
pub async fn test_server(
State(state): State<AppState>,
Json(payload): Json<TestRequest>,
) -> impl IntoResponse {
let servers = state.servers.lock().await;
let server_addr = payload.addr.trim().to_string();
if let Some(_server) = servers.iter().find(|s| s.addr == server_addr) {
let uri = format!("http://{}/health", server_addr)
.parse::<Uri>()
.expect("Failed to parse URI");
match state.http_client.get(uri).await {
Ok(response) => {
if response.status().is_success() {
(
StatusCode::OK,
Json(ServerResponse {
status: ResponseStatus::Success,
message: format!("Service at {} is reachable", server_addr),
}),
)
} else {
(
StatusCode::OK,
Json(ServerResponse {
status: ResponseStatus::Error,
message: format!(
"Service at {} returned status {}",
server_addr,
response.status()
),
}),
)
}
}
Err(e) => (
StatusCode::OK,
Json(ServerResponse {
status: ResponseStatus::Error,
message: format!("Failed to connect to service at {}: {}", server_addr, e),
}),
),
}
} else {
(
StatusCode::NOT_FOUND,
Json(ServerResponse {
status: ResponseStatus::Error,
message: "Service not found".to_string(),
}),
)
}
}