diff --git a/crates/lib/database_queries/src/queries/model_categories/assign_tts_category.rs b/crates/lib/database_queries/src/queries/model_categories/assign_tts_category.rs new file mode 100644 index 0000000000..da22d01805 --- /dev/null +++ b/crates/lib/database_queries/src/queries/model_categories/assign_tts_category.rs @@ -0,0 +1,97 @@ +use anyhow::anyhow; +use sqlx::MySqlPool; +use errors::AnyhowResult; + +#[derive(Copy, Clone)] +pub enum AssignOrDeleteAction { + CreateAssignment, + DeleteAssignment, +} + +pub struct AssignTtsCategoryArgs<'a> { + pub tts_model_token: &'a str, + pub tts_category_token: &'a str, + + pub editor_user_token: &'a str, + pub editor_ip_address: &'a str, + + pub action: AssignOrDeleteAction, + + pub mysql_pool: &'a MySqlPool, +} + +pub async fn assign_tts_category(args: AssignTtsCategoryArgs<'_>) -> AnyhowResult<()> { + + let query_builder = match args.action { + AssignOrDeleteAction::CreateAssignment => { + // NB: deleted_at = NULL + sqlx::query!(r#" + INSERT INTO tts_category_assignments + SET + model_token = ?, + category_token = ?, + category_addition_user_token = ?, + ip_address_creation = ?, + ip_address_last_update = ?, + deleted_at = NULL + ON DUPLICATE KEY UPDATE + model_token = ?, + category_token = ?, + category_addition_user_token = ?, + ip_address_last_update = ?, + deleted_at = NULL + "#, + // Insert + args.tts_model_token, + args.tts_category_token, + args.editor_user_token, + args.editor_ip_address, + args.editor_ip_address, + // Update + args.tts_model_token, + args.tts_category_token, + args.editor_user_token, + args.editor_ip_address, + ) + }, + AssignOrDeleteAction::DeleteAssignment => { + // NB: deleted_at = CURRENT_TIMESTAMP + sqlx::query!(r#" + INSERT INTO tts_category_assignments + SET + model_token = ?, + category_token = ?, + category_removal_user_token = ?, + ip_address_creation = ?, + ip_address_last_update = ?, + deleted_at = CURRENT_TIMESTAMP + ON DUPLICATE KEY UPDATE + model_token = ?, + category_token = ?, + category_removal_user_token = ?, + ip_address_last_update = ?, + deleted_at = CURRENT_TIMESTAMP + "#, + // Insert + args.tts_model_token, + args.tts_category_token, + args.editor_user_token, + args.editor_ip_address, + args.editor_ip_address, + // Update + args.tts_model_token, + args.tts_category_token, + args.editor_user_token, + args.editor_ip_address, + ) + } + }; + + // NB: We're soft deleting so we don't delete the associations. + let query_result = query_builder.execute(args.mysql_pool).await; + + match query_result { + Ok(_) => Ok(()), + Err(err) => Err(anyhow!("Assign category edit DB error: {:?}", err)), + } +} diff --git a/crates/lib/database_queries/src/queries/model_categories/mod.rs b/crates/lib/database_queries/src/queries/model_categories/mod.rs index 60d91fc7bf..1adef5e7a6 100644 --- a/crates/lib/database_queries/src/queries/model_categories/mod.rs +++ b/crates/lib/database_queries/src/queries/model_categories/mod.rs @@ -1,3 +1,4 @@ +pub mod assign_tts_category; pub mod create_category; pub mod get_category_by_token; pub mod list_categories_query_builder; diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/categories/tts/assign_tts_category.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/categories/tts/assign_tts_category.rs index 3f09246ebc..9b9a57d1b5 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/categories/tts/assign_tts_category.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/categories/tts/assign_tts_category.rs @@ -14,7 +14,7 @@ use database_queries::queries::model_categories::get_category_by_token::get_cate use database_queries::queries::tts::tts_models::get_tts_model::get_tts_model_by_token; use http_server_common::request::get_request_ip::get_request_ip; use http_server_common::response::serialize_as_json_error::serialize_as_json_error; -use log::{info, warn, log}; +use log::{info, warn, log, error}; use regex::Regex; use sqlx::MySqlPool; use sqlx::error::DatabaseError; @@ -22,6 +22,7 @@ use sqlx::error::Error::Database; use sqlx::mysql::MySqlDatabaseError; use std::fmt; use std::sync::Arc; +use database_queries::queries::model_categories::assign_tts_category::{assign_tts_category, AssignOrDeleteAction, AssignTtsCategoryArgs}; // =============== Request =============== @@ -179,79 +180,18 @@ pub async fn assign_tts_category_handler( let ip_address = get_request_ip(&http_request); - let query_builder = if request.assign { - // NB: deleted_at = NULL - sqlx::query!(r#" - INSERT INTO tts_category_assignments - SET - model_token = ?, - category_token = ?, - category_addition_user_token = ?, - ip_address_creation = ?, - ip_address_last_update = ?, - deleted_at = NULL - ON DUPLICATE KEY UPDATE - model_token = ?, - category_token = ?, - category_addition_user_token = ?, - ip_address_last_update = ?, - deleted_at = NULL - "#, - // Insert - &request.tts_model_token, - &request.category_token, - &user_session.user_token, - &ip_address, - &ip_address, - // Update - &request.tts_model_token, - &request.category_token, - &user_session.user_token, - &ip_address, - ) - - } else { - // NB: deleted_at = CURRENT_TIMESTAMP - sqlx::query!(r#" - INSERT INTO tts_category_assignments - SET - model_token = ?, - category_token = ?, - category_removal_user_token = ?, - ip_address_creation = ?, - ip_address_last_update = ?, - deleted_at = CURRENT_TIMESTAMP - ON DUPLICATE KEY UPDATE - model_token = ?, - category_token = ?, - category_removal_user_token = ?, - ip_address_last_update = ?, - deleted_at = CURRENT_TIMESTAMP - "#, - // Insert - &request.tts_model_token, - &request.category_token, - &user_session.user_token, - &ip_address, - &ip_address, - // Update - &request.tts_model_token, - &request.category_token, - &user_session.user_token, - &ip_address, - ) - }; - - // NB: We're soft deleting so we don't delete the associations. - let query_result = query_builder.execute(&server_state.mysql_pool).await; - - match query_result { - Ok(_) => {}, - Err(err) => { - warn!("Assign category edit DB error: {:?}", err); - return Err(AssignTtsCategoryError::ServerError); - } - }; + assign_tts_category(AssignTtsCategoryArgs { + tts_model_token: &request.tts_model_token, + tts_category_token: &request.category_token, + editor_user_token: &user_session.user_token, + editor_ip_address: &ip_address, + action: if request.assign { AssignOrDeleteAction::CreateAssignment } else { AssignOrDeleteAction::DeleteAssignment }, + mysql_pool: &server_state.mysql_pool, + }).await + .map_err(|err| { + error!("Assign category edit DB error: {:?}", err); + AssignTtsCategoryError::ServerError + })?; let response = AssignTtsCategoryResponse { success: true,