use leptos::*; use leptos_router::*; use serde::{Deserialize, Serialize}; use crate::app::components::{svgs::*, FormControl}; #[derive(PartialEq, Debug, Clone, Serialize, Deserialize, sqlx::FromRow)] pub struct BackendSettings { version: i64, // auto-increments, the current settings are the highest version model_dir: String, default_model: String, created_at: chrono::NaiveDateTime, } /// Returns the initial default directory for model files. ($PWD/models) #[server] async fn default_model_dir() -> Result { let pwd = std::env::current_dir()?.to_string_lossy().to_string(); let default_dir = format!("{}/models", pwd); Ok(default_dir) } /// Fetches the latest backend settings from the database. #[server] async fn load_backend_settings() -> Result { use crate::server::pool; tracing::debug!(msg = "Load settings"); let pool = pool()?; let settings = sqlx::query_as!( BackendSettings, "SELECT version, model_dir, default_model, created_at FROM settings ORDER BY version DESC \ LIMIT 1" ) .fetch_optional(&pool) .await?; match settings { Some(settings) => Ok(settings), None => Err(ServerFnError::ServerError("Settings not found".to_string())), } } /// Updates the backend settings with new model directory and default model. #[server(UpdateSettings)] async fn update_settings(model_dir: String, default_model: String) -> Result<(), ServerFnError> { use crate::server::pool; tracing::debug!(msg = "Updating settings", ?model_dir, ?default_model); let pool = pool()?; let result = { sqlx_macros::expand_query!( source = "INSERT INTO settings (model_dir, default_model) VALUES (?, ?)", args = [model_dir, default_model,] ) } .execute(&pool) .await?; if result.rows_affected() == 0 { return Err(ServerFnError::ServerError( "Failed to create new settings".to_string(), )); } Ok(()) }