From 785c624e40ba52e222df87f56deb2d632dee6a1e Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Thu, 29 Jan 2026 10:28:39 -0500 Subject: [PATCH] create session --- .../creation_payload.rs | 2 + ...ption_checkout_with_user_signup_handler.rs | 5 +- .../user_creation_case.rs | 69 +++++++++++++++---- .../user_exists_case.rs | 8 ++- 4 files changed, 65 insertions(+), 19 deletions(-) diff --git a/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/creation_payload.rs b/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/creation_payload.rs index 5c3a3295ce..052bd323f3 100644 --- a/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/creation_payload.rs +++ b/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/creation_payload.rs @@ -1,4 +1,5 @@ use stripe_shared::CheckoutSession; +use tokens::tokens::user_sessions::UserSessionToken; use tokens::tokens::users::UserToken; pub (super) struct CreationPayload { @@ -8,6 +9,7 @@ pub (super) struct CreationPayload { pub (super) struct UserMetadata { pub user_token: UserToken, + pub session_token: UserSessionToken, pub username: String, pub display_name: String, pub email_address: String, 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 5c3aab4097..93f1a0781a 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 @@ -81,10 +81,11 @@ pub async fn stripe_artcraft_create_checkout_with_user_signup_handler( CommonWebError::ServerError // NB: This was probably *our* fault. })?; - let checkout_session = match maybe_user_metadata { + let creation_payload= match maybe_user_metadata { None => { info!("Creating new user, then creating checkout session..."); user_creation_case( + &http_request, &price_id, &mut mysql_connection, &stripe_config, @@ -101,7 +102,7 @@ pub async fn stripe_artcraft_create_checkout_with_user_signup_handler( }, }; - let url = checkout_session.url.ok_or(CommonWebError::ServerError)?; + let url = creation_payload.checkout_session.url.ok_or(CommonWebError::ServerError)?; // Best effort to delete Redis session cache internal_session_cache_purge.best_effort_purge_session_cache(&http_request); diff --git a/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/user_creation_case.rs b/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/user_creation_case.rs index 1e1b7beeaf..c7b2d3c3fb 100644 --- a/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/user_creation_case.rs +++ b/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/user_creation_case.rs @@ -1,24 +1,25 @@ -use std::collections::HashMap; +use crate::configs::stripe_artcraft_metadata_keys::{STRIPE_ARTCRAFT_METADATA_EMAIL, STRIPE_ARTCRAFT_METADATA_USERNAME, STRIPE_ARTCRAFT_METADATA_USER_TOKEN}; +use crate::endpoints::checkout_with_user_signup::creation_payload::{CreationPayload, UserMetadata}; use crate::utils::artcraft_stripe_config::ArtcraftStripeConfigWithClient; use crate::utils::common_web_error::CommonWebError; use actix_artcraft::requests::get_request_signup_source_enum::get_request_signup_source_enum; use actix_web::HttpRequest; +use enums::by_table::users::user_feature_flag::UserFeatureFlag; use http_server_common::request::get_request_ip::get_request_ip; use log::{error, info, warn}; use mysql_queries::queries::users::user::create::create_account_error::CreateAccountError; use mysql_queries::queries::users::user::create::create_account_from_google_sso::{create_account_from_google_sso, CreateAccountFromGoogleSsoArgs}; +use mysql_queries::queries::users::user::create::create_account_from_stripe_checkout::{create_account_from_stripe_checkout, CreateAccountFromStripeCheckoutArgs}; use mysql_queries::utils::transactor::Transactor; use sqlx::pool::PoolConnection; -use sqlx::MySql; +use sqlx::{Acquire, MySql}; +use std::collections::HashMap; use stripe_checkout::checkout_session::{CreateCheckoutSession, CreateCheckoutSessionAutomaticTax, CreateCheckoutSessionLineItems, CreateCheckoutSessionSavedPaymentMethodOptions, CreateCheckoutSessionSavedPaymentMethodOptionsAllowRedisplayFilters, CreateCheckoutSessionSavedPaymentMethodOptionsPaymentMethodSave, CreateCheckoutSessionSubscriptionData}; use stripe_shared::{CheckoutSession, CheckoutSessionMode}; -use enums::by_table::users::user_feature_flag::UserFeatureFlag; -use mysql_queries::queries::users::user::create::create_account_from_stripe_checkout::{create_account_from_stripe_checkout, CreateAccountFromStripeCheckoutArgs}; +use mysql_queries::queries::users::user_sessions::create_user_session_with_transactor::create_user_session_with_transactor; use users::email::email_to_gravatar::email_to_gravatar; use users::email::generate_random_synthetic_email::generate_random_synthetic_email; use users::username::generate_random_username::generate_random_username; -use crate::configs::stripe_artcraft_metadata_keys::{STRIPE_ARTCRAFT_METADATA_EMAIL, STRIPE_ARTCRAFT_METADATA_USERNAME, STRIPE_ARTCRAFT_METADATA_USER_TOKEN}; -use crate::endpoints::checkout_with_user_signup::creation_payload::{CreationPayload, UserMetadata}; pub (super) async fn user_creation_case( http_request: &HttpRequest, @@ -27,7 +28,7 @@ pub (super) async fn user_creation_case( stripe_config: &ArtcraftStripeConfigWithClient, ) -> Result { - let mut transaction = args.mysql_connection.begin() + let mut transaction = mysql_connection.begin() .await .map_err(|e| { warn!("Could not begin transaction: {:?}", e); @@ -46,10 +47,10 @@ pub (super) async fn user_creation_case( .collect::>() .join(","); - let final_user_token; - let final_username; - let final_display_name; - let final_email_address; + let mut final_user_token = None; + let mut final_username = None; + let mut final_display_name = None; + let mut final_email_address = None; for _ in 0..3 { // NB: We try a few times to make sure we don't hit an email/username collision. @@ -77,10 +78,10 @@ pub (super) async fn user_creation_case( match result { Ok(token) => { - final_user_token = token; - final_username = username; - final_display_name = display_name; - final_email_address = user_email_address; + final_user_token = Some(token); + final_username = Some(username); + final_display_name = Some(display_name); + final_email_address = Some(user_email_address); break; }, Err(CreateAccountError::UsernameIsTaken) => { @@ -93,6 +94,43 @@ pub (super) async fn user_creation_case( } } + let final_user_token = final_user_token.ok_or_else(|| { + error!("Could not generate user token after several attempts"); + CommonWebError::ServerError + })?; + + let final_username = final_username.ok_or_else(|| { + error!("Could not generate username after several attempts"); + CommonWebError::ServerError + })?; + + let final_display_name = final_display_name.ok_or_else(|| { + error!("Could not generate display name after several attempts"); + CommonWebError::ServerError + })?; + + let final_email_address = final_email_address.ok_or_else(|| { + error!("Could not generate email address after several attempts"); + CommonWebError::ServerError + })?; + + transaction.commit() + .await + .map_err(|e| { + warn!("Could not commit transaction: {:?}", e); + CommonWebError::ServerError + })?; + + let session_token = create_user_session_with_transactor( + &final_user_token, + &ip_address, + Transactor::for_connection(mysql_connection)) + .await + .map_err(|e| { + warn!("error creating user session: {:?}", e); + CommonWebError::ServerError + })?; + let success_url = stripe_config.checkout_success_url.clone(); let cancel_url = stripe_config.checkout_cancel_url.clone(); @@ -175,6 +213,7 @@ pub (super) async fn user_creation_case( checkout_session, maybe_user_metadata: Some(UserMetadata { user_token: final_user_token, + session_token, username: final_username, display_name: final_display_name, email_address: final_email_address, diff --git a/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/user_exists_case.rs b/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/user_exists_case.rs index 2762a555ec..de6055340c 100644 --- a/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/user_exists_case.rs +++ b/crates/service/plugins/billing_artcraft/src/endpoints/checkout_with_user_signup/user_exists_case.rs @@ -1,4 +1,5 @@ use crate::configs::stripe_artcraft_metadata_keys::{STRIPE_ARTCRAFT_METADATA_EMAIL, STRIPE_ARTCRAFT_METADATA_USERNAME, STRIPE_ARTCRAFT_METADATA_USER_TOKEN}; +use crate::endpoints::checkout_with_user_signup::creation_payload::CreationPayload; use crate::utils::artcraft_stripe_config::ArtcraftStripeConfigWithClient; use crate::utils::common_web_error::CommonWebError; use actix_web::web::Data; @@ -19,7 +20,7 @@ pub (super) async fn user_exists_case( user_metadata: &UserMetadata, mysql_connection: &mut PoolConnection, stripe_config: &ArtcraftStripeConfigWithClient, -) -> Result { +) -> Result { // NB: Currently the stripe customer id field in the `users` table is only for FakeYou subscriptions, // so we need to look up any existing Artcraft subscription separately. This is needed to pre-fill @@ -159,5 +160,8 @@ pub (super) async fn user_exists_case( checkout_session }; - Ok(checkout_session) + Ok(CreationPayload { + checkout_session, + maybe_user_metadata: None, + }) }