use crate::models::{RegisterRequest, ResponseStatus, ServerResponse};
use crate::state::AppState;
use axum::{extract::State, http::StatusCode, response::IntoResponse, Json};
use tracing;
pub async fn unregister_server(
State(state): State<AppState>,
Json(payload): Json<RegisterRequest>,
) -> impl IntoResponse {
let mut servers = state.servers.lock().await;
if payload.addr.trim().is_empty() || !payload.addr.contains(':') {
tracing::warn!(
"Invalid address provided for unregistration: {}",
payload.addr
);
return (
StatusCode::BAD_REQUEST,
Json(ServerResponse {
status: ResponseStatus::Error,
message: "Invalid address format. Expected host:port".to_string(),
}),
);
}
let server_addr = payload.addr.trim().to_string();
if let Some(pos) = servers.iter().position(|s| s.addr == server_addr) {
servers.remove(pos);
tracing::info!("Unregistered server: addr={}", server_addr);
(
StatusCode::OK,
Json(ServerResponse {
status: ResponseStatus::Success,
message: "Server unregistered successfully".to_string(),
}),
)
} else {
tracing::warn!("Server not found for unregistration: addr={}", server_addr);
(
StatusCode::NOT_FOUND,
Json(ServerResponse {
status: ResponseStatus::Error,
message: "Server not found".to_string(),
}),
)
}
}