diff --git a/crates/lib/database_queries/src/queries/tts/tts_inference_jobs/get_tts_inference_job_status.rs b/crates/lib/database_queries/src/queries/tts/tts_inference_jobs/get_tts_inference_job_status.rs new file mode 100644 index 0000000000..3c0dce6cc1 --- /dev/null +++ b/crates/lib/database_queries/src/queries/tts/tts_inference_jobs/get_tts_inference_job_status.rs @@ -0,0 +1,73 @@ +use anyhow::anyhow; +use chrono::{DateTime, Utc}; +use errors::AnyhowResult; +use sqlx::MySqlPool; + +#[derive(Serialize)] +pub struct TtsInferenceJobStatusRecord { + pub job_token: String, + + pub status: String, + pub attempt_count: i32, + + pub maybe_result_token: Option, + pub maybe_public_bucket_wav_audio_path: Option, + + pub model_token: String, + pub tts_model_type: String, + pub title: String, // Name of the TTS model + + pub raw_inference_text: String, // User text + + pub created_at: DateTime, + pub updated_at: DateTime, +} + +pub async fn get_tts_inference_job_status( + tts_inference_job_token: &str, + mysql_pool: &MySqlPool +) -> AnyhowResult> { + + // NB: Lookup failure is Err(RowNotFound). + // NB: Since this is publicly exposed, we don't query sensitive data. + let maybe_status = sqlx::query_as!( + TtsInferenceJobStatusRecord, + r#" +SELECT + jobs.token as job_token, + + jobs.status, + jobs.attempt_count, + jobs.on_success_result_token as maybe_result_token, + results.public_bucket_wav_audio_path as maybe_public_bucket_wav_audio_path, + + jobs.model_token, + tts.tts_model_type, + tts.title, + + jobs.raw_inference_text, + + jobs.created_at, + jobs.updated_at + +FROM tts_inference_jobs as jobs +JOIN tts_models as tts + ON tts.token = jobs.model_token +LEFT OUTER JOIN tts_results as results + ON jobs.on_success_result_token = results.token + +WHERE jobs.token = ? + "#, + tts_inference_job_token + ) + .fetch_one(mysql_pool) + .await; // TODO: This will return error if it doesn't exist + + match maybe_status { + Ok(record) => Ok(Some(record)), + Err(err) => match err { + sqlx::Error::RowNotFound => Ok(None), + _ => Err(anyhow!("tts job query error: {:?}", err)), + } + } +} diff --git a/crates/lib/database_queries/src/queries/tts/tts_inference_jobs/mod.rs b/crates/lib/database_queries/src/queries/tts/tts_inference_jobs/mod.rs index dd06526791..45cf2b7171 100644 --- a/crates/lib/database_queries/src/queries/tts/tts_inference_jobs/mod.rs +++ b/crates/lib/database_queries/src/queries/tts/tts_inference_jobs/mod.rs @@ -1,5 +1,6 @@ pub mod _keys; pub mod get_pending_tts_inference_job_count; +pub mod get_tts_inference_job_status; pub mod insert_tts_inference_job; pub mod kill_tts_inference_jobs; pub mod list_available_tts_inference_jobs; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/tts/get_tts_inference_job_status.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/tts/get_tts_inference_job_status.rs index 640076528a..e172308a91 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/tts/get_tts_inference_job_status.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/tts/get_tts_inference_job_status.rs @@ -24,6 +24,7 @@ use std::borrow::BorrowMut; use std::fmt; use std::ops::Deref; use std::sync::Arc; +use database_queries::queries::tts::tts_inference_jobs::get_tts_inference_job_status::get_tts_inference_job_status; /// For the URL PathInfo #[derive(Deserialize)] @@ -68,26 +69,6 @@ pub enum GetTtsInferenceStatusError { ServerError, } -#[derive(Serialize)] -pub struct TtsInferenceJobStatusRecord { - pub job_token: String, - - pub status: String, - pub attempt_count: i32, - - pub maybe_result_token: Option, - pub maybe_public_bucket_wav_audio_path: Option, - - pub model_token: String, - pub tts_model_type: String, - pub title: String, // Name of the TTS model - - pub raw_inference_text: String, // User text - - pub created_at: DateTime, - pub updated_at: DateTime, -} - impl ResponseError for GetTtsInferenceStatusError { fn status_code(&self) -> StatusCode { match *self { @@ -119,52 +100,14 @@ pub async fn get_tts_inference_job_status_handler( { // NB: Lookup failure is Err(RowNotFound). // NB: Since this is publicly exposed, we don't query sensitive data. - let maybe_status = sqlx::query_as!( - TtsInferenceJobStatusRecord, - r#" -SELECT - jobs.token as job_token, + let maybe_status = get_tts_inference_job_status(&path.token, &server_state.mysql_pool).await; - jobs.status, - jobs.attempt_count, - jobs.on_success_result_token as maybe_result_token, - results.public_bucket_wav_audio_path as maybe_public_bucket_wav_audio_path, - - jobs.model_token, - tts.tts_model_type, - tts.title, - - jobs.raw_inference_text, - - jobs.created_at, - jobs.updated_at - -FROM tts_inference_jobs as jobs -JOIN tts_models as tts - ON tts.token = jobs.model_token -LEFT OUTER JOIN tts_results as results - ON jobs.on_success_result_token = results.token - -WHERE jobs.token = ? - "#, - &path.token - ) - .fetch_one(&server_state.mysql_pool) - .await; // TODO: This will return error if it doesn't exist - - let record : TtsInferenceJobStatusRecord = match maybe_status { - Ok(record) => record, + let record = match maybe_status { + Ok(Some(record)) => record, + Ok(None) => return Err(GetTtsInferenceStatusError::ServerError), Err(err) => { - match err { - sqlx::Error::RowNotFound => { - warn!("tts job record not found"); - return Err(GetTtsInferenceStatusError::ServerError); - }, - _ => { - error!("tts job query error: {:?}", err); - return Err(GetTtsInferenceStatusError::ServerError); - } - } + error!("tts job query error: {:?}", err); + return Err(GetTtsInferenceStatusError::ServerError); } };