diff --git a/.sqlx/query-445952fe5d4206412b2a8060c51e942ec03fc229a4ca56d04554fd033529fa4c.json b/.sqlx/query-445952fe5d4206412b2a8060c51e942ec03fc229a4ca56d04554fd033529fa4c.json new file mode 100644 index 0000000000..8c2dcd7bc3 --- /dev/null +++ b/.sqlx/query-445952fe5d4206412b2a8060c51e942ec03fc229a4ca56d04554fd033529fa4c.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "\nINSERT INTO users\nSET\n token = ?,\n \n is_temporary = ?,\n \n username = ?,\n display_name = ?,\n\n username_is_generated = ?,\n username_is_not_customized = ?,\n\n email_address = ?,\n email_gravatar_hash = ?,\n\n email_confirmed = FALSE,\n email_confirmed_by_google = ?,\n email_is_synthetic = ?,\n \n was_eagerly_provisioned = ?,\n\n profile_markdown = ?,\n profile_rendered_html = ?,\n user_role_slug = ?,\n\n password_hash = ?,\n is_without_password = ?,\n\n maybe_feature_flags = ?,\n\n ip_address_creation = ?,\n ip_address_last_login = ?,\n ip_address_last_update = ?,\n\n maybe_source = ?,\n\n maybe_signup_method = ?,\n\n maybe_referral_url = ?,\n maybe_landing_url = ?,\n\n maybe_referral_partner = ?\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 25 + }, + "nullable": [] + }, + "hash": "445952fe5d4206412b2a8060c51e942ec03fc229a4ca56d04554fd033529fa4c" +} \ No newline at end of file diff --git a/.sqlx/query-566a2d56735180e0f17484789d0debd03c68bda20354882e111476bab6132723.json b/.sqlx/query-566a2d56735180e0f17484789d0debd03c68bda20354882e111476bab6132723.json new file mode 100644 index 0000000000..3b86d131fe --- /dev/null +++ b/.sqlx/query-566a2d56735180e0f17484789d0debd03c68bda20354882e111476bab6132723.json @@ -0,0 +1,25 @@ +{ + "db_name": "MySQL", + "query": "\nSELECT\n token as `token: tokens::tokens::users::UserToken`\nFROM users\n WHERE username = ?\nLIMIT 1\n ", + "describe": { + "columns": [ + { + "ordinal": 0, + "name": "token: tokens::tokens::users::UserToken", + "type_info": { + "type": "VarString", + "flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE", + "char_set": 224, + "max_size": 128 + } + } + ], + "parameters": { + "Right": 1 + }, + "nullable": [ + false + ] + }, + "hash": "566a2d56735180e0f17484789d0debd03c68bda20354882e111476bab6132723" +} \ No newline at end of file diff --git a/.sqlx/query-867b22640ae6c49c26973a32d36439933dceef881313a7f3385d61ebe5faeb34.json b/.sqlx/query-867b22640ae6c49c26973a32d36439933dceef881313a7f3385d61ebe5faeb34.json new file mode 100644 index 0000000000..15fba30653 --- /dev/null +++ b/.sqlx/query-867b22640ae6c49c26973a32d36439933dceef881313a7f3385d61ebe5faeb34.json @@ -0,0 +1,12 @@ +{ + "db_name": "MySQL", + "query": "\nINSERT INTO users\nSET\n token = ?,\n \n is_temporary = ?,\n \n username = ?,\n display_name = ?,\n\n username_is_generated = ?,\n username_is_not_customized = ?,\n\n email_address = ?,\n email_gravatar_hash = ?,\n\n email_confirmed = FALSE,\n email_confirmed_by_google = ?,\n email_is_synthetic = ?,\n \n was_eagerly_provisioned = ?,\n\n profile_markdown = ?,\n profile_rendered_html = ?,\n user_role_slug = ?,\n\n password_hash = ?,\n is_without_password = ?,\n\n maybe_feature_flags = ?,\n\n ip_address_creation = ?,\n ip_address_last_login = ?,\n ip_address_last_update = ?,\n\n maybe_source = ?,\n\n maybe_signup_method = ?,\n\n maybe_referral_url = ?,\n maybe_landing_url = ?,\n\n maybe_referral_partner = ?,\n maybe_referral_user_token = ?\n ", + "describe": { + "columns": [], + "parameters": { + "Right": 26 + }, + "nullable": [] + }, + "hash": "867b22640ae6c49c26973a32d36439933dceef881313a7f3385d61ebe5faeb34" +} \ No newline at end of file diff --git a/crates/schema/database/mysql_queries/src/queries/users/user/get/get_user_token_by_username_with_executor.rs b/crates/schema/database/mysql_queries/src/queries/users/user/get/get_user_token_by_username_with_executor.rs new file mode 100644 index 0000000000..aa3643b3c2 --- /dev/null +++ b/crates/schema/database/mysql_queries/src/queries/users/user/get/get_user_token_by_username_with_executor.rs @@ -0,0 +1,46 @@ +use std::marker::PhantomData; + +use sqlx::{Executor, MySql}; +use tokens::tokens::users::UserToken; + +pub struct GetUserTokenByUsernameArgs<'e, 'c, E> +where + E: 'e + Executor<'c, Database = MySql>, +{ + pub username: &'e str, + pub mysql_executor: E, + pub phantom: PhantomData<&'c E>, +} + +pub async fn get_user_token_by_username_with_executor<'e, 'c: 'e, E>( + args: GetUserTokenByUsernameArgs<'e, 'c, E>, +) -> Result, sqlx::Error> +where + E: 'e + Executor<'c, Database = MySql>, +{ + let username = args.username.to_lowercase(); + + let result = sqlx::query_as!( + UsernameRecord, + r#" +SELECT + token as `token: tokens::tokens::users::UserToken` +FROM users + WHERE username = ? +LIMIT 1 + "#, + username + ) + .fetch_one(args.mysql_executor) + .await; + + match result { + Ok(record) => Ok(Some(record.token)), + Err(sqlx::Error::RowNotFound) => Ok(None), + Err(err) => Err(err), + } +} + +struct UsernameRecord { + token: UserToken, +} diff --git a/crates/schema/database/mysql_queries/src/queries/users/user/get/mod.rs b/crates/schema/database/mysql_queries/src/queries/users/user/get/mod.rs index 3a4483807b..38cf5eb03a 100644 --- a/crates/schema/database/mysql_queries/src/queries/users/user/get/mod.rs +++ b/crates/schema/database/mysql_queries/src/queries/users/user/get/mod.rs @@ -1,4 +1,5 @@ pub mod get_user_token_by_username; +pub mod get_user_token_by_username_with_executor; pub mod get_username_by_user_token; pub mod lookup_user_for_login_by_email; pub mod lookup_user_for_login_by_email_with_transactor; diff --git a/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/stripe_artcraft_create_subscription_checkout_with_user_signup_handler.rs b/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/stripe_artcraft_create_subscription_checkout_with_user_signup_handler.rs index 168e0632e0..06b13c722c 100644 --- a/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/stripe_artcraft_create_subscription_checkout_with_user_signup_handler.rs +++ b/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/stripe_artcraft_create_subscription_checkout_with_user_signup_handler.rs @@ -5,7 +5,8 @@ use crate::endpoints::checkout_with_user_signup::user_creation_case::user_creati use crate::endpoints::checkout_with_user_signup::user_exists_case::user_exists_case; use crate::utils::artcraft_stripe_config::ArtcraftStripeConfigWithClient; use crate::utils::common_web_error::CommonWebError; -use mysql_queries::queries::users::user::get::get_user_token_by_username::get_user_token_by_username; +use mysql_queries::queries::users::user::get::get_user_token_by_username_with_executor::{get_user_token_by_username_with_executor, GetUserTokenByUsernameArgs}; +use std::marker::PhantomData; use actix_artcraft::sessions::user_sessions::http_user_session_manager::HttpUserSessionManager; use actix_web::web::{Data, Json}; use actix_web::{web, HttpRequest, HttpResponse}; @@ -105,7 +106,11 @@ pub async fn stripe_artcraft_create_subscription_checkout_with_user_signup_handl if lookup_username.is_empty() { None } else { - match get_user_token_by_username(&lookup_username, &mysql_pool).await { + match get_user_token_by_username_with_executor(GetUserTokenByUsernameArgs { + username: &lookup_username, + mysql_executor: &mut *mysql_connection, + phantom: PhantomData, + }).await { Ok(token) => token, Err(err) => { warn!("Referral user lookup failed (continuing): {:?}", err); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/users/create_account_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/users/create_account_handler.rs index ef21f53adf..d559967e8d 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/users/create_account_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/users/create_account_handler.rs @@ -9,7 +9,8 @@ use std::fmt::Formatter; use crate::util::cleaners::sanitize_referral_username::sanitize_referral_username; use crate::http_server::validations::is_reserved_username::is_reserved_username; -use mysql_queries::queries::users::user::get::get_user_token_by_username::get_user_token_by_username; +use mysql_queries::queries::users::user::get::get_user_token_by_username_with_executor::{get_user_token_by_username_with_executor, GetUserTokenByUsernameArgs}; +use std::marker::PhantomData; use crate::http_server::validations::validate_passwords::validate_passwords; use crate::http_server::validations::validate_username::validate_username; use crate::util::enroll_in_studio::enroll_in_studio; @@ -225,7 +226,11 @@ pub async fn create_account_handler( if lookup_username.is_empty() { None } else { - match get_user_token_by_username(&lookup_username, &mysql_pool).await { + match get_user_token_by_username_with_executor(GetUserTokenByUsernameArgs { + username: &lookup_username, + mysql_executor: &**mysql_pool, + phantom: PhantomData, + }).await { Ok(token) => token, Err(err) => { warn!("Referral user lookup failed (continuing): {:?}", err); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/users/google_sso/google_sso_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/users/google_sso/google_sso_handler.rs index 1a9a73a7a8..cba4c49918 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/users/google_sso/google_sso_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/users/google_sso/google_sso_handler.rs @@ -20,7 +20,8 @@ use http_server_common::request::get_request_ip::get_request_ip; use http_server_common::response::serialize_as_json_error::serialize_as_json_error; use log::{info, warn}; use mysql_queries::queries::google_sign_in_accounts::get_google_sign_in_account_by_subject::get_google_sign_in_account; -use mysql_queries::queries::users::user::get::get_user_token_by_username::get_user_token_by_username; +use mysql_queries::queries::users::user::get::get_user_token_by_username_with_executor::{get_user_token_by_username_with_executor, GetUserTokenByUsernameArgs}; +use std::marker::PhantomData; use mysql_queries::queries::users::user_sessions::create_user_session_with_transactor::create_user_session_with_transactor; use mysql_queries::utils::transactor::Transactor; use sqlx::{Acquire, MySqlPool}; @@ -266,7 +267,11 @@ pub async fn google_sso_handler( if lookup_username.is_empty() { None } else { - match get_user_token_by_username(&lookup_username, &mysql_pool).await { + match get_user_token_by_username_with_executor(GetUserTokenByUsernameArgs { + username: &lookup_username, + mysql_executor: &mut *mysql_connection, + phantom: PhantomData, + }).await { Ok(token) => token, Err(err) => { warn!("Referral user lookup failed (continuing): {:?}", err);