refactor: eliminate SettingsResponse struct, serialize UserSettings directly

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
master
oabrivard 3 months ago
parent e056ef9d3e
commit 2036c12b24

@ -11,7 +11,7 @@ use crate::app_state::AppState;
use crate::db; use crate::db;
use crate::errors::AppError; use crate::errors::AppError;
use crate::middleware::auth::AuthUser; use crate::middleware::auth::AuthUser;
use crate::models::settings::{SettingsResponse, UpdateSettingsRequest}; use crate::models::settings::UpdateSettingsRequest;
/// `GET /api/v1/settings` /// `GET /api/v1/settings`
/// ///
@ -22,7 +22,7 @@ pub async fn get_settings(
State(state): State<AppState>, State(state): State<AppState>,
) -> Result<impl IntoResponse, AppError> { ) -> Result<impl IntoResponse, AppError> {
let settings = db::settings::get_or_create_default(&state.pool, auth_user.id).await?; let settings = db::settings::get_or_create_default(&state.pool, auth_user.id).await?;
Ok(Json(SettingsResponse::from(settings))) Ok(Json(settings))
} }
/// `PUT /api/v1/settings` /// `PUT /api/v1/settings`
@ -38,5 +38,5 @@ pub async fn update_settings(
let settings = db::settings::upsert(&state.pool, auth_user.id, &body).await?; let settings = db::settings::upsert(&state.pool, auth_user.id, &body).await?;
tracing::info!(user_id = %auth_user.id, "Settings updated"); tracing::info!(user_id = %auth_user.id, "Settings updated");
Ok(Json(SettingsResponse::from(settings))) Ok(Json(settings))
} }

@ -7,6 +7,7 @@ use uuid::Uuid;
/// User settings record from the database. /// User settings record from the database.
#[derive(Debug, Clone, Serialize)] #[derive(Debug, Clone, Serialize)]
pub struct UserSettings { pub struct UserSettings {
#[serde(skip_serializing)]
pub user_id: Uuid, pub user_id: Uuid,
pub theme: String, pub theme: String,
pub max_age_days: i32, pub max_age_days: i32,
@ -23,51 +24,10 @@ pub struct UserSettings {
pub ai_model_websearch: String, pub ai_model_websearch: String,
pub rate_limit_max_requests: Option<i32>, pub rate_limit_max_requests: Option<i32>,
pub rate_limit_time_window_seconds: Option<i32>, pub rate_limit_time_window_seconds: Option<i32>,
#[serde(skip_serializing)]
pub updated_at: DateTime<Utc>, pub updated_at: DateTime<Utc>,
} }
/// Response shape for `GET /api/v1/settings`.
#[derive(Debug, Serialize)]
pub struct SettingsResponse {
pub theme: String,
pub max_age_days: i32,
pub categories: Vec<String>,
pub max_items_per_category: i32,
pub max_articles_per_source: i32,
pub use_llm_for_source_links: bool,
pub use_brave_search: bool,
pub article_history_days: i32,
pub batch_size: i32,
pub search_agent_behavior: String,
pub ai_provider: String,
pub ai_model: String,
pub ai_model_websearch: String,
pub rate_limit_max_requests: Option<i32>,
pub rate_limit_time_window_seconds: Option<i32>,
}
impl From<UserSettings> for SettingsResponse {
fn from(s: UserSettings) -> Self {
Self {
theme: s.theme,
max_age_days: s.max_age_days,
categories: s.categories,
max_items_per_category: s.max_items_per_category,
max_articles_per_source: s.max_articles_per_source,
use_llm_for_source_links: s.use_llm_for_source_links,
use_brave_search: s.use_brave_search,
article_history_days: s.article_history_days,
batch_size: s.batch_size,
search_agent_behavior: s.search_agent_behavior,
ai_provider: s.ai_provider,
ai_model: s.ai_model,
ai_model_websearch: s.ai_model_websearch,
rate_limit_max_requests: s.rate_limit_max_requests,
rate_limit_time_window_seconds: s.rate_limit_time_window_seconds,
}
}
}
/// Request body for `PUT /api/v1/settings`. /// Request body for `PUT /api/v1/settings`.
#[derive(Debug, Deserialize)] #[derive(Debug, Deserialize)]
pub struct UpdateSettingsRequest { pub struct UpdateSettingsRequest {

Loading…
Cancel
Save