diff --git a/crates/lib/database_queries/src/queries/tts/tts_results/edit_tts_result.rs b/crates/lib/database_queries/src/queries/tts/tts_results/edit_tts_result.rs new file mode 100644 index 0000000000..c373fd861d --- /dev/null +++ b/crates/lib/database_queries/src/queries/tts/tts_results/edit_tts_result.rs @@ -0,0 +1,73 @@ +use anyhow::anyhow; +use sqlx::MySqlPool; +use enums::common::visibility::Visibility; +use errors::AnyhowResult; + + +pub struct EditTtsResultArgs<'a> { + pub tts_result_token: &'a str, + pub creator_set_visibility: Visibility, + pub role_dependent_fields: CreatorOrModFields<'a>, + + pub mysql_pool: &'a MySqlPool, +} + +pub enum CreatorOrModFields<'a> { + CreatorFields { + creator_ip_address: &'a str, + }, + ModFields { + mod_user_token: &'a str, + } +} + +pub async fn edit_tts_result(args: EditTtsResultArgs<'_>) -> AnyhowResult<()> { + + let query_result = match args.role_dependent_fields { + // + // For creator users + CreatorOrModFields::CreatorFields { creator_ip_address } => { + // TODO: Don't update the original IP address. Create a new field. + sqlx::query!( + r#" +UPDATE tts_results +SET + creator_set_visibility = ?, + creator_ip_address = ? +WHERE token = ? +LIMIT 1 + "#, + args.creator_set_visibility.to_str(), + creator_ip_address, + args.tts_result_token, + ) + .execute(args.mysql_pool) + .await + }, + + // + // For moderators + CreatorOrModFields::ModFields { mod_user_token } => { + sqlx::query!( + r#" +UPDATE tts_results +SET + creator_set_visibility = ?, + maybe_mod_user_token = ? +WHERE token = ? +LIMIT 1 + "#, + args.creator_set_visibility.to_str(), + mod_user_token, + args.tts_result_token, + ) + .execute(args.mysql_pool) + .await + }, + }; + + match query_result { + Ok(_) => Ok(()), + Err(err) => Err(anyhow!("Update TTS result DB error: {:?}", err)), + } +} diff --git a/crates/lib/database_queries/src/queries/tts/tts_results/mod.rs b/crates/lib/database_queries/src/queries/tts/tts_results/mod.rs index a4b88aa68b..5a535ed5ca 100644 --- a/crates/lib/database_queries/src/queries/tts/tts_results/mod.rs +++ b/crates/lib/database_queries/src/queries/tts/tts_results/mod.rs @@ -1,4 +1,5 @@ pub mod delete_tts_result_various_scopes; +pub mod edit_tts_result; pub mod insert_tts_result; pub mod list_tts_results_query_builder; pub mod query_tts_result; \ No newline at end of file diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/tts/edit_tts_result.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/tts/edit_tts_result.rs index 53b049f267..627f684a07 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/tts/edit_tts_result.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/tts/edit_tts_result.rs @@ -10,10 +10,11 @@ use actix_web::{web, HttpResponse, HttpRequest}; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; use crate::http_server::web_utils::response_success_helpers::simple_json_success; use crate::server_state::ServerState; +use database_queries::queries::tts::tts_results::edit_tts_result::{CreatorOrModFields, edit_tts_result, EditTtsResultArgs}; use database_queries::queries::tts::tts_results::query_tts_result::select_tts_result_by_token; use enums::common::visibility::Visibility; use http_server_common::request::get_request_ip::get_request_ip; -use log::warn; +use log::{error, warn}; use std::fmt; use std::sync::Arc; @@ -134,50 +135,27 @@ pub async fn edit_tts_inference_result_handler( let ip_address = get_request_ip(&http_request); - let query_result = if is_author { - // TODO: Don't update the original IP address. Create a new field. - // We need to store the IP address details. - sqlx::query!( - r#" -UPDATE tts_results -SET - creator_set_visibility = ?, - creator_ip_address = ? -WHERE token = ? -LIMIT 1 - "#, - &creator_set_visibility.to_str(), - &ip_address, - &inference_result.tts_result_token, - ) - .execute(&server_state.mysql_pool) - .await - } else { - // We need to store the moderator details. - sqlx::query!( - r#" -UPDATE tts_results -SET - creator_set_visibility = ?, - maybe_mod_user_token = ? -WHERE token = ? -LIMIT 1 - "#, - &creator_set_visibility.to_str(), - &user_session.user_token, - &inference_result.tts_result_token, - ) - .execute(&server_state.mysql_pool) - .await + let args = EditTtsResultArgs { + tts_result_token: &inference_result.tts_result_token, + creator_set_visibility, + role_dependent_fields: if is_author { + CreatorOrModFields::CreatorFields { + creator_ip_address: &ip_address, + } + } else { + CreatorOrModFields::ModFields { + mod_user_token: &user_session.user_token, + } + }, + mysql_pool: &server_state.mysql_pool, }; - match query_result { - Ok(_) => {}, - Err(err) => { - warn!("Update TTS result DB error: {:?}", err); - return Err(EditTtsResultError::ServerError); - } - }; + edit_tts_result(args) + .await + .map_err(|err| { + error!("Update TTS result DB error: {:?}", err); + EditTtsResultError::ServerError + })?; Ok(simple_json_success()) }