diff --git a/crates/programs/aichatbot-sidecar/src/web_server/handlers/level/get_current_level.rs b/crates/programs/aichatbot-sidecar/src/web_server/handlers/level/get_current_level.rs new file mode 100644 index 0000000000..5e0c5a0655 --- /dev/null +++ b/crates/programs/aichatbot-sidecar/src/web_server/handlers/level/get_current_level.rs @@ -0,0 +1,60 @@ +use actix_http::StatusCode; +use actix_web::{HttpRequest, HttpResponse, ResponseError, web}; +use crate::shared_state::app_control_state::AppControlState; +use http_server_common::response::serialize_as_json_error::serialize_as_json_error; +use log::error; +use std::sync::Arc; + +#[derive(Serialize)] +pub struct GetCurrentLevelResponse { + pub success: bool, + pub current_level: String, +} + +#[derive(Debug, Serialize)] +pub enum GetCurrentLevelError { + ServerError, +} + +impl ResponseError for GetCurrentLevelError { + fn status_code(&self) -> StatusCode { + match *self { + GetCurrentLevelError::ServerError => StatusCode::INTERNAL_SERVER_ERROR, + } + } + + fn error_response(&self) -> HttpResponse { + serialize_as_json_error(self) + } +} + +// NB: Not using derive_more::Display since Clion doesn't understand it. +impl std::fmt::Display for GetCurrentLevelError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "{:?}", self) + } +} + +pub async fn get_current_level_handler( + _http_request: HttpRequest, + control_state: web::Data> +) -> Result { + + let current_level = control_state.get_level() + .map_err(|err| { + error!("Error: {:?}", err); + GetCurrentLevelError::ServerError + })?; + + let response = GetCurrentLevelResponse { + success: true, + current_level: current_level.tts_model_token_str().to_string(), + }; + + let body = serde_json::to_string(&response) + .map_err(|e| GetCurrentLevelError::ServerError)?; + + Ok(HttpResponse::Ok() + .content_type("application/json") + .body(body)) +} diff --git a/crates/programs/aichatbot-sidecar/src/web_server/handlers/level/mod.rs b/crates/programs/aichatbot-sidecar/src/web_server/handlers/level/mod.rs new file mode 100644 index 0000000000..9381d19b5c --- /dev/null +++ b/crates/programs/aichatbot-sidecar/src/web_server/handlers/level/mod.rs @@ -0,0 +1 @@ +pub mod get_current_level; \ No newline at end of file diff --git a/crates/programs/aichatbot-sidecar/src/web_server/handlers/mod.rs b/crates/programs/aichatbot-sidecar/src/web_server/handlers/mod.rs index 4e5764e0d7..d25e05f091 100644 --- a/crates/programs/aichatbot-sidecar/src/web_server/handlers/mod.rs +++ b/crates/programs/aichatbot-sidecar/src/web_server/handlers/mod.rs @@ -1,2 +1,3 @@ +pub mod level; pub mod misc; pub mod news_stories; diff --git a/crates/programs/aichatbot-sidecar/src/web_server/launch_web_server.rs b/crates/programs/aichatbot-sidecar/src/web_server/launch_web_server.rs index 58f2236f97..a7747ef3f1 100644 --- a/crates/programs/aichatbot-sidecar/src/web_server/launch_web_server.rs +++ b/crates/programs/aichatbot-sidecar/src/web_server/launch_web_server.rs @@ -12,6 +12,7 @@ use errors::AnyhowResult; use http_server_common::endpoints::root_index::get_root_index; use std::sync::Arc; use sqlx::{Pool, Sqlite}; +use crate::web_server::handlers::level::get_current_level::get_current_level_handler; use crate::web_server::handlers::news_stories::get_next_news_story_audio_file_handler::get_next_news_story_audio_file_handler; pub struct LaunchWebServerArgs { @@ -45,6 +46,7 @@ pub async fn launch_web_server(args: LaunchWebServerArgs) -> AnyhowResult<()> { .add_get("/openai", openai_inference_handler) .add_get("/news_story/next_story", get_next_news_story_handler) .add_get("/news_story/audio", get_next_news_story_audio_file_handler) + .add_get("/current_level", get_current_level_handler) .into_app(); /*app.service(