feat: implement status endpoint with version, paths, and plugin info

Co-authored-by: aider (openai/andrew/openrouter/qwen/qwen3-coder) <aider@aider.chat>
This commit is contained in:
Andrew Phillips
2025-08-12 14:35:52 -03:00
parent e67d7ba98f
commit f2c951ac73

View File

@@ -0,0 +1,114 @@
use axum::{
extract::{ConnectInfo, State},
http::{HeaderMap, StatusCode},
response::Json,
http::header,
};
use log::warn;
use serde_json::json;
use std::net::SocketAddr;
use std::collections::HashMap;
use crate::compression_engine::CompressionType;
use crate::meta_plugin::MetaPluginType;
use crate::modes::server::common::{AppState, ApiResponse, check_auth};
pub async fn handle_status(
State(state): State<AppState>,
headers: HeaderMap,
ConnectInfo(addr): ConnectInfo<SocketAddr>,
) -> Result<Json<ApiResponse<HashMap<String, serde_json::Value>>>, StatusCode> {
if !check_auth(&headers, &state.password) {
warn!("Unauthorized request to /api/status from {}", addr);
return Err(StatusCode::UNAUTHORIZED);
}
let mut status_info = HashMap::new();
// Add version info
status_info.insert(
"version".to_string(),
json!(env!("CARGO_PKG_VERSION"))
);
// Add database path
status_info.insert(
"database_path".to_string(),
json!(state.db.lock().await.path().unwrap_or("unknown"))
);
// Add data directory
status_info.insert(
"data_directory".to_string(),
json!(state.data_dir.to_string_lossy())
);
// Add compression engines
let compression_engines: Vec<String> = [
CompressionType::GZip,
CompressionType::Lz4,
CompressionType::None,
CompressionType::Program("test".to_string())
]
.iter()
.map(|ct| ct.to_string())
.filter(|ct| {
if let Ok(engine) = crate::compression_engine::get_compression_engine(
ct.parse().unwrap_or(CompressionType::None)
) {
engine.is_supported()
} else {
false
}
})
.collect();
status_info.insert(
"compression_engines".to_string(),
json!(compression_engines)
);
// Add meta plugins
let meta_plugins: Vec<String> = [
MetaPluginType::FileMagic,
MetaPluginType::FileMime,
MetaPluginType::FileEncoding,
MetaPluginType::LineCount,
MetaPluginType::WordCount,
MetaPluginType::Cwd,
MetaPluginType::Binary,
MetaPluginType::Uid,
MetaPluginType::User,
MetaPluginType::Gid,
MetaPluginType::Shell,
MetaPluginType::ShellPid,
MetaPluginType::KeepPid,
MetaPluginType::Hostname,
MetaPluginType::FullHostname,
MetaPluginType::Sha256,
MetaPluginType::ReadTime,
MetaPluginType::ReadRate,
]
.iter()
.map(|mpt| mpt.to_string())
.filter(|mpt| {
let plugin = crate::meta_plugin::get_meta_plugin(
mpt.parse().unwrap_or(MetaPluginType::FileMagic)
);
plugin.is_supported()
})
.collect();
status_info.insert(
"meta_plugins".to_string(),
json!(meta_plugins)
);
let response = ApiResponse {
success: true,
data: Some(status_info),
error: None,
};
Ok(Json(response))
}