use axum::Json;
use axum::extract::State;
use did_hosting_common::did_ops::{DidRecord, did_key};
use did_hosting_common::server::identity::mnemonic_from_did;
use did_hosting_common::server::pending_purge::parse_grace_string;
use serde::Serialize;
use crate::server::AppState;
#[derive(Serialize)]
pub struct ServerInfoResponse {
pub server_did: Option<String>,
pub disable_purge_grace_seconds: Option<u64>,
pub agent_names: bool,
pub server_names: Vec<String>,
}
async fn server_agent_names(state: &AppState) -> Vec<String> {
if !state.config.features.agent_names {
return Vec::new();
}
let Some(did) = state.config.server_did.as_deref() else {
return Vec::new();
};
let Some(mnemonic) = mnemonic_from_did(did) else {
return Vec::new();
};
let Ok(Some(record)) = state.dids_ks.get::<DidRecord>(did_key(&mnemonic)).await else {
return Vec::new();
};
if record.did_id.as_deref() != Some(did) || record.disabled || record.deleted_at.is_some() {
return Vec::new();
}
record
.agent_names
.iter()
.filter(|e| e.enabled)
.map(|e| e.name.clone())
.collect()
}
pub async fn server_info(State(state): State<AppState>) -> Json<ServerInfoResponse> {
let disable_purge_grace_seconds =
parse_grace_string(&state.config.hosting.disable_purge_grace).ok();
let server_names = server_agent_names(&state).await;
Json(ServerInfoResponse {
server_did: state.config.server_did.clone(),
disable_purge_grace_seconds,
agent_names: state.config.features.agent_names,
server_names,
})
}