Skip to main content

backend/
user_settings.rs

1//! User settings.
2
3use serde::{Deserialize, Serialize};
4
5use super::app::{AppCtx, AppError};
6
7/// Settings for a user, these are paired with matching db columns in the user
8/// table under the naming scheme "settings_<field_name>".
9#[qubit::ts]
10#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
11pub struct UserSettings {
12    /// Whether the user has opted into LLM-powered capabilities.
13    #[serde(rename = "llmEnabled")]
14    pub llm_enabled: bool,
15}
16
17/// Obtain settings for the active user.
18pub async fn get_active_user_settings(ctx: AppCtx) -> Result<UserSettings, AppError> {
19    let Some(user) = ctx.user else {
20        return Err(AppError::Unauthorized);
21    };
22
23    let settings = sqlx::query_as!(
24        UserSettings,
25        "SELECT settings_llm_enabled AS llm_enabled FROM users WHERE id = $1",
26        user.user_id,
27    )
28    .fetch_one(&ctx.state.db)
29    .await?;
30
31    Ok(settings)
32}
33
34/// Set settings for the active user.
35pub async fn set_active_user_settings(ctx: AppCtx, settings: UserSettings) -> Result<(), AppError> {
36    let Some(user) = ctx.user else {
37        return Err(AppError::Unauthorized);
38    };
39
40    let result = sqlx::query!(
41        "UPDATE users SET settings_llm_enabled = $2 WHERE id = $1",
42        user.user_id,
43        settings.llm_enabled,
44    )
45    .execute(&ctx.state.db)
46    .await?;
47
48    if result.rows_affected() == 0 {
49        return Err(AppError::NotFound("active user".into()));
50    }
51
52    Ok(())
53}