From 804461ac01e594e5d20686fa0ab6fc5c832a6de5 Mon Sep 17 00:00:00 2001 From: Per Stark Date: Wed, 9 Apr 2025 11:32:23 +0200 Subject: [PATCH] feat: improved configuration configuration now works with both env variables and config file --- common/src/utils/config.rs | 17 +++++++---------- .../src/middlewares/response_middleware.rs | 6 ++++-- html-router/src/routes/index/handlers.rs | 1 - main/src/main.rs | 4 +++- main/src/server.rs | 4 +++- todo.md | 8 ++++---- 6 files changed, 21 insertions(+), 19 deletions(-) diff --git a/common/src/utils/config.rs b/common/src/utils/config.rs index 9559196..74086da 100644 --- a/common/src/utils/config.rs +++ b/common/src/utils/config.rs @@ -1,7 +1,9 @@ -use config::{Config, ConfigError, File}; +use config::{Config, ConfigError, Environment, File}; +use serde::Deserialize; -#[derive(Clone, Debug)] +#[derive(Clone, Deserialize, Debug)] pub struct AppConfig { + pub openai_api_key: String, pub surrealdb_address: String, pub surrealdb_username: String, pub surrealdb_password: String, @@ -11,14 +13,9 @@ pub struct AppConfig { pub fn get_config() -> Result { let config = Config::builder() - .add_source(File::with_name("config")) + .add_source(File::with_name("config").required(false)) + .add_source(Environment::default()) .build()?; - Ok(AppConfig { - surrealdb_address: config.get_string("SURREALDB_ADDRESS")?, - surrealdb_username: config.get_string("SURREALDB_USERNAME")?, - surrealdb_password: config.get_string("SURREALDB_PASSWORD")?, - surrealdb_namespace: config.get_string("SURREALDB_NAMESPACE")?, - surrealdb_database: config.get_string("SURREALDB_DATABASE")?, - }) + Ok(config.try_deserialize()?) } diff --git a/html-router/src/middlewares/response_middleware.rs b/html-router/src/middlewares/response_middleware.rs index fa17193..c9c1733 100644 --- a/html-router/src/middlewares/response_middleware.rs +++ b/html-router/src/middlewares/response_middleware.rs @@ -145,8 +145,10 @@ where .unwrap_or_else(|| "An error occurred.".to_string()); let trigger_payload = json!({"toast": {"title": title, "description": description, "type": "error"}}); - let trigger_value = serde_json::to_string(&trigger_payload).unwrap_or_else(|e| {error!("Failed to serialize HX-Trigger payload: {}", e); -r#"{"toast":{"title":"Error","description":"An unexpected error occurred.", "type":"error"}}"#.to_string()}); + let trigger_value = serde_json::to_string(&trigger_payload).unwrap_or_else(|e| { + error!("Failed to serialize HX-Trigger payload: {}", e); + r#"{"toast":{"title":"Error","description":"An unexpected error occurred.", "type":"error"}}"#.to_string() + }); (StatusCode::NO_CONTENT, [(HX_TRIGGER, trigger_value)], "").into_response() } else { // Non-HTMX request: Render the full errors/error.html page diff --git a/html-router/src/routes/index/handlers.rs b/html-router/src/routes/index/handlers.rs index 261715f..6a96a88 100644 --- a/html-router/src/routes/index/handlers.rs +++ b/html-router/src/routes/index/handlers.rs @@ -151,7 +151,6 @@ pub async fn show_active_jobs( State(state): State, RequireUser(user): RequireUser, ) -> Result { - return Ok(TemplateResponse::server_error()); let active_jobs = User::get_unfinished_ingestion_tasks(&user.id, &state.db).await?; Ok(TemplateResponse::new_partial( diff --git a/main/src/main.rs b/main/src/main.rs index a67e71a..bbbba13 100644 --- a/main/src/main.rs +++ b/main/src/main.rs @@ -37,7 +37,9 @@ async fn main() -> Result<(), Box> { db.ensure_initialized().await?; let session_store = Arc::new(db.create_session_store().await?); - let openai_client = Arc::new(async_openai::Client::new()); + let openai_client = Arc::new(async_openai::Client::with_config( + OpenAIConfig::new().with_api_key(&config.openai_api_key), + )); let html_state = HtmlState::new_with_resources(db, openai_client, session_store)?; diff --git a/main/src/server.rs b/main/src/server.rs index 60116cd..cd49eb1 100644 --- a/main/src/server.rs +++ b/main/src/server.rs @@ -35,7 +35,9 @@ async fn main() -> Result<(), Box> { db.ensure_initialized().await?; let session_store = Arc::new(db.create_session_store().await?); - let openai_client = Arc::new(async_openai::Client::new()); + let openai_client = Arc::new(async_openai::Client::with_config( + OpenAIConfig::new().with_api_key(&config.openai_api_key), + )); let html_state = HtmlState::new_with_resources(db, openai_client, session_store)?; diff --git a/todo.md b/todo.md index b31384d..b19c671 100644 --- a/todo.md +++ b/todo.md @@ -1,10 +1,8 @@ \[\] archive ingressed webpage -\[\] configs primarily get envs +\[x\] configs primarily get envs \[\] filtering on categories -\[\] integrate assets folder in release build -\[\] make sure error messages render correctly \[\] markdown rendering in client -\[\] openai api key in config +\[x\] openai api key in config \[\] testing core functions \[\] three js graph explorer \[\] three js vector explorer @@ -17,11 +15,13 @@ \[x\] gdpr \[x\] html ingression \[x\] hx-redirect +\[x\] integrate assets folder in release build \[x\] integrate templates in release build \[x\] ios shortcut generation \[x\] job queue \[x\] link to ingressed urls or archives \[x\] macro for pagedata? +\[x\] make sure error messages render correctly \[x\] on updates of knowledgeentity create new embeddings \[x\] option to set models, query and processing \[x\] redirects