use std::sync::Arc;
use axum::{
Json,
extract::{Path as AxumPath, State},
http::StatusCode,
response::IntoResponse,
};
use serde::Deserialize;
use tracing::warn;
use super::{parse_id, record_to_summary};
use crate::daemon::state::DaemonState;
use crate::session_manager::ManagedError;
#[derive(Debug, Deserialize)]
pub struct RenameRequest {
pub name: String,
}
pub async fn rename_managed_session(
State(state): State<Arc<DaemonState>>,
AxumPath(id_str): AxumPath<String>,
Json(body): Json<RenameRequest>,
) -> impl IntoResponse {
let id = match parse_id(&id_str) {
Ok(id) => id,
Err((code, msg)) => return (code, msg).into_response(),
};
let mgr = state.session_manager().await;
match mgr.rename(&id, &body.name).await {
Ok(record) => Json(record_to_summary(&record)).into_response(),
Err(ManagedError::SessionNotFound(_)) => {
(StatusCode::NOT_FOUND, format!("session {id_str} not found")).into_response()
}
Err(e @ ManagedError::NameCollision(_)) => {
(StatusCode::CONFLICT, e.to_string()).into_response()
}
Err(ManagedError::InvalidState(_, reason)) => {
(StatusCode::BAD_REQUEST, reason).into_response()
}
Err(e) => {
warn!(id = %id_str, error = %e, "rename failed with an unmapped error");
(StatusCode::INTERNAL_SERVER_ERROR, e.to_string()).into_response()
}
}
}