From 78f692e2dee57f4ca37234c64523a8d576f4f080 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Mon, 9 Mar 2026 12:42:02 -0400 Subject: [PATCH] handle errors --- .../refund_wallet_after_api_failure.rs | 28 ++++++++++--------- ...worldlabs_marble_0p1_mini_splat_handler.rs | 2 +- ...worldlabs_marble_0p1_plus_splat_handler.rs | 2 +- ...ce_2p0_multi_function_video_gen_handler.rs | 2 +- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/crates/service/web/storyteller_web/src/http_server/endpoint_helpers/refund_wallet_after_api_failure.rs b/crates/service/web/storyteller_web/src/http_server/endpoint_helpers/refund_wallet_after_api_failure.rs index 69e286f575..9e73e00fc7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoint_helpers/refund_wallet_after_api_failure.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoint_helpers/refund_wallet_after_api_failure.rs @@ -1,3 +1,4 @@ +use crate::http_server::common_responses::common_web_error::CommonWebError; use log::{error, info}; use mysql_queries::queries::wallets::refund::try_to_refund_ledger_entry::{try_to_refund_ledger_entry, WalletRefundOutcome}; use sqlx::Acquire; @@ -6,17 +7,14 @@ use tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken; pub async fn refund_wallet_after_api_failure( ledger_entry_token: &WalletLedgerEntryToken, connection: &mut sqlx::pool::PoolConnection, -) { - let mut transaction = match connection.begin().await { - Ok(tx) => tx, - Err(err) => { - error!( - "Failed to begin refund transaction after API failure (ledger {}): {:?}", - ledger_entry_token.as_str(), err - ); - return; - } - }; +) -> Result<(), CommonWebError> { + let mut transaction = connection.begin().await.map_err(|err| { + error!( + "Failed to begin refund transaction after API failure (ledger {}): {:?}", + ledger_entry_token.as_str(), err + ); + CommonWebError::ServerError + })?; match try_to_refund_ledger_entry(ledger_entry_token, &mut transaction).await { Ok(WalletRefundOutcome::Refunded(summary)) => { @@ -26,12 +24,13 @@ pub async fn refund_wallet_after_api_failure( ledger_entry_token.as_str(), summary.refund_ledger_entry_token.as_str(), ); - if let Err(err) = transaction.commit().await { + transaction.commit().await.map_err(|err| { error!( "Failed to commit refund after API failure (ledger {}): {:?}", ledger_entry_token.as_str(), err ); - } + CommonWebError::ServerError + })?; } Ok(WalletRefundOutcome::AlreadyRefunded) => { info!( @@ -46,6 +45,9 @@ pub async fn refund_wallet_after_api_failure( ledger_entry_token.as_str(), err ); let _ = transaction.rollback().await; + return Err(CommonWebError::ServerError); } } + + Ok(()) } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_mini_splat_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_mini_splat_handler.rs index 5a331d32e3..df17394fa2 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_mini_splat_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_mini_splat_handler.rs @@ -155,7 +155,7 @@ pub async fn generate_worldlabs_marble_0p1_mini_splat_handler( Ok(result) => result, Err(err) => { warn!("World Labs generate_world error: {:?}", err); - refund_wallet_after_api_failure(&wallet_deduction.ledger_entry_token, &mut mysql_connection).await; + refund_wallet_after_api_failure(&wallet_deduction.ledger_entry_token, &mut mysql_connection).await?; return Err(CommonWebError::ServerError); } }; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_plus_splat_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_plus_splat_handler.rs index caf17069b3..89b1210959 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_plus_splat_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/splat/generate_worldlabs_marble_0p1_plus_splat_handler.rs @@ -155,7 +155,7 @@ pub async fn generate_worldlabs_marble_0p1_plus_splat_handler( Ok(result) => result, Err(err) => { warn!("World Labs generate_world error: {:?}", err); - refund_wallet_after_api_failure(&wallet_deduction.ledger_entry_token, &mut mysql_connection).await; + refund_wallet_after_api_failure(&wallet_deduction.ledger_entry_token, &mut mysql_connection).await?; return Err(CommonWebError::ServerError); } }; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs index e06bec8ae3..cffaae017f 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/multi_function/seedance_2p0_multi_function_video_gen_handler.rs @@ -221,7 +221,7 @@ pub async fn seedance_2p0_multi_function_video_gen_handler( Ok(resp) => resp, Err(err) => { warn!("Error calling seedance2pro generate_video: {:?}", err); - refund_wallet_after_api_failure(&deduction_result.ledger_entry_token, &mut mysql_connection).await; + refund_wallet_after_api_failure(&deduction_result.ledger_entry_token, &mut mysql_connection).await?; // TODO: We need to start returning robust failure messages to the caller. return Err(CommonWebError::ServerError);