use crate::context::AppContext;
use crate::protocol::{RawRequest, Response};
use std::path::Path;
pub fn handle_undo(req: &RawRequest, ctx: &AppContext) -> Response {
let file = match req.params.get("file").and_then(|v| v.as_str()) {
Some(f) => f,
None => {
return Response::error(
&req.id,
"invalid_request",
"undo: missing required param 'file'",
);
}
};
let resolved = match ctx.validate_path(&req.id, Path::new(file)) {
Ok(path) => path,
Err(resp) => return resp,
};
let mut backup = ctx.backup().borrow_mut();
match backup.restore_latest(req.session(), &resolved) {
Ok((entry, warning)) => {
let mut result = serde_json::json!({
"path": file,
"backup_id": entry.backup_id,
});
if let Some(w) = warning {
result["warning"] = serde_json::Value::String(w);
}
Response::success(&req.id, result)
}
Err(e) => Response::error(&req.id, e.code(), e.to_string()),
}
}