From f6ed5abdb7181cd3b5c01e6fdf3015543c050199 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 7 Sep 2025 17:55:57 -0400 Subject: [PATCH] wip --- .../create_new_wallet_for_owner_user.rs | 36 +++++++++++++++++++ .../find_wallet_token_for_owner_user.rs | 8 +++++ .../mysql_queries/src/queries/wallets/mod.rs | 3 +- 3 files changed, 46 insertions(+), 1 deletion(-) create mode 100644 crates/schema/database/mysql_queries/src/queries/wallets/create_new_wallet_for_owner_user.rs diff --git a/crates/schema/database/mysql_queries/src/queries/wallets/create_new_wallet_for_owner_user.rs b/crates/schema/database/mysql_queries/src/queries/wallets/create_new_wallet_for_owner_user.rs new file mode 100644 index 0000000000..2546c9f7d2 --- /dev/null +++ b/crates/schema/database/mysql_queries/src/queries/wallets/create_new_wallet_for_owner_user.rs @@ -0,0 +1,36 @@ +use errors::AnyhowResult; +use sqlx::MySql; +use tokens::tokens::users::UserToken; +use tokens::tokens::wallets::WalletToken; + +pub async fn create_new_wallet_for_owner_user( + user_token: &UserToken, + transaction: &mut sqlx::Transaction<'_, MySql>, +) -> AnyhowResult { + let token = WalletToken::generate(); + + let result = sqlx::query!( + r#" +INSERT INTO wallets +SET + token = ?, + + owner_user_token = ?, + + banked_credits = 0, + monthly_credits = 0, + + subscription_is_active = false, + subscription_is_paid = false + "#, + token.as_str(), + user_token.as_str() + ) + .execute(&mut **transaction) + .await; + + match result { + Ok(_) => Ok(token), + Err(e) => Err(anyhow::anyhow!("Database query error when creating wallet: {}", e)), + } +} diff --git a/crates/schema/database/mysql_queries/src/queries/wallets/find_wallet_token_for_owner_user.rs b/crates/schema/database/mysql_queries/src/queries/wallets/find_wallet_token_for_owner_user.rs index 6ecba691f2..f9374c2b35 100644 --- a/crates/schema/database/mysql_queries/src/queries/wallets/find_wallet_token_for_owner_user.rs +++ b/crates/schema/database/mysql_queries/src/queries/wallets/find_wallet_token_for_owner_user.rs @@ -9,6 +9,9 @@ pub async fn find_wallet_token_for_owner_user_using_connection( connection: &mut PoolConnection, ) -> anyhow::Result> { + // NB: We want to eventually support multiple wallets per user (eg. company use case), + // so we do not have a unique key on user token. In the meantime, to ensure we use the + // same wallet each time, we order by id and take the first one. // TODO(bt,2025-08-07): DO NOT COPY THIS. For some reason the query macro can't // decide which impl to use to deserialize typed tokens. let result = sqlx::query_as!( @@ -18,6 +21,7 @@ pub async fn find_wallet_token_for_owner_user_using_connection( token as `token: tokens::tokens::wallets::WalletToken` FROM wallets WHERE owner_user_token = ? + ORDER BY id ASC LIMIT 1 "#, user_token.as_str() @@ -38,6 +42,9 @@ pub async fn find_wallet_token_for_owner_user_using_transaction( transaction: &mut sqlx::Transaction<'_, MySql>, ) -> anyhow::Result> { + // NB: We want to eventually support multiple wallets per user (eg. company use case), + // so we do not have a unique key on user token. In the meantime, to ensure we use the + // same wallet each time, we order by id and take the first one. // TODO(bt,2025-08-07): DO NOT COPY THIS. For some reason the query macro can't // decide which impl to use to deserialize typed tokens. let result = sqlx::query_as!( @@ -47,6 +54,7 @@ pub async fn find_wallet_token_for_owner_user_using_transaction( token as `token: tokens::tokens::wallets::WalletToken` FROM wallets WHERE owner_user_token = ? + ORDER BY id ASC LIMIT 1 "#, user_token.as_str() diff --git a/crates/schema/database/mysql_queries/src/queries/wallets/mod.rs b/crates/schema/database/mysql_queries/src/queries/wallets/mod.rs index 74124a343a..78d3cda1e3 100644 --- a/crates/schema/database/mysql_queries/src/queries/wallets/mod.rs +++ b/crates/schema/database/mysql_queries/src/queries/wallets/mod.rs @@ -1,2 +1,3 @@ pub (crate) mod internal_select_wallet_balance_for_update; -pub mod find_wallet_token_for_owner_user; \ No newline at end of file +pub mod find_wallet_token_for_owner_user; +mod create_new_wallet_for_owner_user; \ No newline at end of file