diff --git a/crates/schema/database/mysql_queries/src/queries/users/user_subscriptions/list_active_user_subscriptions.rs b/crates/schema/database/mysql_queries/src/queries/users/user_subscriptions/list_active_user_subscriptions.rs index d030cf8efe..86f2467cb7 100644 --- a/crates/schema/database/mysql_queries/src/queries/users/user_subscriptions/list_active_user_subscriptions.rs +++ b/crates/schema/database/mysql_queries/src/queries/users/user_subscriptions/list_active_user_subscriptions.rs @@ -1,8 +1,7 @@ use chrono::{DateTime, Utc}; use enums::common::payments_namespace::PaymentsNamespace; use errors::AnyhowResult; -use sqlx::pool::PoolConnection; -use sqlx::MySql; +use sqlx::{Executor, MySql}; pub struct ActiveUserSubscription { pub user_token: String, @@ -19,10 +18,12 @@ pub struct ActiveUserSubscription { pub subscription_expires_at: DateTime, } -pub async fn list_active_user_subscriptions( - mysql_connection: &mut PoolConnection, +pub async fn list_active_user_subscriptions<'e, 'c : 'e, E>( + mysql_executor: E, user_token: &str -) -> AnyhowResult> { +) -> AnyhowResult> + where E: 'e + Executor<'c, Database = MySql> +{ // NB: "status=incomplete" subscriptions can happen when a user submits credit card info, // but the CRC is wrong. Eg. what happened with ftx on 2022.11.18. // @@ -45,7 +46,7 @@ WHERE "#, user_token, ) - .fetch_all(&mut **mysql_connection) + .fetch_all(mysql_executor) .await?; let records = records.into_iter() 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 f607c47783..30e479da1d 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 @@ -2,7 +2,6 @@ use std::fmt::{Display, Formatter}; use std::sync::Arc; use crate::http_server::session::session_checker_error::SessionCheckerError; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::RequireUserSessionError; use actix_artcraft::sessions::anonymous_visitor_tracking::avt_cookie_payload_error::AvtCookiePayloadError; use actix_artcraft::sessions::user_sessions::http_user_session_payload_error::HttpUserSessionPayloadError; use actix_http::StatusCode; @@ -317,15 +316,6 @@ impl From for CommonWebError { } } -impl From for CommonWebError { - fn from(value: RequireUserSessionError) -> Self { - match value { - RequireUserSessionError::NotAuthorized => Self::NotAuthorized, - RequireUserSessionError::ServerError => Self::from_error(value), - } - } -} - impl From for CommonWebError { fn from(err: HttpUserSessionPayloadError) -> Self { if err.is_server_error() { @@ -545,22 +535,6 @@ mod tests { assert!(source.is_some()); } - #[test] - fn require_user_session_not_authorized_maps_to_401() { - let error: CommonWebError = RequireUserSessionError::NotAuthorized.into(); - assert_eq!(error.status_code(), StatusCode::UNAUTHORIZED); - assert!(!error.is_server_error()); - } - - #[test] - fn require_user_session_server_error_wraps_cause() { - let error: CommonWebError = RequireUserSessionError::ServerError.into(); - assert_eq!(error.status_code(), StatusCode::INTERNAL_SERVER_ERROR); - assert!(error.is_server_error()); - assert!(error.cause().is_some()); - assert!(format!("{}", error.cause().unwrap()).contains("ServerError")); - } - #[test] fn serde_json_error_converts_to_500() { let bad_json = "not json at all{{{"; diff --git a/crates/service/web/storyteller_web/src/http_server/deprecated_endpoints/workflows/enqueue/enqueue_face_fusion_workflow_handler.rs b/crates/service/web/storyteller_web/src/http_server/deprecated_endpoints/workflows/enqueue/enqueue_face_fusion_workflow_handler.rs index 51044a75f2..e069a6fb38 100644 --- a/crates/service/web/storyteller_web/src/http_server/deprecated_endpoints/workflows/enqueue/enqueue_face_fusion_workflow_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/deprecated_endpoints/workflows/enqueue/enqueue_face_fusion_workflow_handler.rs @@ -28,8 +28,7 @@ use crate::http_server::requests::request_headers::get_routing_tag_header::get_r use crate::http_server::requests::request_headers::has_debug_header::has_debug_header; use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::RequireUserSessionError; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::require_user_session_extended_using_connection; +use crate::http_server::web_utils::user_session::require_user_session_extended::require_user_session_extended; use crate::state::server_state::ServerState; use crate::util::cleaners::empty_media_file_token_to_null::empty_media_file_token_to_null; @@ -114,15 +113,10 @@ pub async fn enqueue_face_fusion_workflow_handler( let maybe_avt_token = server_state.avt_cookie_manager .get_avt_token_from_request(&http_request); - let user_session = require_user_session_extended_using_connection( + let user_session = require_user_session_extended( &http_request, &server_state.session_checker, - &mut mysql_connection) - .await - .map_err(|err| match err { - RequireUserSessionError::ServerError => CommonWebError::from_error(err), - RequireUserSessionError::NotAuthorized => CommonWebError::NotAuthorized, - })?; + &mut *mysql_connection).await?; // ==================== PAID PLAN + PRIORITY ==================== // diff --git a/crates/service/web/storyteller_web/src/http_server/deprecated_endpoints/workflows/enqueue/enqueue_live_portrait_workflow_handler.rs b/crates/service/web/storyteller_web/src/http_server/deprecated_endpoints/workflows/enqueue/enqueue_live_portrait_workflow_handler.rs index 91300d3ba4..18b58ba0fc 100644 --- a/crates/service/web/storyteller_web/src/http_server/deprecated_endpoints/workflows/enqueue/enqueue_live_portrait_workflow_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/deprecated_endpoints/workflows/enqueue/enqueue_live_portrait_workflow_handler.rs @@ -29,8 +29,7 @@ use crate::http_server::requests::request_headers::get_routing_tag_header::get_r use crate::http_server::requests::request_headers::has_debug_header::has_debug_header; use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::RequireUserSessionError; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::require_user_session_extended_using_connection; +use crate::http_server::web_utils::user_session::require_user_session_extended::require_user_session_extended; use crate::state::server_state::ServerState; use crate::util::cleaners::empty_media_file_token_to_null::empty_media_file_token_to_null; @@ -122,15 +121,10 @@ pub async fn enqueue_live_portrait_workflow_handler( let maybe_avt_token = server_state.avt_cookie_manager .get_avt_token_from_request(&http_request); - let user_session = require_user_session_extended_using_connection( + let user_session = require_user_session_extended( &http_request, &server_state.session_checker, - &mut mysql_connection) - .await - .map_err(|err| match err { - RequireUserSessionError::ServerError => CommonWebError::from_error(err), - RequireUserSessionError::NotAuthorized => CommonWebError::NotAuthorized, - })?; + &mut *mysql_connection).await?; // ==================== PAID PLAN + PRIORITY ==================== // diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_studio_shot/upload_studio_shot_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_studio_shot/upload_studio_shot_media_file_handler.rs index b3254f95ae..4ec61b108b 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_studio_shot/upload_studio_shot_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_studio_shot/upload_studio_shot_media_file_handler.rs @@ -19,13 +19,13 @@ use http_server_common::request::get_request_ip::get_request_ip; use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token; use mysql_queries::queries::media_files::create::insert_media_file_from_studio_scene_render::{insert_media_file_from_studio_scene_render, InsertStudioSceneRenderArgs}; use tokens::tokens::media_files::MediaFileToken; - +use crate::http_server::common_responses::common_web_error::CommonWebError; use crate::http_server::endpoints::media_files::upload::upload_error::MediaFileUploadError; use crate::http_server::endpoints::media_files::upload::upload_studio_shot::extract_frames_from_zip::{extract_frames_from_zip, ExtractFramesError}; use crate::http_server::endpoints::media_files::upload::upload_studio_shot::ffmpeg_frames_to_mp4::ffmpeg_frames_to_mp4; use crate::http_server::requests::request_headers::has_debug_header::has_debug_header; use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::require_user_session_extended_using_connection; +use crate::http_server::web_utils::user_session::require_user_session_extended::require_user_session_extended; use crate::state::server_state::ServerState; const DEFAULT_FPS : u8 = 12; @@ -111,11 +111,14 @@ pub async fn upload_studio_shot_media_file_handler( // ==================== READ SESSION ==================== // // NB: We require a moderator to upload PMX files. - let user_session = require_user_session_extended_using_connection(&http_request, &server_state.session_checker, &mut mysql_connection) + let user_session = require_user_session_extended(&http_request, &server_state.session_checker, &mut *mysql_connection) .await .map_err(|e| { error!("User session error: {:?}", e); - MediaFileUploadError::NotAuthorized + match e { + CommonWebError::NotAuthorized => MediaFileUploadError::NotAuthorized, + _ => MediaFileUploadError::ServerError, + } })?; let maybe_avt_token = server_state diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/model_download/enqueue_gptsovits_model_download_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/model_download/enqueue_gptsovits_model_download_handler.rs index 50b812bccd..2da6346444 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/model_download/enqueue_gptsovits_model_download_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/model_download/enqueue_gptsovits_model_download_handler.rs @@ -28,8 +28,7 @@ use crate::http_server::requests::request_headers::get_routing_tag_header::get_r use crate::http_server::requests::request_headers::has_debug_header::has_debug_header; use crate::http_server::validations::validate_idempotency_token_format::validate_idempotency_token_format; use crate::http_server::validations::validate_model_title::validate_model_title; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::RequireUserSessionError; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::require_user_session_extended_using_connection; +use crate::http_server::web_utils::user_session::require_user_session_extended::require_user_session_extended; use crate::state::server_state::ServerState; #[derive(Deserialize, ToSchema)] @@ -82,15 +81,10 @@ pub async fn enqueue_gptsovits_model_download_handler( let maybe_avt_token = server_state.avt_cookie_manager .get_avt_token_from_request(&http_request); - let user_session = require_user_session_extended_using_connection( + let user_session = require_user_session_extended( &http_request, &server_state.session_checker, - &mut mysql_connection) - .await - .map_err(|err| match err { - RequireUserSessionError::ServerError => CommonWebError::from_error(err), - RequireUserSessionError::NotAuthorized => CommonWebError::NotAuthorized, - })?; + &mut *mysql_connection).await?; // ==================== PAID PLAN + PRIORITY ==================== // diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/tags/set_tags_for_entity_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/tags/set_tags_for_entity_handler.rs index 65f16ebcf4..f181e7efc4 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/tags/set_tags_for_entity_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/tags/set_tags_for_entity_handler.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use crate::http_server::common_responses::tag_info::TagInfo; use crate::http_server::common_responses::common_web_error::CommonWebError; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::require_user_session_extended_using_connection; +use crate::http_server::web_utils::user_session::require_user_session_extended::require_user_session_extended; use crate::state::server_state::ServerState; use actix_web::error::ResponseError; use actix_web::http::StatusCode; @@ -94,14 +94,10 @@ pub async fn set_tags_for_entity_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_extended_using_connection( + let user_session = require_user_session_extended( &http_request, &server_state.session_checker, - &mut mysql_connection) - .await - .map_err(|_err| { - CommonWebError::NotAuthorized - })?; + &mut *mysql_connection).await?; if user_session.role.is_banned { return Err(CommonWebError::NotAuthorized); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/users/change_password_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/users/change_password_handler.rs index 94d837d448..7f503c932b 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/users/change_password_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/users/change_password_handler.rs @@ -11,7 +11,7 @@ use log::warn; use artcraft_api_defs::users::change_password::{ChangePasswordRequest, ChangePasswordResponse}; use crate::http_server::validations::validate_passwords::validate_passwords; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::require_user_session_extended_using_connection; +use crate::http_server::web_utils::user_session::require_user_session_extended::require_user_session_extended; use crate::state::server_state::ServerState; use http_server_common::request::get_request_ip::get_request_ip; use mysql_queries::queries::users::user::update::update_password::{update_password, UpdatePasswordArgs}; @@ -54,14 +54,10 @@ pub async fn change_password_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_extended_using_connection( + let user_session = require_user_session_extended( &http_request, &server_state.session_checker, - &mut mysql_connection) - .await - .map_err(|_err| { - CommonWebError::NotAuthorized - })?; + &mut *mysql_connection).await?; if user_session.role.is_banned { return Err(CommonWebError::NotAuthorized); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/users/edit_email_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/users/edit_email_handler.rs index 04aabbe751..09886986ab 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/users/edit_email_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/users/edit_email_handler.rs @@ -10,7 +10,7 @@ use actix_web::{web, HttpRequest}; use log::warn; use artcraft_api_defs::users::edit_email::{EditEmailRequest, EditEmailResponse}; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::require_user_session_extended_using_connection; +use crate::http_server::web_utils::user_session::require_user_session_extended::require_user_session_extended; use crate::state::server_state::ServerState; use http_server_common::request::get_request_ip::get_request_ip; use mysql_queries::queries::users::user::update::update_email::{update_email, UpdateEmailArgs, UpdateEmailError}; @@ -53,14 +53,10 @@ pub async fn edit_email_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_extended_using_connection( + let user_session = require_user_session_extended( &http_request, &server_state.session_checker, - &mut mysql_connection) - .await - .map_err(|_err| { - CommonWebError::NotAuthorized - })?; + &mut *mysql_connection).await?; if user_session.role.is_banned { return Err(CommonWebError::NotAuthorized); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/users/edit_username_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/users/edit_username_handler.rs index ea6893f340..23cc23b90e 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/users/edit_username_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/users/edit_username_handler.rs @@ -12,7 +12,7 @@ use artcraft_api_defs::users::edit_username::{EditUsernameRequest, EditUsernameR use crate::http_server::validations::is_reserved_username::is_reserved_username; use crate::http_server::common_responses::common_web_error::CommonWebError; use crate::http_server::validations::validate_username::validate_username; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::require_user_session_extended_using_connection; +use crate::http_server::web_utils::user_session::require_user_session_extended::require_user_session_extended; use crate::state::server_state::ServerState; use http_server_common::request::get_request_ip::get_request_ip; use mysql_queries::queries::users::user::update::update_username::{update_username, UpdateUsernameArgs, UpdateUsernameError}; @@ -63,14 +63,10 @@ pub async fn edit_username_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_extended_using_connection( + let user_session = require_user_session_extended( &http_request, &server_state.session_checker, - &mut mysql_connection) - .await - .map_err(|_err| { - CommonWebError::NotAuthorized - })?; + &mut *mysql_connection).await?; if user_session.role.is_banned { return Err(CommonWebError::NotAuthorized); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/update_weight_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/update_weight_handler.rs index 98291b0999..04a34c8b20 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/update_weight_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/update/update_weight_handler.rs @@ -11,8 +11,7 @@ use utoipa::ToSchema; use crate::configs::supported_languages_for_models::{get_canonicalized_language_tag_for_model, get_primary_language_subtag}; use crate::http_server::common_responses::common_web_error::CommonWebError; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::RequireUserSessionError; -use crate::http_server::web_utils::user_session::require_user_session_extended_using_connection::require_user_session_extended_using_connection; +use crate::http_server::web_utils::user_session::require_user_session_extended::require_user_session_extended; use crate::state::server_state::ServerState; use enums::by_table::media_files::media_file_type::MediaFileType; use enums::by_table::model_weights::weights_types::WeightsType; @@ -95,18 +94,10 @@ pub async fn update_weight_handler( CommonWebError::from_error(err) })?; - let user_session = require_user_session_extended_using_connection( + let user_session = require_user_session_extended( &http_request, &server_state.session_checker, - &mut mysql_connection) - .await - .map_err(|err| match err { - RequireUserSessionError::NotAuthorized => CommonWebError::NotAuthorized, - _ => { - warn!("get user session error: {:?}", err); - CommonWebError::from_error(err) - }, - })?; + &mut *mysql_connection).await?; let weight_token = path.weight_token.clone(); diff --git a/crates/service/web/storyteller_web/src/http_server/session/session_checker.rs b/crates/service/web/storyteller_web/src/http_server/session/session_checker.rs index ab6f51910b..a1961a078d 100644 --- a/crates/service/web/storyteller_web/src/http_server/session/session_checker.rs +++ b/crates/service/web/storyteller_web/src/http_server/session/session_checker.rs @@ -6,13 +6,13 @@ use actix_artcraft::sessions::user_sessions::http_user_session_manager::HttpUserSessionManager; use actix_web::HttpRequest; use log::warn; -use mysql_queries::queries::users::user_sessions::get_user_session_by_token::{get_user_session_by_token, get_user_session_by_token_pooled_connection, SessionUserRecord}; +use mysql_queries::queries::users::user_sessions::get_user_session_by_token::{get_user_session_by_token, SessionUserRecord}; use mysql_queries::queries::users::user_sessions::get_user_session_by_token_light::{get_user_session_by_token_light, SessionRecord}; use mysql_queries::queries::users::user_subscriptions::list_active_user_subscriptions::list_active_user_subscriptions; use redis_caching::redis_ttl_cache::{RedisTtlCache, RedisTtlCacheConnection}; use redis_common::redis_cache_keys::RedisCacheKeys; use sqlx::pool::PoolConnection; -use sqlx::{Executor, MySql, MySqlPool}; +use sqlx::{Executor, MySql, MySqlConnection, MySqlPool}; use crate::http_server::session::lookup::user_session_extended::{UserSessionExtended, UserSessionPreferences, UserSessionPremiumPlanInfo, UserSessionRoleAndPermissions, UserSessionSubscriptionPlan, UserSessionUserDetails}; use crate::http_server::session::lookup::user_session_feature_flags::UserSessionFeatureFlags; @@ -209,6 +209,18 @@ impl SessionChecker { request: &HttpRequest, mysql_connection: &mut PoolConnection, ) -> Result, SessionCheckerError> + { + self.maybe_get_user_session_extended_from_executor(request, &mut **mysql_connection).await + } + + // NB: This takes a concrete `&mut MySqlConnection` rather than a generic `Executor` because + // the extended lookup runs two queries; it reborrows the connection for each. (A by-value + // `E: Executor` would be consumed by the first query.) + pub async fn maybe_get_user_session_extended_from_executor( + &self, + request: &HttpRequest, + mysql_executor: &mut MySqlConnection, + ) -> Result, SessionCheckerError> { let session_payload= match self.cookie_manager.decode_session_payload_from_request(request)? { None => return Ok(None), @@ -217,7 +229,7 @@ impl SessionChecker { // TODO: Fire both requests off simultaneously. let user_session = { - match get_user_session_by_token_pooled_connection(mysql_connection, &session_payload.session_token).await? { + match get_user_session_by_token(&mut *mysql_executor, &session_payload.session_token).await? { None => return Ok(None), Some(u) => u, } @@ -226,7 +238,7 @@ impl SessionChecker { // TODO: Cache this so we don't hit the database twice. let subscriptions = list_active_user_subscriptions( - mysql_connection, + &mut *mysql_executor, user_session.user_token.as_str() ).await .map_err(SessionCheckerError::OtherError)?; 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..446fa123d5 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,3 @@ pub mod require_moderator; pub mod require_user_session; -pub mod require_user_session_extended_using_connection; +pub mod require_user_session_extended; diff --git a/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session_extended.rs b/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session_extended.rs new file mode 100644 index 0000000000..2bc037be10 --- /dev/null +++ b/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session_extended.rs @@ -0,0 +1,40 @@ +use actix_web::HttpRequest; +use log::warn; +use sqlx::MySqlConnection; + +use crate::http_server::common_responses::common_web_error::CommonWebError; +use crate::http_server::session::lookup::user_session_extended::UserSessionExtended; +use crate::http_server::session::session_checker::SessionChecker; + +/// Pass an in-flight connection (`&mut *connection`) to reuse one the handler already holds. +/// (The extended lookup runs two queries, so it takes a concrete `&mut MySqlConnection` — which +/// it reborrows for each — rather than a by-value `Executor` that the first query would consume.) +pub async fn require_user_session_extended( + http_request: &HttpRequest, + session_checker: &SessionChecker, + mysql_executor: &mut MySqlConnection, +) -> Result +{ + let maybe_user_session = session_checker + .maybe_get_user_session_extended_from_executor(http_request, mysql_executor) + .await + .map_err(|e| { + warn!("Session checker error: {:?}", e); + CommonWebError::from_error(e) + })?; + + let user_session = match maybe_user_session { + Some(session) => session, + None => { + warn!("not logged in"); + return Err(CommonWebError::NotAuthorized); + } + }; + + if user_session.role.is_banned { + warn!("user is banned: {:?}", user_session.user_token.as_str()); + return Err(CommonWebError::NotAuthorized); + } + + Ok(user_session) +} diff --git a/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session_extended_using_connection.rs b/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session_extended_using_connection.rs deleted file mode 100644 index 2e4e718a7f..0000000000 --- a/crates/service/web/storyteller_web/src/http_server/web_utils/user_session/require_user_session_extended_using_connection.rs +++ /dev/null @@ -1,58 +0,0 @@ -use std::error::Error; -use std::fmt::{Display, Formatter}; - -use actix_web::HttpRequest; -use log::warn; -use sqlx::pool::PoolConnection; -use sqlx::MySql; - - -use crate::http_server::session::lookup::user_session_extended::UserSessionExtended; -use crate::http_server::session::session_checker::SessionChecker; - -#[derive(Debug)] -pub enum RequireUserSessionError { - ServerError, - NotAuthorized, -} - -impl Display for RequireUserSessionError { - fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { - match self { - Self::ServerError => write!(f, "ServerError"), - Self::NotAuthorized => write!(f, "NotAuthorized"), - } - } -} - -impl Error for RequireUserSessionError {} - -pub async fn require_user_session_extended_using_connection( - http_request: &HttpRequest, - session_checker: &SessionChecker, - mysql_connection: &mut PoolConnection, -) -> Result { - - let maybe_user_session = session_checker - .maybe_get_user_session_extended_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.role.is_banned { - warn!("user is banned: {:?}", user_session.user_token.as_str()); - return Err(RequireUserSessionError::NotAuthorized); - } - - Ok(user_session) -}