From b961f82f01a63c7c5357cc2b51fa3fbe18280466 Mon Sep 17 00:00:00 2001 From: oabrivard Date: Sun, 22 Mar 2026 22:29:29 +0100 Subject: [PATCH] refactor: add UserRateLimitEntry constructor and settings_changed method Co-Authored-By: Claude Opus 4.6 (1M context) --- backend/src/app_state.rs | 19 +++++++++++++++++++ backend/src/services/synthesis.rs | 25 ++++++------------------- 2 files changed, 25 insertions(+), 19 deletions(-) diff --git a/backend/src/app_state.rs b/backend/src/app_state.rs index 4e050f0..3066917 100644 --- a/backend/src/app_state.rs +++ b/backend/src/app_state.rs @@ -37,6 +37,25 @@ pub struct UserRateLimitEntry { pub limiter: RateLimiter, } +impl UserRateLimitEntry { + /// Create a new entry, building the underlying rate limiter from the given settings. + pub fn new(max_requests: i32, window_seconds: i32) -> Self { + Self { + max_requests, + window_seconds, + limiter: RateLimiter::new( + max_requests as usize, + std::time::Duration::from_secs(window_seconds as u64), + ), + } + } + + /// Returns `true` if the cached settings differ from the given values. + pub fn settings_changed(&self, max_requests: i32, window_seconds: i32) -> bool { + self.max_requests != max_requests || self.window_seconds != window_seconds + } +} + impl AppState { /// Create a new `AppState` instance. pub fn new(config: AppConfig, pool: PgPool, http_client: reqwest::Client) -> Self { diff --git a/backend/src/services/synthesis.rs b/backend/src/services/synthesis.rs index cd9ed1f..dbb7175 100644 --- a/backend/src/services/synthesis.rs +++ b/backend/src/services/synthesis.rs @@ -397,26 +397,13 @@ fn get_user_rate_limiter( settings.rate_limit_time_window_seconds, ) { (Some(max_req), Some(window_sec)) => { - let mut entry = state.user_rate_limiters.entry(user_id).or_insert_with(|| { - UserRateLimitEntry { - max_requests: max_req, - window_seconds: window_sec, - limiter: crate::services::rate_limiter::RateLimiter::new( - max_req as usize, - Duration::from_secs(window_sec as u64), - ), - } - }); + let mut entry = state + .user_rate_limiters + .entry(user_id) + .or_insert_with(|| UserRateLimitEntry::new(max_req, window_sec)); // Replace if user's settings changed since the limiter was created - if entry.max_requests != max_req || entry.window_seconds != window_sec { - *entry = UserRateLimitEntry { - max_requests: max_req, - window_seconds: window_sec, - limiter: crate::services::rate_limiter::RateLimiter::new( - max_req as usize, - Duration::from_secs(window_sec as u64), - ), - }; + if entry.settings_changed(max_req, window_sec) { + *entry = UserRateLimitEntry::new(max_req, window_sec); } Some(entry.limiter.clone()) }