use std::sync::Arc;
use axum::{Json, extract::State, response::IntoResponse};
use serde::Serialize;
use tracing::warn;
use crate::daemon::state::DaemonState;
use crate::session_manager::SessionRecord;
use super::{SessionSummary, record_to_summary};
#[derive(Debug, Serialize)]
pub struct FleetProjectGroup {
pub project_name: String,
pub repo_url: String,
pub sessions: Vec<SessionSummary>,
}
#[derive(Debug, Serialize)]
pub struct FleetByProjectResponse {
pub projects: Vec<FleetProjectGroup>,
}
pub async fn fleet_by_project_route(State(state): State<Arc<DaemonState>>) -> impl IntoResponse {
let mgr = state.session_manager().await;
let registry = state.project_registry().await;
let raw_sessions: Vec<SessionRecord> = mgr.list().await;
let projects = match registry.list().await {
Ok(p) => p,
Err(e) => {
warn!(
error = %e,
"fleet_by_project_route: project registry read failed; \
returning empty project list (sessions will not be grouped)"
);
vec![]
}
};
let fleet = crate::project::fleet_by_project(&raw_sessions, &projects);
let project_groups: Vec<FleetProjectGroup> = fleet
.into_iter()
.map(|pf| FleetProjectGroup {
project_name: pf.project.name.clone(),
repo_url: pf.project.repo_url.clone(),
sessions: pf.sessions.iter().map(record_to_summary).collect(),
})
.collect();
Json(FleetByProjectResponse {
projects: project_groups,
})
}