diff --git a/crates/service/web/storyteller_web/src/http_server/common_responses/common_web_error.rs b/crates/service/web/storyteller_web/src/http_server/common_responses/common_web_error.rs index 8aaebb97ba..fb3d57b910 100644 --- a/crates/service/web/storyteller_web/src/http_server/common_responses/common_web_error.rs +++ b/crates/service/web/storyteller_web/src/http_server/common_responses/common_web_error.rs @@ -19,7 +19,7 @@ use serde::Serialize; /// ```ignore /// pub async fn my_handler(...) -> Result, CommonWebError> { /// // sqlx errors, anyhow errors, session errors — all convert via ? -/// let user = require_user_session_using_connection(&req, ...)?; +/// let user = require_user_session(&req, ...)?; /// let data = some_db_query(&pool).await?; /// /// if data.is_none() { diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/beta_keys/list_beta_keys_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/beta_keys/list_beta_keys_handler.rs index 392ceed61b..6218263ed8 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/beta_keys/list_beta_keys_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/beta_keys/list_beta_keys_handler.rs @@ -108,7 +108,7 @@ pub async fn list_beta_keys_handler( query: Query, server_state: web::Data> ) -> Result { - let user_session = require_user_session(&http_request, &server_state) + let user_session = require_user_session(&http_request, &server_state.session_checker, &server_state.mysql_pool) .await .map_err(|err| match err { RequireUserSessionError::ServerError => CommonWebError::from_error(err), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/beta_keys/redeem_beta_key_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/beta_keys/redeem_beta_key_handler.rs index 7e85458352..f23c536825 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/beta_keys/redeem_beta_key_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/beta_keys/redeem_beta_key_handler.rs @@ -52,7 +52,7 @@ pub async fn redeem_beta_key_handler( server_state: web::Data>, ) -> Result { - let user_session = require_user_session(&http_request, &server_state).await?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &server_state.mysql_pool).await?; let rate_limiter = &server_state.redis_rate_limiters.logged_out; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/delete_character_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/delete_character_handler.rs index d70a8740aa..5f83e61416 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/delete_character_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/delete_character_handler.rs @@ -10,7 +10,7 @@ use mysql_queries::queries::characters::delete_character::delete_character; use mysql_queries::queries::characters::get_character_by_token_including_deleted::get_character_by_token_including_deleted; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; /// Delete a character. @@ -40,11 +40,7 @@ pub async fn delete_character_handler( let mut mysql_connection = server_state.mysql_pool.acquire().await?; - let user_session = require_user_session_using_connection( - &http_request, - &server_state.session_checker, - &mut mysql_connection, - ).await?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *mysql_connection).await?; let user_token = &user_session.user_token; let is_mod = user_session.is_mod(); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/edit_character_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/edit_character_handler.rs index a072ddabab..3160c7967d 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/edit_character_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/edit_character_handler.rs @@ -11,7 +11,7 @@ use seedance2pro_client::creds::seedance2pro_session::Seedance2ProSession; use seedance2pro_client::requests::update_character::update_character::{update_character, UpdateCharacterArgs}; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; /// Edit a character's name or description. @@ -38,11 +38,7 @@ pub async fn edit_character_handler( let mut mysql_connection = server_state.mysql_pool.acquire().await?; - let user_session = require_user_session_using_connection( - &http_request, - &server_state.session_checker, - &mut mysql_connection, - ).await?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *mysql_connection).await?; let user_token = &user_session.user_token; let is_mod = user_session.is_mod(); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/list_characters_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/list_characters_handler.rs index a6065705c1..89c21f12e9 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/characters/list_characters_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/characters/list_characters_handler.rs @@ -16,7 +16,7 @@ use crate::http_server::common_responses::common_web_error::CommonWebError; use crate::http_server::common_responses::media::media_domain::MediaDomain; use crate::http_server::common_responses::media::media_links_builder::MediaLinksBuilder; use crate::http_server::endpoints::media_files::helpers::get_media_domain::get_media_domain; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; /// List characters for the current session. @@ -39,11 +39,7 @@ pub async fn list_characters_handler( let mut mysql_connection = server_state.mysql_pool.acquire().await?; - let user_session = require_user_session_using_connection( - &http_request, - &server_state.session_checker, - &mut mysql_connection, - ).await?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *mysql_connection).await?; let user_token = &user_session.user_token; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/color_code_folder_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/color_code_folder_handler.rs index aaa0509916..0b99b058e8 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/color_code_folder_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/color_code_folder_handler.rs @@ -17,7 +17,7 @@ use mysql_queries::queries::folders::folder::update_folder_color_code::{ use tokens::tokens::folders::FolderToken; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; const MAX_COLOR_CODE_LEN: usize = 16; @@ -47,9 +47,7 @@ pub async fn color_code_folder_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; // Normalize: trim, treat empty after trim as `None`. This lets clients // clear by passing `""` or by omitting the field entirely. diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/cover_image_folder_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/cover_image_folder_handler.rs index af6a2dfe71..c466deb424 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/cover_image_folder_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/cover_image_folder_handler.rs @@ -23,7 +23,7 @@ use tokens::tokens::folders::FolderToken; use tokens::tokens::media_files::MediaFileToken; use tokens::tokens::users::UserToken; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; /// Set or clear the custom cover image on a folder. @@ -64,9 +64,7 @@ pub async fn cover_image_folder_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; // Confirm the folder exists + is owned. Authoritative 404 source. get_folder_for_owner(GetFolderForOwnerArgs { diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/create_folder_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/create_folder_handler.rs index b922986788..cf23720f4e 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/create_folder_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/create_folder_handler.rs @@ -17,7 +17,7 @@ use crate::http_server::endpoints::folders::folder::folder_info_conversion::{ build_folder_thumbnails_lookup, folder_row_to_info, }; use crate::http_server::endpoints::media_files::helpers::get_media_domain::get_media_domain; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; const MAX_NAME_LEN: usize = 255; @@ -45,9 +45,7 @@ pub async fn create_folder_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; let name = request.name.trim().to_string(); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/delete_folder_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/delete_folder_handler.rs index 7cd38425d6..92f29254ec 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/delete_folder_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/delete_folder_handler.rs @@ -12,7 +12,7 @@ use mysql_queries::queries::folders::folder::soft_delete_folder::{ use tokens::tokens::folders::FolderToken; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; /// Soft-delete a folder. Children retain their parent pointer and become @@ -39,9 +39,7 @@ pub async fn delete_folder_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; let rows_affected = soft_delete_folder(SoftDeleteFolderArgs { diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/get_folder_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/get_folder_handler.rs index d808b219ee..7116a779da 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/get_folder_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/get_folder_handler.rs @@ -16,7 +16,7 @@ use crate::http_server::endpoints::folders::folder::folder_info_conversion::{ build_folder_thumbnails_lookup, folder_row_to_info, }; use crate::http_server::endpoints::media_files::helpers::get_media_domain::get_media_domain; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; /// Fetch a single folder owned by the logged-in user. @@ -42,9 +42,7 @@ pub async fn get_folder_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; let row = get_folder_for_owner(GetFolderForOwnerArgs { folder_token: &path.folder_token, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/list_folders_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/list_folders_handler.rs index 9805075274..32c969e4d9 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/list_folders_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/list_folders_handler.rs @@ -17,7 +17,7 @@ use crate::http_server::endpoints::folders::folder::folder_info_conversion::{ build_folder_thumbnails_lookup, folder_row_to_info, }; use crate::http_server::endpoints::media_files::helpers::get_media_domain::get_media_domain; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; const CURSOR_NAME: &str = "folders_all"; @@ -48,9 +48,7 @@ pub async fn list_folders_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; let limit = query.limit.unwrap_or(DEFAULT_LIMIT).min(MAX_LIMIT); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/rename_folder_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/rename_folder_handler.rs index 26ef2b1194..6bc2559635 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/rename_folder_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/rename_folder_handler.rs @@ -17,7 +17,7 @@ use mysql_queries::queries::folders::folder::update_folder_name::{ use tokens::tokens::folders::FolderToken; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; const MAX_NAME_LEN: usize = 255; @@ -47,9 +47,7 @@ pub async fn rename_folder_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; let new_name = request.new_name.trim().to_string(); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/star_folder_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/star_folder_handler.rs index 3a885464ff..3b0146ccf7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/star_folder_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/folder/star_folder_handler.rs @@ -17,7 +17,7 @@ use mysql_queries::queries::folders::folder::update_folder_has_star::{ use tokens::tokens::folders::FolderToken; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; #[utoipa::path( @@ -44,9 +44,7 @@ pub async fn star_folder_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; // Confirm the folder exists + is owned before issuing the update. // A 404 here is the authoritative "not found" signal — the update diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_add_folder_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_add_folder_media_files_handler.rs index f5ce0f0d03..37745d2936 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_add_folder_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_add_folder_media_files_handler.rs @@ -27,7 +27,7 @@ use mysql_queries::queries::folders::media_files::recompute_folder_last_media_fi use tokens::tokens::folders::FolderToken; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; const MAX_BULK: usize = 500; @@ -61,9 +61,7 @@ pub async fn bulk_add_folder_media_files_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; if request.media_file_tokens.len() > MAX_BULK { return Err(CommonWebError::BadInputWithSimpleMessage( diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_move_folder_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_move_folder_media_files_handler.rs index 2b57dee5a7..d72608b754 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_move_folder_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_move_folder_media_files_handler.rs @@ -30,7 +30,7 @@ use mysql_queries::queries::folders::media_files::recompute_folder_last_media_fi use tokens::tokens::folders::FolderToken; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; const MAX_BULK: usize = 500; @@ -72,9 +72,7 @@ pub async fn bulk_move_folder_media_files_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; if request.media_file_tokens.len() > MAX_BULK { return Err(CommonWebError::BadInputWithSimpleMessage( diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_remove_folder_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_remove_folder_media_files_handler.rs index 57b47c8103..b7e6eef125 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_remove_folder_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/bulk_remove_folder_media_files_handler.rs @@ -24,7 +24,7 @@ use tokens::tokens::folders::FolderToken; use tokens::tokens::media_files::MediaFileToken; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; const MAX_BULK: usize = 500; @@ -56,9 +56,7 @@ pub async fn bulk_remove_folder_media_files_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; if request.media_file_tokens.len() > MAX_BULK { return Err(CommonWebError::BadInputWithSimpleMessage( diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/list_folder_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/list_folder_media_files_handler.rs index c5ba5ef0a4..9fef065c5c 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/list_folder_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/media_files/list_folder_media_files_handler.rs @@ -32,7 +32,7 @@ use crate::http_server::common_responses::media::media_domain::MediaDomain; use crate::http_server::common_responses::media::media_file_cover_image_details::MediaFileCoverImageDetails; use crate::http_server::common_responses::media::media_links_builder::MediaLinksBuilder; use crate::http_server::endpoints::media_files::helpers::get_media_domain::get_media_domain; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; const CURSOR_NAME: &str = "folder_mf"; @@ -127,9 +127,7 @@ pub async fn list_folder_media_files_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; let folder = get_folder_for_owner(GetFolderForOwnerArgs { folder_token: &path.folder_token, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/bulk_add_subfolders_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/bulk_add_subfolders_handler.rs index 6cad9cb05b..885a249c5c 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/bulk_add_subfolders_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/bulk_add_subfolders_handler.rs @@ -25,7 +25,7 @@ use mysql_queries::queries::folders::subfolder::filter_existing_owned_folder_tok use tokens::tokens::folders::FolderToken; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; const MAX_BULK: usize = 500; @@ -58,9 +58,7 @@ pub async fn bulk_add_subfolders_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; if request.subfolder_tokens.len() > MAX_BULK { return Err(CommonWebError::BadInputWithSimpleMessage( diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/bulk_remove_subfolders_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/bulk_remove_subfolders_handler.rs index b9d4937ee6..e90d9dd6a4 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/bulk_remove_subfolders_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/bulk_remove_subfolders_handler.rs @@ -14,7 +14,7 @@ use mysql_queries::queries::folders::subfolder::bulk_clear_parent_folder::{ use tokens::tokens::folders::FolderToken; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; const MAX_BULK: usize = 500; @@ -45,9 +45,7 @@ pub async fn bulk_remove_subfolders_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; if request.subfolder_tokens.len() > MAX_BULK { return Err(CommonWebError::BadInputWithSimpleMessage( diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/list_subfolders_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/list_subfolders_handler.rs index ec047e4417..811234f1f7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/list_subfolders_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/folders/subfolder/list_subfolders_handler.rs @@ -21,7 +21,7 @@ use crate::http_server::endpoints::folders::folder::folder_info_conversion::{ build_folder_thumbnails_lookup, folder_row_to_info, }; use crate::http_server::endpoints::media_files::helpers::get_media_domain::get_media_domain; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; const CURSOR_NAME: &str = "subfolders"; @@ -55,9 +55,7 @@ pub async fn list_subfolders_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut conn, - ).await.map_err(|_| CommonWebError::NotAuthorized)?; + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *conn).await.map_err(|_| CommonWebError::NotAuthorized)?; // Confirm the parent exists + is owned by the caller before listing. 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 bce86224ad..5a1a055194 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_using_connection::require_user_session_using_connection; +use crate::http_server::web_utils::user_session::require_user_session::require_user_session; use crate::state::server_state::ServerState; #[derive(Serialize, ToSchema)] @@ -40,8 +40,7 @@ pub async fn dismiss_finished_session_jobs_handler( CommonWebError::from_error(e) })?; - let user_session = require_user_session_using_connection( - &http_request, &server_state.session_checker, &mut mysql_connection) + let user_session = require_user_session(&http_request, &server_state.session_checker, &mut *mysql_connection) .await?; dismiss_finished_jobs_for_user(&mut mysql_connection, &user_session.user_token) diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/change_media_file_animation_type_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/change_media_file_animation_type_handler.rs index bcb13474fd..4316b1a350 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/change_media_file_animation_type_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/change_media_file_animation_type_handler.rs @@ -56,7 +56,7 @@ pub async fn change_media_file_animation_type_handler( server_state: web::Data> ) -> Result, CommonWebError> { - let user_session = require_user_session(&http_request, &server_state) + let user_session = require_user_session(&http_request, &server_state.session_checker, &server_state.mysql_pool) .await .map_err(|e| { warn!("Not authorized: {:?}", e); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/change_media_file_engine_category_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/change_media_file_engine_category_handler.rs index 16366191f9..929aae0501 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/change_media_file_engine_category_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/edit/change_media_file_engine_category_handler.rs @@ -53,7 +53,7 @@ pub async fn change_media_file_engine_category_handler( server_state: web::Data> ) -> Result, CommonWebError> { - let user_session = require_user_session(&http_request, &server_state) + let user_session = require_user_session(&http_request, &server_state.session_checker, &server_state.mysql_pool) .await .map_err(|e| { warn!("Not authorized: {:?}", e); 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 04a34f76e2..264c738552 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,4 +1,3 @@ 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 061185eea0..13db7f8469 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 @@ -3,11 +3,11 @@ use std::fmt::{Display, Formatter}; use actix_web::HttpRequest; use log::warn; +use sqlx::{Executor, MySql}; use mysql_queries::queries::users::user_sessions::get_user_session_by_token::SessionUserRecord; -use crate::http_server::web_utils::user_session::require_user_session_using_connection::require_user_session_using_connection; -use crate::state::server_state::ServerState; +use crate::http_server::session::session_checker::SessionChecker; #[derive(Debug)] pub enum RequireUserSessionError { @@ -26,21 +26,36 @@ 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( +/// `mysql_executor` can be any sqlx executor — pass `&server_state.mysql_pool` to grab a +/// fresh connection, or an in-flight connection/transaction (`&mut *connection`) to reuse +/// one the handler already holds. +pub async fn require_user_session<'e, 'c : 'e, E>( http_request: &HttpRequest, - server_state: &ServerState, -) -> Result { - - let mut mysql_connection = server_state.mysql_pool - .acquire() + session_checker: &SessionChecker, + mysql_executor: E, +) -> Result + where E: 'e + Executor<'c, Database = MySql> +{ + let maybe_user_session = session_checker + .maybe_get_user_session_from_executor(http_request, mysql_executor) .await - .map_err(|err| { - warn!("MySql pool error: {:?}", err); + .map_err(|e| { + warn!("Session checker error: {:?}", e); RequireUserSessionError::ServerError })?; - require_user_session_using_connection( - http_request, &server_state.session_checker, &mut mysql_connection) - .await + 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) } 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 deleted file mode 100644 index ab61358654..0000000000 --- a/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session_using_connection.rs +++ /dev/null @@ -1,39 +0,0 @@ -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) -}