From a875e138eb33974e438e8a7b5432b56e36260626 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sat, 10 Jul 2021 22:17:00 -0400 Subject: [PATCH] model deletion improvement for tts results --- src/database/queries/delete_tts_result.rs | 88 ++++++++++ src/database/queries/mod.rs | 1 + .../endpoints/tts/delete_tts_result.rs | 159 +++++------------- 3 files changed, 135 insertions(+), 113 deletions(-) create mode 100644 src/database/queries/delete_tts_result.rs diff --git a/src/database/queries/delete_tts_result.rs b/src/database/queries/delete_tts_result.rs new file mode 100644 index 0000000000..bc9812c095 --- /dev/null +++ b/src/database/queries/delete_tts_result.rs @@ -0,0 +1,88 @@ +use crate::util::anyhow_result::AnyhowResult; +use sqlx::MySqlPool; + +pub async fn delete_tts_inference_result_as_user( + inference_result_token: &str, + mysql_pool: &MySqlPool +) -> AnyhowResult<()> { + let _r = sqlx::query!( + r#" +UPDATE tts_results +SET + user_deleted_at = CURRENT_TIMESTAMP +WHERE + token = ? +LIMIT 1 + "#, + inference_result_token, + ) + .execute(mysql_pool) + .await?; + Ok(()) +} + +pub async fn delete_tts_inference_result_as_mod( + inference_result_token: &str, + mod_user_token: &str, + mysql_pool: &MySqlPool +) -> AnyhowResult<()> { + let _r = sqlx::query!( + r#" +UPDATE tts_results +SET + mod_deleted_at = CURRENT_TIMESTAMP, + maybe_mod_user_token = ? +WHERE + token = ? +LIMIT 1 + "#, + mod_user_token, + inference_result_token, + ) + .execute(mysql_pool) + .await?; + Ok(()) +} + +pub async fn undelete_tts_inference_result_as_user( + inference_result_token: &str, + mysql_pool: &MySqlPool +) -> AnyhowResult<()> { + let _r = sqlx::query!( + r#" +UPDATE tts_results +SET + user_deleted_at = NULL +WHERE + token = ? +LIMIT 1 + "#, + inference_result_token, + ) + .execute(mysql_pool) + .await?; + Ok(()) +} + +pub async fn undelete_tts_inference_result_as_mod( + inference_result_token: &str, + mod_user_token: &str, + mysql_pool: &MySqlPool +) -> AnyhowResult<()> { + let _r = sqlx::query!( + r#" +UPDATE tts_results +SET + mod_deleted_at = NULL, + maybe_mod_user_token = ? +WHERE + token = ? +LIMIT 1 + "#, + mod_user_token, + inference_result_token, + ) + .execute(mysql_pool) + .await?; + Ok(()) +} diff --git a/src/database/queries/mod.rs b/src/database/queries/mod.rs index a19283cd5d..3c6092a765 100644 --- a/src/database/queries/mod.rs +++ b/src/database/queries/mod.rs @@ -1,6 +1,7 @@ pub mod badges; pub mod create_session; pub mod delete_tts_model; +pub mod delete_tts_result; pub mod delete_w2l_result; pub mod delete_w2l_template; pub mod list_ip_bans; diff --git a/src/http_server/endpoints/tts/delete_tts_result.rs b/src/http_server/endpoints/tts/delete_tts_result.rs index 6111a0665f..6e8d1d3b37 100644 --- a/src/http_server/endpoints/tts/delete_tts_result.rs +++ b/src/http_server/endpoints/tts/delete_tts_result.rs @@ -6,11 +6,17 @@ use actix_web::error::ResponseError; use actix_web::http::StatusCode; use actix_web::web::Path; use actix_web::{Responder, web, HttpResponse, error, HttpRequest}; +use crate::database::queries::delete_tts_result::delete_tts_inference_result_as_mod; +use crate::database::queries::delete_tts_result::delete_tts_inference_result_as_user; +use crate::database::queries::delete_tts_result::undelete_tts_inference_result_as_mod; +use crate::database::queries::delete_tts_result::undelete_tts_inference_result_as_user; use crate::database::queries::query_tts_result::select_tts_result_by_token; use crate::http_server::web_utils::ip_address::get_request_ip; 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 crate::util::delete_role_disambiguation::DeleteRole; +use crate::util::delete_role_disambiguation::delete_role_disambiguation; use crate::util::random_crockford_token::random_crockford_token; use crate::validations::model_uploads::validate_model_title; use crate::validations::passwords::validate_passwords; @@ -33,6 +39,8 @@ pub struct DeleteTtsInferenceResultPathInfo { #[derive(Deserialize)] pub struct DeleteTtsInferenceResultRequest { set_delete: bool, + /// NB: this is only to disambiguate when a user is both a mod and an author. + as_mod: Option, } #[derive(Debug, Display)] @@ -120,35 +128,48 @@ pub async fn delete_tts_inference_result_handler( return Err(DeleteTtsInferenceResultError::NotAuthorized); } - // NB: I can't imagine we need to store this. - // let ip_address = get_request_ip(&http_request); + let delete_role = delete_role_disambiguation(is_mod, is_author, request.as_mod); let query_result = if request.set_delete { - if is_author { - user_delete_inference_result( - &path.token, - &server_state.mysql_pool - ).await - } else { - mod_delete_inference_result( - &path.token, - &user_session.user_token, - &server_state.mysql_pool - ).await + match delete_role { + DeleteRole::ErrorDoNotDelete => { + warn!("user is not allowed to delete inference results: {}", user_session.user_token); + return Err(DeleteTtsInferenceResultError::NotAuthorized); + } + DeleteRole::AsUser => { + delete_tts_inference_result_as_user( + &path.token, + &server_state.mysql_pool + ).await + } + DeleteRole::AsMod => { + delete_tts_inference_result_as_mod( + &path.token, + &user_session.user_token, + &server_state.mysql_pool + ).await + } } } else { - if is_author { - // NB: Technically only mods can see their own inference_results here - user_undelete_inference_result( - &path.token, - &server_state.mysql_pool - ).await - } else { - mod_undelete_inference_result( - &path.token, - &user_session.user_token, - &server_state.mysql_pool - ).await + match delete_role { + DeleteRole::ErrorDoNotDelete => { + warn!("user is not allowed to undelete inference results: {}", user_session.user_token); + return Err(DeleteTtsInferenceResultError::NotAuthorized); + } + DeleteRole::AsUser => { + // NB: Technically only mods can see their own inference_results here + undelete_tts_inference_result_as_user( + &path.token, + &server_state.mysql_pool + ).await + } + DeleteRole::AsMod => { + undelete_tts_inference_result_as_mod( + &path.token, + &user_session.user_token, + &server_state.mysql_pool + ).await + } } }; @@ -162,91 +183,3 @@ pub async fn delete_tts_inference_result_handler( Ok(simple_json_success()) } - -async fn user_delete_inference_result( - inference_result_token: &str, - mysql_pool: &MySqlPool -) -> Result<(), sqlx::Error> { - let _r = sqlx::query!( - r#" -UPDATE tts_results -SET - user_deleted_at = CURRENT_TIMESTAMP -WHERE - token = ? -LIMIT 1 - "#, - inference_result_token, - ) - .execute(mysql_pool) - .await?; - Ok(()) -} - -async fn mod_delete_inference_result( - inference_result_token: &str, - mod_user_token: &str, - mysql_pool: &MySqlPool -) -> Result<(), sqlx::Error> { - let _r = sqlx::query!( - r#" -UPDATE tts_results -SET - mod_deleted_at = CURRENT_TIMESTAMP, - maybe_mod_user_token = ? -WHERE - token = ? -LIMIT 1 - "#, - mod_user_token, - inference_result_token, - ) - .execute(mysql_pool) - .await?; - Ok(()) -} - -async fn user_undelete_inference_result( - inference_result_token: &str, - mysql_pool: &MySqlPool -) -> Result<(), sqlx::Error> { - - let _r = sqlx::query!( - r#" -UPDATE tts_results -SET - user_deleted_at = NULL -WHERE - token = ? -LIMIT 1 - "#, - inference_result_token, - ) - .execute(mysql_pool) - .await?; - Ok(()) -} - -async fn mod_undelete_inference_result( - inference_result_token: &str, - mod_user_token: &str, - mysql_pool: &MySqlPool -) -> Result<(), sqlx::Error> { - - let _r = sqlx::query!( - r#" -UPDATE tts_results -SET - mod_deleted_at = NULL, - maybe_mod_user_token = ? -WHERE - token = ? -LIMIT 1 - "#, - mod_user_token, - inference_result_token, - ) - .execute(mysql_pool) - .await?; - Ok(()) -}