From 70bed32f51e6c20b2ea85d2c406014366b630ebd Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 7 Sep 2025 17:46:23 -0400 Subject: [PATCH] query for wallet token --- .../database/mysql_queries/src/queries/mod.rs | 1 + .../find_wallet_token_for_owner_user.rs | 67 +++++++++++++++++++ ...ternal_select_wallet_balance_for_update.rs | 4 ++ .../mysql_queries/src/queries/wallets/mod.rs | 2 + crates/schema/public/tokens/src/prefixes.rs | 2 + crates/schema/public/tokens/src/tokens/mod.rs | 1 + .../public/tokens/src/tokens/wallets.rs | 17 +++++ .../payment_intent_succeeded_handler.rs | 6 +- 8 files changed, 97 insertions(+), 3 deletions(-) create mode 100644 crates/schema/database/mysql_queries/src/queries/wallets/find_wallet_token_for_owner_user.rs create mode 100644 crates/schema/database/mysql_queries/src/queries/wallets/internal_select_wallet_balance_for_update.rs create mode 100644 crates/schema/database/mysql_queries/src/queries/wallets/mod.rs create mode 100644 crates/schema/public/tokens/src/tokens/wallets.rs diff --git a/crates/schema/database/mysql_queries/src/queries/mod.rs b/crates/schema/database/mysql_queries/src/queries/mod.rs index 39019d782d..c88e234c1e 100644 --- a/crates/schema/database/mysql_queries/src/queries/mod.rs +++ b/crates/schema/database/mysql_queries/src/queries/mod.rs @@ -35,3 +35,4 @@ pub mod voice_clone_requests; pub mod voice_conversion; pub mod voice_designer; pub mod w2l; +pub mod wallets; 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 new file mode 100644 index 0000000000..6ecba691f2 --- /dev/null +++ b/crates/schema/database/mysql_queries/src/queries/wallets/find_wallet_token_for_owner_user.rs @@ -0,0 +1,67 @@ +use sqlx; +use sqlx::pool::PoolConnection; +use sqlx::MySql; +use tokens::tokens::users::UserToken; +use tokens::tokens::wallets::WalletToken; + +pub async fn find_wallet_token_for_owner_user_using_connection( + user_token: &UserToken, + connection: &mut PoolConnection, +) -> anyhow::Result> { + + // 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!( + RecordRaw, + r#" + SELECT + token as `token: tokens::tokens::wallets::WalletToken` + FROM wallets + WHERE owner_user_token = ? + LIMIT 1 + "#, + user_token.as_str() + ) + .fetch_optional(&mut **connection) + .await; + + match result { + Ok(Some(record)) => Ok(Some(record.token)), + Ok(None) => Ok(None), + Err(e) => Err(anyhow::anyhow!("Database query error: {}", e)), + } +} + + +pub async fn find_wallet_token_for_owner_user_using_transaction( + user_token: &UserToken, + transaction: &mut sqlx::Transaction<'_, MySql>, +) -> anyhow::Result> { + + // 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!( + RecordRaw, + r#" + SELECT + token as `token: tokens::tokens::wallets::WalletToken` + FROM wallets + WHERE owner_user_token = ? + LIMIT 1 + "#, + user_token.as_str() + ) + .fetch_optional(&mut **transaction) + .await; + + match result { + Ok(Some(record)) => Ok(Some(record.token)), + Ok(None) => Ok(None), + Err(e) => Err(anyhow::anyhow!("Database query error: {}", e)), + } +} + +#[derive(sqlx::FromRow)] +struct RecordRaw { + token: WalletToken, +} diff --git a/crates/schema/database/mysql_queries/src/queries/wallets/internal_select_wallet_balance_for_update.rs b/crates/schema/database/mysql_queries/src/queries/wallets/internal_select_wallet_balance_for_update.rs new file mode 100644 index 0000000000..d80b5934af --- /dev/null +++ b/crates/schema/database/mysql_queries/src/queries/wallets/internal_select_wallet_balance_for_update.rs @@ -0,0 +1,4 @@ + +pub (crate) async fn select_wallet_for_update(wallet_token: &str) -> anyhow::Result<()> { + Ok(()) +} diff --git a/crates/schema/database/mysql_queries/src/queries/wallets/mod.rs b/crates/schema/database/mysql_queries/src/queries/wallets/mod.rs new file mode 100644 index 0000000000..74124a343a --- /dev/null +++ b/crates/schema/database/mysql_queries/src/queries/wallets/mod.rs @@ -0,0 +1,2 @@ +pub (crate) mod internal_select_wallet_balance_for_update; +pub mod find_wallet_token_for_owner_user; \ No newline at end of file diff --git a/crates/schema/public/tokens/src/prefixes.rs b/crates/schema/public/tokens/src/prefixes.rs index 3da2bd93aa..bbfbf437cd 100644 --- a/crates/schema/public/tokens/src/prefixes.rs +++ b/crates/schema/public/tokens/src/prefixes.rs @@ -45,6 +45,7 @@ pub(crate) enum TokenPrefix { UserSession, VoiceConversionModel, VoiceConversionResult, + Wallet, ZsVoice, ZsVoiceDataset, ZsVoiceDatasetSample, @@ -124,6 +125,7 @@ impl PrefixGenerator for TokenPrefix { Self::UserSession => "session_", Self::VoiceConversionModel => "vcm_", Self::VoiceConversionResult => "vcr_", + Self::Wallet => "wallet_", Self::ZsVoice => "zsv_", Self::ZsVoiceDataset => "zsd_", Self::ZsVoiceDatasetSample => "zss_", diff --git a/crates/schema/public/tokens/src/tokens/mod.rs b/crates/schema/public/tokens/src/tokens/mod.rs index b3dc40c85f..acdc555d8c 100644 --- a/crates/schema/public/tokens/src/tokens/mod.rs +++ b/crates/schema/public/tokens/src/tokens/mod.rs @@ -38,6 +38,7 @@ pub mod w2l_inference_jobs; pub mod w2l_results; pub mod w2l_template_upload_jobs; pub mod w2l_templates; +pub mod wallets; pub mod zs_voice_dataset_samples; pub mod zs_voice_datasets; pub mod zs_voices; diff --git a/crates/schema/public/tokens/src/tokens/wallets.rs b/crates/schema/public/tokens/src/tokens/wallets.rs new file mode 100644 index 0000000000..008e099e00 --- /dev/null +++ b/crates/schema/public/tokens/src/tokens/wallets.rs @@ -0,0 +1,17 @@ +use std::fmt::Debug; + +use serde::Deserialize; +use serde::Serialize; +use utoipa::ToSchema; + +use crate::prefixes::TokenPrefix; + +/// The primary key for Media Files +#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug, Serialize, Deserialize, ToSchema)] +#[cfg_attr(feature = "database", derive(sqlx::Type))] +#[cfg_attr(feature = "database", sqlx(transparent))] +pub struct WalletToken(pub String); + +impl_string_token!(WalletToken); +impl_mysql_token_from_row!(WalletToken); +impl_crockford_generator!(WalletToken, 32usize, TokenPrefix::Wallet, CrockfordLower); diff --git a/crates/service/plugins/billing_artcraft/src/endpoints/webhook/webhook_event_handlers/payment_intent/payment_intent_succeeded_handler.rs b/crates/service/plugins/billing_artcraft/src/endpoints/webhook/webhook_event_handlers/payment_intent/payment_intent_succeeded_handler.rs index 0c96b5db4b..80363141f5 100644 --- a/crates/service/plugins/billing_artcraft/src/endpoints/webhook/webhook_event_handlers/payment_intent/payment_intent_succeeded_handler.rs +++ b/crates/service/plugins/billing_artcraft/src/endpoints/webhook/webhook_event_handlers/payment_intent/payment_intent_succeeded_handler.rs @@ -72,11 +72,11 @@ pub async fn payment_intent_succeeded_handler( info!("Fulfilling one-time payment..."); complete_credits_pack_purchase(credits_pack, purchase.quantity) .await?; + + should_ignore_retry = true; + action_was_taken = true; } } - - should_ignore_retry = true; - action_was_taken = true; } }