use http::{Response, StatusCode};
use serde_json::json;
use crate::app_state::AppState;
use crate::hateoas::self_link;
use crate::router::{Body, json_response, parse_json_body, problem_response};
pub async fn get_settings(
state: AppState,
_parts: http::request::Parts,
_params: Vec<(String, String)>,
) -> Response<Body> {
let settings = state.settings();
let body = json!({
"data": serde_json::to_value(&settings).unwrap_or_default(),
"_links": json!({
"self": self_link("/api/v1/settings"),
}),
});
json_response(StatusCode::OK, &body)
}
pub async fn update_settings(
state: AppState,
parts: http::request::Parts,
_params: Vec<(String, String)>,
) -> Response<Body> {
let new_settings: csaf_models::settings::Settings = match parse_json_body(&parts) {
Ok(s) => s,
Err(e) => {
return problem_response(
StatusCode::BAD_REQUEST,
"https://ndaal.eu/csaf/errors/invalid-json",
"Invalid JSON",
&e,
);
},
};
if let Err(e) = state.update_settings(new_settings.clone()) {
tracing::error!("Failed to update settings: {e}");
return problem_response(
StatusCode::INTERNAL_SERVER_ERROR,
"https://ndaal.eu/csaf/errors/storage",
"Storage Error",
"Failed to persist settings",
);
}
let body = json!({
"data": serde_json::to_value(&new_settings).unwrap_or_default(),
"message": "Settings updated successfully",
"_links": json!({
"self": self_link("/api/v1/settings"),
}),
});
json_response(StatusCode::OK, &body)
}