This commit is contained in:
Brandon Thomas committed 2026-03-03 10:02:24 -05:00
1 parent 59ea176d4c
commit bf09c7f689
2 files changed
+90 -66

No files matched your search

@@ -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,
@@ -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<sqlx::MySql>,
) -> Result<Json<GenerateFlux1DevTextToImageResponse>, 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,
}))
}