diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/delete/dismiss_finished_session_jobs_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/delete/dismiss_finished_session_jobs_handler.rs index 5c3a6dffa8..a6af6b0485 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/delete/dismiss_finished_session_jobs_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/inference_job/delete/dismiss_finished_session_jobs_handler.rs @@ -8,7 +8,7 @@ use utoipa::ToSchema; use mysql_queries::queries::generic_inference::web::dismiss_finished_jobs_for_user::dismiss_finished_jobs_for_user; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session::require_user_session; +use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; use crate::state::server_state::ServerState; #[derive(Serialize, ToSchema)] @@ -33,10 +33,6 @@ pub async fn dismiss_finished_session_jobs_handler( http_request: HttpRequest, server_state: web::Data>) -> Result, CommonWebError> { - let user_session = require_user_session(&http_request, &server_state) - .await?; - - // TODO(bt,2024-06-16): Reuse connection let mut mysql_connection = server_state.mysql_pool.acquire() .await .map_err(|e| { @@ -44,6 +40,10 @@ pub async fn dismiss_finished_session_jobs_handler( CommonWebError::ServerError })?; + let user_session = require_user_session_using_connection( + &http_request, &server_state.session_checker, &mut mysql_connection) + .await?; + dismiss_finished_jobs_for_user(&mut mysql_connection, &user_session.user_token) .await .map_err(|err| { diff --git a/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/mod.rs b/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/mod.rs index 264c738552..04a34f76e2 100644 --- a/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/mod.rs +++ b/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/mod.rs @@ -1,3 +1,4 @@ pub mod require_moderator; pub mod require_user_session; pub mod require_user_session_extended_using_connection; +pub mod require_user_session_using_connection; diff --git a/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session.rs b/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session.rs index c57f96e7b3..303d3d94ab 100644 --- a/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session.rs +++ b/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session.rs @@ -25,6 +25,7 @@ impl Display for RequireUserSessionError { impl Error for RequireUserSessionError {} +#[deprecated(note = "Use require_user_session_using_connection instead, which reuses an existing connection")] pub async fn require_user_session( http_request: &HttpRequest, server_state: &ServerState, diff --git a/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session_using_connection.rs b/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session_using_connection.rs new file mode 100644 index 0000000000..ab61358654 --- /dev/null +++ b/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session_using_connection.rs @@ -0,0 +1,39 @@ +use actix_web::HttpRequest; +use log::warn; +use sqlx::pool::PoolConnection; +use sqlx::MySql; + +use mysql_queries::queries::users::user_sessions::get_user_session_by_token::SessionUserRecord; + +use crate::http_server::session::session_checker::SessionChecker; +use crate::http_server::web_utils::user_session::require_user_session::RequireUserSessionError; + +pub async fn require_user_session_using_connection( + http_request: &HttpRequest, + session_checker: &SessionChecker, + mysql_connection: &mut PoolConnection, +) -> Result { + + let maybe_user_session = session_checker + .maybe_get_user_session_from_connection(http_request, mysql_connection) + .await + .map_err(|e| { + warn!("Session checker error: {:?}", e); + RequireUserSessionError::ServerError + })?; + + let user_session = match maybe_user_session { + Some(session) => session, + None => { + warn!("not logged in"); + return Err(RequireUserSessionError::NotAuthorized); + } + }; + + if user_session.is_banned { + warn!("user is banned: {:?}", user_session.user_token.as_str()); + return Err(RequireUserSessionError::NotAuthorized); + } + + Ok(user_session) +}