From bf09c7f6896b09d2f3df3fc47d896918d4f13a36 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Tue, 3 Mar 2026 10:02:24 -0500 Subject: [PATCH] cleanup --- ...nference_job_for_fal_queue_mock_failure.rs | 4 +- ...nerate_flux_1_dev_text_to_image_handler.rs | 152 ++++++++++-------- 2 files changed, 90 insertions(+), 66 deletions(-) diff --git a/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs b/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs index 5787342056..cebd49b164 100644 --- a/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs +++ b/crates/schema/database/mysql_queries/src/queries/generic_inference/fal/insert_generic_inference_job_for_fal_queue_mock_failure.rs @@ -1,3 +1,4 @@ +use idempotency::uuid::generate_random_uuid; use sqlx::{Executor, MySql}; use std::marker::PhantomData; @@ -47,11 +48,12 @@ pub async fn insert_generic_inference_job_for_fal_queue_mock_failure<'e, 'c: 'e, where E: 'e + Executor<'c, Database = MySql> { let job_token = InferenceJobToken::generate(); + let synthetic_external_id = format!("synthetic_{}", generate_random_uuid()); let inner_args = InsertGenericInferenceForFalWithAprioriJobTokenArgs { uuid_idempotency_token: args.uuid_idempotency_token, apriori_job_token: &job_token, - maybe_external_third_party_id: "", // No external job — Fal was never called + maybe_external_third_party_id: &synthetic_external_id, fal_category: args.fal_category, maybe_inference_args: args.maybe_inference_args, maybe_prompt_token: args.maybe_prompt_token, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs index f9f836dd88..8c00dd5ac7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/generate_flux_1_dev_text_to_image_handler.rs @@ -25,6 +25,8 @@ use mysql_queries::queries::generic_inference::fal::insert_generic_inference_job use mysql_queries::queries::idepotency_tokens::insert_idempotency_token::insert_idempotency_token; use mysql_queries::queries::prompts::insert_prompt::{insert_prompt, InsertPromptArgs}; use sqlx::Acquire; +use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken; +use tokens::tokens::users::UserToken; use utoipa::ToSchema; /// Flux 1 Dev text to image @@ -94,71 +96,14 @@ pub async fn generate_flux_1_dev_text_to_image_handler( // Secret test hook: insert a synthetic "complete_failure" job without calling Fal. if is_job_failure_test(request.prompt.as_deref().unwrap_or("")) { - let ip_address = get_request_ip(&http_request); - - let mut transaction = mysql_connection - .begin() - .await - .map_err(|err| { - error!("Error starting MySQL transaction: {:?}", err); - CommonWebError::ServerError - })?; - - let prompt_result = insert_prompt(InsertPromptArgs { - maybe_apriori_prompt_token: None, - prompt_type: PromptType::ArtcraftApp, - maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token), - maybe_model_type: Some(ModelType::Flux1Dev), - maybe_generation_provider: Some(GenerationProvider::Artcraft), - maybe_positive_prompt: request.prompt.as_deref(), - maybe_negative_prompt: None, - maybe_other_args: None, - creator_ip_address: &ip_address, - mysql_executor: &mut *transaction, - phantom: Default::default(), - }).await; - - let prompt_token = match prompt_result { - Ok(token) => Some(token), - Err(err) => { - warn!("Error inserting prompt for mock failure job: {:?}", err); - None - } - }; - - let mock_result = insert_generic_inference_job_for_fal_queue_mock_failure(InsertGenericInferenceForFalMockFailureArgs { - uuid_idempotency_token: &request.uuid_idempotency_token, - fal_category: FalCategory::ImageGeneration, - maybe_inference_args: None, - maybe_prompt_token: prompt_token.as_ref(), - maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token), - maybe_avt_token: maybe_avt_token.as_ref(), - creator_ip_address: &ip_address, - creator_set_visibility: Visibility::Public, - mysql_executor: &mut *transaction, - phantom: Default::default(), - }).await; - - let job_token = match mock_result { - Ok(token) => token, - Err(err) => { - warn!("Error inserting mock failure job: {:?}", err); - return Err(CommonWebError::ServerError); - } - }; - - transaction - .commit() - .await - .map_err(|err| { - error!("Error committing mock failure transaction: {:?}", err); - CommonWebError::ServerError - })?; - - return Ok(Json(GenerateFlux1DevTextToImageResponse { - success: true, - inference_job_token: job_token, - })); + return insert_mock_failure_job( + &http_request, + request.prompt.as_deref(), + &request.uuid_idempotency_token, + maybe_user_session.as_ref().map(|s| &s.user_token), + maybe_avt_token.as_ref(), + &mut mysql_connection, + ).await; } // // TODO: This is test code @@ -298,3 +243,80 @@ pub async fn generate_flux_1_dev_text_to_image_handler( inference_job_token: job_token, })) } + +/// Inserts a synthetic `CompleteFailure` job without calling Fal. +/// Used when the prompt triggers the secret job-failure test phrase. +async fn insert_mock_failure_job( + http_request: &HttpRequest, + prompt: Option<&str>, + uuid_idempotency_token: &str, + maybe_creator_user_token: Option<&UserToken>, + maybe_avt_token: Option<&AnonymousVisitorTrackingToken>, + mysql_connection: &mut sqlx::pool::PoolConnection, +) -> Result, CommonWebError> { + let ip_address = get_request_ip(http_request); + + let mut transaction = mysql_connection + .begin() + .await + .map_err(|err| { + error!("Error starting MySQL transaction: {:?}", err); + CommonWebError::ServerError + })?; + + let prompt_result = insert_prompt(InsertPromptArgs { + maybe_apriori_prompt_token: None, + prompt_type: PromptType::ArtcraftApp, + maybe_creator_user_token, + maybe_model_type: Some(ModelType::Flux1Dev), + maybe_generation_provider: Some(GenerationProvider::Artcraft), + maybe_positive_prompt: prompt, + maybe_negative_prompt: None, + maybe_other_args: None, + creator_ip_address: &ip_address, + mysql_executor: &mut *transaction, + phantom: Default::default(), + }).await; + + let prompt_token = match prompt_result { + Ok(token) => Some(token), + Err(err) => { + warn!("Error inserting prompt for mock failure job: {:?}", err); + None + } + }; + + let mock_result = insert_generic_inference_job_for_fal_queue_mock_failure(InsertGenericInferenceForFalMockFailureArgs { + uuid_idempotency_token, + fal_category: FalCategory::ImageGeneration, + maybe_inference_args: None, + maybe_prompt_token: prompt_token.as_ref(), + maybe_creator_user_token, + maybe_avt_token, + creator_ip_address: &ip_address, + creator_set_visibility: Visibility::Public, + mysql_executor: &mut *transaction, + phantom: Default::default(), + }).await; + + let job_token = match mock_result { + Ok(token) => token, + Err(err) => { + warn!("Error inserting mock failure job: {:?}", err); + return Err(CommonWebError::ServerError); + } + }; + + transaction + .commit() + .await + .map_err(|err| { + error!("Error committing mock failure transaction: {:?}", err); + CommonWebError::ServerError + })?; + + Ok(Json(GenerateFlux1DevTextToImageResponse { + success: true, + inference_job_token: job_token, + })) +}