redvault-ai/llama_forge_rs/src/api/backend_settings.rs
2024-07-21 02:42:48 +02:00

71 lines
2 KiB
Rust

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<String, ServerFnError> {
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<BackendSettings, ServerFnError> {
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(())
}