diff --git a/crates/service/storyteller_web/src/database/helpers/boolean_converters.rs b/crates/service/storyteller_web/src/database/helpers/boolean_converters.rs deleted file mode 100644 index 33e6898f0c..0000000000 --- a/crates/service/storyteller_web/src/database/helpers/boolean_converters.rs +++ /dev/null @@ -1,62 +0,0 @@ - -/// MySQL stores non-nullable booleans as i8. -pub fn i8_to_bool(value: i8) -> bool { - if value == 0 { - false - } else { - true - } -} - -/// Bool conversion, but turn nulls to a default value. -pub fn nullable_i8_to_bool(value: Option, default_value: bool) -> bool { - value.map(|v| i8_to_bool(v)) - .unwrap_or(default_value) -} - -/// Bool conversion, but retain nulls. -pub fn nullable_i8_to_optional_bool(value: Option) -> Option { - value.map(|v| i8_to_bool(v)) -} - -#[cfg(test)] -mod tests { - use crate::database::helpers::boolean_converters::{ - i8_to_bool, - nullable_i8_to_bool, - nullable_i8_to_optional_bool - }; - - #[test] - fn test_i8_to_bool() { - assert_eq!(i8_to_bool(0), false); - assert_eq!(i8_to_bool(1), true); - assert_eq!(i8_to_bool(-1), true); - assert_eq!(i8_to_bool(120), true); - } - - #[test] - fn test_nullable_i8_to_bool() { - assert_eq!(nullable_i8_to_bool(None, false), false); - assert_eq!(nullable_i8_to_bool(None, true), true); - assert_eq!(nullable_i8_to_bool(Some(0), false), false); - assert_eq!(nullable_i8_to_bool(Some(0), true), false); - - assert_eq!(nullable_i8_to_bool(Some(1), false), true); - assert_eq!(nullable_i8_to_bool(Some(1), true), true); - - assert_eq!(nullable_i8_to_bool(Some(100), false), true); - assert_eq!(nullable_i8_to_bool(Some(100), true), true); - assert_eq!(nullable_i8_to_bool(Some(-100), false), true); - assert_eq!(nullable_i8_to_bool(Some(-100), true), true); - } - - #[test] - fn test_nullable_i8_to_optional_bool() { - assert_eq!(nullable_i8_to_optional_bool(None), None); - assert_eq!(nullable_i8_to_optional_bool(Some(0)), Some(false)); - assert_eq!(nullable_i8_to_optional_bool(Some(1)), Some(true)); - assert_eq!(nullable_i8_to_optional_bool(Some(100)), Some(true)); - assert_eq!(nullable_i8_to_optional_bool(Some(-100)), Some(true)); - } -} diff --git a/crates/service/storyteller_web/src/database/helpers/mod.rs b/crates/service/storyteller_web/src/database/helpers/mod.rs index b5f78fd29f..35b3598e87 100644 --- a/crates/service/storyteller_web/src/database/helpers/mod.rs +++ b/crates/service/storyteller_web/src/database/helpers/mod.rs @@ -1,2 +1 @@ -pub mod boolean_converters; pub mod enums; \ No newline at end of file diff --git a/crates/service/storyteller_web/src/database/queries/categories/get_category_by_token.rs b/crates/service/storyteller_web/src/database/queries/categories/get_category_by_token.rs index 80c8a2bf3a..fa7aeaa9a4 100644 --- a/crates/service/storyteller_web/src/database/queries/categories/get_category_by_token.rs +++ b/crates/service/storyteller_web/src/database/queries/categories/get_category_by_token.rs @@ -1,7 +1,7 @@ use anyhow::anyhow; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::database::helpers::boolean_converters::{i8_to_bool, nullable_i8_to_optional_bool}; +use database_queries::helpers::boolean_converters::{nullable_i8_to_optional_bool, i8_to_bool}; use log::{info, warn, log}; use sqlx::MySqlPool; @@ -96,26 +96,26 @@ WHERE }; let category = ModelCategory { - category_token: category.category_token.clone(), - model_type: category.model_type.clone(), - maybe_super_category_token: category.maybe_super_category_token.clone(), + category_token: category.category_token, + model_type: category.model_type, + maybe_super_category_token: category.maybe_super_category_token, can_directly_have_models: i8_to_bool(category.can_directly_have_models), can_have_subcategories: i8_to_bool(category.can_have_subcategories), can_only_mods_apply: i8_to_bool(category.can_only_mods_apply), name: category.name.clone(), - maybe_dropdown_name: category.maybe_dropdown_name.clone(), - creator_user_token: category.creator_user_token.clone(), - creator_username: category.creator_username.clone(), - creator_display_name: category.creator_display_name.clone(), - creator_gravatar_hash: category.creator_gravatar_hash.clone(), - creator_ip_address_creation: category.creator_ip_address_creation.clone(), - creator_ip_address_last_update: category.creator_ip_address_last_update.clone(), + maybe_dropdown_name: category.maybe_dropdown_name, + creator_user_token: category.creator_user_token, + creator_username: category.creator_username, + creator_display_name: category.creator_display_name, + creator_gravatar_hash: category.creator_gravatar_hash, + creator_ip_address_creation: category.creator_ip_address_creation, + creator_ip_address_last_update: category.creator_ip_address_last_update, is_mod_approved: nullable_i8_to_optional_bool(category.is_mod_approved), - maybe_mod_comments: category.maybe_mod_comments.clone(), - maybe_mod_user_token: category.maybe_mod_user_token.clone(), - created_at: category.created_at.clone(), - updated_at: category.updated_at.clone(), - deleted_at: category.deleted_at.clone(), + maybe_mod_comments: category.maybe_mod_comments, + maybe_mod_user_token: category.maybe_mod_user_token, + created_at: category.created_at, + updated_at: category.updated_at, + deleted_at: category.deleted_at, }; Ok(Some(category)) diff --git a/crates/service/storyteller_web/src/database/queries/get_user_profile_by_username.rs b/crates/service/storyteller_web/src/database/queries/get_user_profile_by_username.rs index 939192e0a6..8fc2fd7cdd 100644 --- a/crates/service/storyteller_web/src/database/queries/get_user_profile_by_username.rs +++ b/crates/service/storyteller_web/src/database/queries/get_user_profile_by_username.rs @@ -1,7 +1,7 @@ use anyhow::anyhow; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::database::helpers::boolean_converters::i8_to_bool; +use database_queries::helpers::boolean_converters::i8_to_bool; use derive_more::{Display, Error}; use log::{info, warn, log}; use md5::{Md5, Digest}; diff --git a/crates/service/storyteller_web/src/database/queries/list_user_roles.rs b/crates/service/storyteller_web/src/database/queries/list_user_roles.rs index d909889798..4528c3809c 100644 --- a/crates/service/storyteller_web/src/database/queries/list_user_roles.rs +++ b/crates/service/storyteller_web/src/database/queries/list_user_roles.rs @@ -1,7 +1,7 @@ use anyhow::anyhow; use chrono::{DateTime, Utc}; use container_common::anyhow_result::AnyhowResult; -use crate::database::helpers::boolean_converters::{nullable_i8_to_optional_bool, i8_to_bool}; +use database_queries::helpers::boolean_converters::i8_to_bool; use log::{warn, info}; use sqlx::MySqlPool; @@ -125,8 +125,8 @@ FROM user_roles Ok(user_roles.into_iter() .map(|ur| { UserRoleForList { - slug: ur.slug.clone(), - name: ur.name.clone(), + slug: ur.slug, + name: ur.name, can_use_tts: i8_to_bool(ur.can_use_tts), can_use_w2l: i8_to_bool(ur.can_use_w2l), can_delete_own_tts_results: i8_to_bool(ur.can_delete_own_tts_results), @@ -146,8 +146,8 @@ FROM user_roles can_delete_other_users_w2l_results: i8_to_bool(ur.can_delete_other_users_w2l_results), can_ban_users: i8_to_bool(ur.can_ban_users), can_delete_users: i8_to_bool(ur.can_delete_users), - created_at: ur.created_at.clone(), - updated_at: ur.updated_at.clone(), + created_at: ur.created_at, + updated_at: ur.updated_at, } }) .collect::>()) diff --git a/crates/service/storyteller_web/src/database/queries/list_w2l_templates.rs b/crates/service/storyteller_web/src/database/queries/list_w2l_templates.rs index 2f32f2160c..cd0dd17349 100644 --- a/crates/service/storyteller_web/src/database/queries/list_w2l_templates.rs +++ b/crates/service/storyteller_web/src/database/queries/list_w2l_templates.rs @@ -1,9 +1,9 @@ use anyhow::anyhow; use chrono::{DateTime, Utc}; use container_common::anyhow_result::AnyhowResult; -use crate::database::helpers::boolean_converters::nullable_i8_to_optional_bool; use log::{warn, info}; use sqlx::MySqlPool; +use database_queries::helpers::boolean_converters::nullable_i8_to_optional_bool; #[derive(Serialize)] pub struct W2lTemplateRecordForList { @@ -80,20 +80,20 @@ pub async fn list_w2l_templates( Ok(templates.into_iter() .map(|template| { W2lTemplateRecordForList { - template_token: template.template_token.clone(), - template_type: template.template_type.clone(), - creator_user_token: template.creator_user_token.clone(), - creator_username: template.creator_username.clone(), - creator_display_name: template.creator_display_name.clone(), - title: template.title.clone(), + template_token: template.template_token, + template_type: template.template_type, + creator_user_token: template.creator_user_token, + creator_username: template.creator_username, + creator_display_name: template.creator_display_name, + title: template.title, frame_width: if template.frame_width > 0 { template.frame_width as u32 } else { 0 }, frame_height: if template.frame_height > 0 { template.frame_height as u32 } else { 0 }, duration_millis: if template.duration_millis > 0 { template.duration_millis as u32 } else { 0 }, - maybe_image_object_name: template.maybe_public_bucket_preview_image_object_name.clone(), - maybe_video_object_name: template.maybe_public_bucket_preview_video_object_name.clone(), + maybe_image_object_name: template.maybe_public_bucket_preview_image_object_name, + maybe_video_object_name: template.maybe_public_bucket_preview_video_object_name, is_public_listing_approved: nullable_i8_to_optional_bool(template.is_public_listing_approved), - created_at: template.created_at.clone(), - updated_at: template.updated_at.clone(), + created_at: template.created_at, + updated_at: template.updated_at, } }) .collect::>()) diff --git a/crates/service/storyteller_web/src/database/queries/query_tts_result.rs b/crates/service/storyteller_web/src/database/queries/query_tts_result.rs index 6b93c0a30b..2dcc5f50d6 100644 --- a/crates/service/storyteller_web/src/database/queries/query_tts_result.rs +++ b/crates/service/storyteller_web/src/database/queries/query_tts_result.rs @@ -3,9 +3,7 @@ use chrono::{DateTime, Utc}; use crate::AnyhowResult; use crate::database::enums::record_visibility::RecordVisibility; use crate::database::enums::vocoder_type::VocoderType; -use crate::database::helpers::boolean_converters::{i8_to_bool, nullable_i8_to_bool}; -use crate::database::helpers::boolean_converters::nullable_i8_to_optional_bool; -use derive_more::{Display, Error}; +use database_queries::helpers::boolean_converters::nullable_i8_to_bool; use log::{info, warn, log}; use regex::Regex; use sqlx::MySqlPool; @@ -138,29 +136,29 @@ pub async fn select_tts_result_by_token( } let ir_for_response = TtsResultRecordForResponse { - tts_result_token: ir.tts_result_token.clone(), + tts_result_token: ir.tts_result_token, - raw_inference_text: ir.raw_inference_text.clone(), + raw_inference_text: ir.raw_inference_text, - tts_model_token: ir.tts_model_token.clone(), - tts_model_title: ir.tts_model_title.clone(), + tts_model_token: ir.tts_model_token, + tts_model_title: ir.tts_model_title, maybe_pretrained_vocoder_used: pretrained_vocoder, - maybe_creator_user_token: ir.maybe_creator_user_token.clone(), - maybe_creator_username: ir.maybe_creator_username.clone(), - maybe_creator_display_name: ir.maybe_creator_display_name.clone(), - maybe_creator_gravatar_hash: ir.maybe_creator_gravatar_hash.clone(), + maybe_creator_user_token: ir.maybe_creator_user_token, + maybe_creator_username: ir.maybe_creator_username, + maybe_creator_display_name: ir.maybe_creator_display_name, + maybe_creator_gravatar_hash: ir.maybe_creator_gravatar_hash, - maybe_model_creator_user_token: ir.maybe_model_creator_user_token.clone(), - maybe_model_creator_username: ir.maybe_model_creator_username.clone(), - maybe_model_creator_display_name: ir.maybe_model_creator_display_name.clone(), - maybe_model_creator_gravatar_hash: ir.maybe_model_creator_gravatar_hash.clone(), + maybe_model_creator_user_token: ir.maybe_model_creator_user_token, + maybe_model_creator_username: ir.maybe_model_creator_username, + maybe_model_creator_display_name: ir.maybe_model_creator_display_name, + maybe_model_creator_gravatar_hash: ir.maybe_model_creator_gravatar_hash, //model_is_mod_approved: if ir.model_is_mod_approved == 0 { false } else { true }, - public_bucket_wav_audio_path: ir.public_bucket_wav_audio_path.clone(), - public_bucket_spectrogram_path: ir.public_bucket_spectrogram_path.clone(), + public_bucket_wav_audio_path: ir.public_bucket_wav_audio_path, + public_bucket_spectrogram_path: ir.public_bucket_spectrogram_path, // NB: Fail open/public since we're already looking at it creator_set_visibility: RecordVisibility::from_str(&ir.creator_set_visibility) @@ -169,17 +167,17 @@ pub async fn select_tts_result_by_token( file_size_bytes: if ir.file_size_bytes > 0 { ir.file_size_bytes as u32 } else { 0 }, duration_millis: if ir.duration_millis > 0 { ir.duration_millis as u32 } else { 0 }, - created_at: ir.created_at.clone(), - updated_at: ir.updated_at.clone(), + created_at: ir.created_at, + updated_at: ir.updated_at, maybe_moderator_fields: Some(TtsResultModeratorFields { model_creator_is_banned: nullable_i8_to_bool(ir.maybe_model_creator_is_banned, false), result_creator_is_banned_if_user: nullable_i8_to_bool(ir.maybe_creator_is_banned, false), - result_creator_ip_address: ir.creator_ip_address.clone(), - result_creator_deleted_at: ir.user_deleted_at.clone(), - mod_deleted_at: ir.mod_deleted_at.clone(), + result_creator_ip_address: ir.creator_ip_address, + result_creator_deleted_at: ir.user_deleted_at, + mod_deleted_at: ir.mod_deleted_at, }), }; diff --git a/crates/service/storyteller_web/src/database/queries/query_w2l_result.rs b/crates/service/storyteller_web/src/database/queries/query_w2l_result.rs index ce38cb86cb..3b2e73379d 100644 --- a/crates/service/storyteller_web/src/database/queries/query_w2l_result.rs +++ b/crates/service/storyteller_web/src/database/queries/query_w2l_result.rs @@ -1,9 +1,8 @@ use anyhow::anyhow; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::database::helpers::boolean_converters::{i8_to_bool, nullable_i8_to_bool}; -use crate::database::helpers::boolean_converters::nullable_i8_to_optional_bool; -use derive_more::{Display, Error}; +use crate::database::enums::record_visibility::RecordVisibility; +use database_queries::helpers::boolean_converters::nullable_i8_to_bool; use log::{info, warn, log}; use regex::Regex; use sqlx::MySqlPool; @@ -11,7 +10,6 @@ use sqlx::error::DatabaseError; use sqlx::error::Error::Database; use sqlx::mysql::MySqlDatabaseError; use std::sync::Arc; -use crate::database::enums::record_visibility::RecordVisibility; #[derive(Serialize)] pub struct W2lResultRecordForResponse { @@ -132,24 +130,24 @@ pub async fn select_w2l_result_by_token( }; let ir_for_response = W2lResultRecordForResponse { - w2l_result_token: ir.w2l_result_token.clone(), - maybe_w2l_template_token: ir.maybe_w2l_template_token.clone(), - maybe_tts_inference_result_token: ir.maybe_tts_inference_result_token.clone(), + w2l_result_token: ir.w2l_result_token, + maybe_w2l_template_token: ir.maybe_w2l_template_token, + maybe_tts_inference_result_token: ir.maybe_tts_inference_result_token, - public_bucket_video_path: ir.public_bucket_video_path.clone(), + public_bucket_video_path: ir.public_bucket_video_path, - template_type: ir.template_type.clone(), - template_title: ir.template_title.clone(), + template_type: ir.template_type, + template_title: ir.template_title, - maybe_creator_user_token: ir.maybe_creator_user_token.clone(), - maybe_creator_username: ir.maybe_creator_username.clone(), - maybe_creator_display_name: ir.maybe_creator_display_name.clone(), - maybe_creator_gravatar_hash: ir.maybe_creator_gravatar_hash.clone(), + maybe_creator_user_token: ir.maybe_creator_user_token, + maybe_creator_username: ir.maybe_creator_username, + maybe_creator_display_name: ir.maybe_creator_display_name, + maybe_creator_gravatar_hash: ir.maybe_creator_gravatar_hash, - maybe_template_creator_user_token: ir.maybe_template_creator_user_token.clone(), - maybe_template_creator_username: ir.maybe_template_creator_username.clone(), - maybe_template_creator_display_name: ir.maybe_template_creator_display_name.clone(), - maybe_template_creator_gravatar_hash: ir.maybe_template_creator_gravatar_hash.clone(), + maybe_template_creator_user_token: ir.maybe_template_creator_user_token, + maybe_template_creator_username: ir.maybe_template_creator_username, + maybe_template_creator_display_name: ir.maybe_template_creator_display_name, + maybe_template_creator_gravatar_hash: ir.maybe_template_creator_gravatar_hash, // NB: Fail open/public since we're already looking at it creator_set_visibility: RecordVisibility::from_str(&ir.creator_set_visibility) @@ -162,17 +160,17 @@ pub async fn select_w2l_result_by_token( frame_height: if ir.frame_height > 0 { ir.frame_height as u32 } else { 0 }, duration_millis: if ir.duration_millis > 0 { ir.duration_millis as u32 } else { 0 }, - created_at: ir.created_at.clone(), - updated_at: ir.updated_at.clone(), + created_at: ir.created_at, + updated_at: ir.updated_at, maybe_moderator_fields: Some(W2lResultModeratorFields { template_creator_is_banned: nullable_i8_to_bool(ir.maybe_template_creator_is_banned, false), result_creator_is_banned_if_user: nullable_i8_to_bool(ir.maybe_creator_is_banned, false), - result_creator_ip_address: ir.creator_ip_address.clone(), - result_creator_deleted_at: ir.user_deleted_at.clone(), - mod_deleted_at: ir.mod_deleted_at.clone(), + result_creator_ip_address: ir.creator_ip_address, + result_creator_deleted_at: ir.user_deleted_at, + mod_deleted_at: ir.mod_deleted_at, }), }; diff --git a/crates/service/storyteller_web/src/database/queries/query_w2l_template.rs b/crates/service/storyteller_web/src/database/queries/query_w2l_template.rs index 29ce15a925..96d3ca9495 100644 --- a/crates/service/storyteller_web/src/database/queries/query_w2l_template.rs +++ b/crates/service/storyteller_web/src/database/queries/query_w2l_template.rs @@ -2,8 +2,7 @@ use anyhow::anyhow; use chrono::{DateTime, Utc}; use crate::AnyhowResult; use crate::database::enums::record_visibility::RecordVisibility; -use crate::database::helpers::boolean_converters::i8_to_bool; -use crate::database::helpers::boolean_converters::nullable_i8_to_optional_bool; +use database_queries::helpers::boolean_converters::{nullable_i8_to_optional_bool, i8_to_bool}; use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; @@ -107,34 +106,34 @@ pub async fn select_w2l_template_by_token( }; let template_for_response = W2lTemplateRecordForResponse { - template_token: template.template_token.clone(), - template_type: template.template_type.clone(), - creator_user_token: template.creator_user_token.clone(), - creator_username: template.creator_username.clone(), - creator_display_name: template.creator_display_name.clone(), - creator_gravatar_hash: template.creator_gravatar_hash.clone(), - title: template.title.clone(), - description_markdown: template.description_markdown.clone(), - description_rendered_html: template.description_rendered_html.clone(), + template_token: template.template_token, + template_type: template.template_type, + creator_user_token: template.creator_user_token, + creator_username: template.creator_username, + creator_display_name: template.creator_display_name, + creator_gravatar_hash: template.creator_gravatar_hash, + title: template.title, + description_markdown: template.description_markdown, + description_rendered_html: template.description_rendered_html, frame_width: if template.frame_width > 0 { template.frame_width as u32 } else { 0 }, frame_height: if template.frame_height > 0 { template.frame_height as u32 } else { 0 }, duration_millis: if template.duration_millis > 0 { template.duration_millis as u32 } else { 0 }, - maybe_image_object_name: template.maybe_public_bucket_preview_image_object_name.clone(), - maybe_video_object_name: template.maybe_public_bucket_preview_video_object_name.clone(), + maybe_image_object_name: template.maybe_public_bucket_preview_image_object_name, + maybe_video_object_name: template.maybe_public_bucket_preview_video_object_name, // NB: Fail open/public with creator_set_visibility since we're already looking at it creator_set_visibility: RecordVisibility::from_str(&template.creator_set_visibility) .unwrap_or(RecordVisibility::Public), is_public_listing_approved: nullable_i8_to_optional_bool(template.is_public_listing_approved), is_locked_from_use: i8_to_bool(template.is_locked_from_use), is_locked_from_user_modification: i8_to_bool(template.is_locked_from_user_modification), - created_at: template.created_at.clone(), - updated_at: template.updated_at.clone(), + created_at: template.created_at, + updated_at: template.updated_at, maybe_moderator_fields: Some(W2lTemplateModeratorFields { creator_is_banned: i8_to_bool(template.creator_is_banned), - creator_ip_address_creation: template.creator_ip_address_creation.clone(), - creator_ip_address_last_update: template.creator_ip_address_last_update.clone(), - user_deleted_at: template.user_deleted_at.clone(), - mod_deleted_at: template.mod_deleted_at.clone(), + creator_ip_address_creation: template.creator_ip_address_creation, + creator_ip_address_last_update: template.creator_ip_address_last_update, + user_deleted_at: template.user_deleted_at, + mod_deleted_at: template.mod_deleted_at, }), }; diff --git a/crates/service/storyteller_web/src/database/query_builders/list_assigned_tts_categories_query_builder.rs b/crates/service/storyteller_web/src/database/query_builders/list_assigned_tts_categories_query_builder.rs index 64279387ad..18c70ce50e 100644 --- a/crates/service/storyteller_web/src/database/query_builders/list_assigned_tts_categories_query_builder.rs +++ b/crates/service/storyteller_web/src/database/query_builders/list_assigned_tts_categories_query_builder.rs @@ -2,7 +2,7 @@ use anyhow::anyhow; use chrono::{DateTime, Utc}; use container_common::anyhow_result::AnyhowResult; use crate::database::enums::record_visibility::RecordVisibility; -use crate::database::helpers::boolean_converters::{i8_to_bool, nullable_i8_to_optional_bool}; +use database_queries::helpers::boolean_converters::{i8_to_bool, nullable_i8_to_optional_bool}; use log::{warn, info}; use sqlx::MySqlPool; @@ -103,29 +103,29 @@ impl ListAssignedTtsCategoriesQueryBuilder { let internal_results = self.perform_internal_query(mysql_pool).await?; let categories = internal_results - .iter() + .into_iter() .map(|c| { AssignedCategory { - category_token: c.category_token.clone(), - model_type: c.model_type.clone(), - maybe_super_category_token: c.maybe_super_category_token.clone(), + category_token: c.category_token, + model_type: c.model_type, + maybe_super_category_token: c.maybe_super_category_token, can_directly_have_models: i8_to_bool(c.can_directly_have_models), can_have_subcategories: i8_to_bool(c.can_have_subcategories), can_only_mods_apply: i8_to_bool(c.can_only_mods_apply), - name: c.name.clone(), - maybe_dropdown_name: c.maybe_dropdown_name.clone(), - category_creator_user_token: c.category_creator_user_token.clone(), - category_creator_username: c.category_creator_username.clone(), - category_creator_display_name: c.category_creator_display_name.clone(), - category_creator_gravatar_hash: c.category_creator_gravatar_hash.clone(), + name: c.name, + maybe_dropdown_name: c.maybe_dropdown_name, + category_creator_user_token: c.category_creator_user_token, + category_creator_username: c.category_creator_username, + category_creator_display_name: c.category_creator_display_name, + category_creator_gravatar_hash: c.category_creator_gravatar_hash, is_mod_approved: nullable_i8_to_optional_bool(c.is_mod_approved), - maybe_mod_comments: c.maybe_mod_comments.clone(), + maybe_mod_comments: c.maybe_mod_comments, category_created_at: c.category_created_at, category_updated_at: c.category_updated_at, - category_deleted_at: c.category_deleted_at.clone(), + category_deleted_at: c.category_deleted_at, category_assignment_created_at: c.category_assignment_created_at, category_assignment_updated_at: c.category_assignment_updated_at, - category_assignment_deleted_at: c.category_assignment_deleted_at.clone(), + category_assignment_deleted_at: c.category_assignment_deleted_at, } }) .collect::>(); diff --git a/crates/service/storyteller_web/src/database/query_builders/list_categories_query_builder.rs b/crates/service/storyteller_web/src/database/query_builders/list_categories_query_builder.rs index e8f64a5158..a72fb912d0 100644 --- a/crates/service/storyteller_web/src/database/query_builders/list_categories_query_builder.rs +++ b/crates/service/storyteller_web/src/database/query_builders/list_categories_query_builder.rs @@ -2,7 +2,7 @@ use anyhow::anyhow; use chrono::{DateTime, Utc}; use container_common::anyhow_result::AnyhowResult; use crate::database::enums::record_visibility::RecordVisibility; -use crate::database::helpers::boolean_converters::{i8_to_bool, nullable_i8_to_optional_bool}; +use database_queries::helpers::boolean_converters::{i8_to_bool, nullable_i8_to_optional_bool}; use log::{warn, info}; use sqlx::MySqlPool; @@ -127,26 +127,26 @@ impl ListCategoriesQueryBuilder { let internal_results = self.perform_internal_query(mysql_pool).await?; let categories = internal_results - .iter() + .into_iter() .map(|c| { Category { - category_token: c.category_token.clone(), - model_type: c.model_type.clone(), - maybe_super_category_token: c.maybe_super_category_token.clone(), + category_token: c.category_token, + model_type: c.model_type, + maybe_super_category_token: c.maybe_super_category_token, can_directly_have_models: i8_to_bool(c.can_directly_have_models), can_have_subcategories: i8_to_bool(c.can_have_subcategories), can_only_mods_apply: i8_to_bool(c.can_only_mods_apply), - name: c.name.clone(), - maybe_dropdown_name: c.maybe_dropdown_name.clone(), - creator_user_token: c.creator_user_token.clone(), - creator_username: c.creator_username.clone(), - creator_display_name: c.creator_display_name.clone(), - creator_gravatar_hash: c.creator_gravatar_hash.clone(), + name: c.name, + maybe_dropdown_name: c.maybe_dropdown_name, + creator_user_token: c.creator_user_token, + creator_username: c.creator_username, + creator_display_name: c.creator_display_name, + creator_gravatar_hash: c.creator_gravatar_hash, is_mod_approved: nullable_i8_to_optional_bool(c.is_mod_approved), - maybe_mod_comments: c.maybe_mod_comments.clone(), + maybe_mod_comments: c.maybe_mod_comments, created_at: c.created_at, updated_at: c.updated_at, - deleted_at: c.deleted_at.clone(), + deleted_at: c.deleted_at, } }) .collect::>(); diff --git a/crates/service/storyteller_web/src/database/query_builders/list_users_query_builder.rs b/crates/service/storyteller_web/src/database/query_builders/list_users_query_builder.rs index 83752a7af6..4e55c62536 100644 --- a/crates/service/storyteller_web/src/database/query_builders/list_users_query_builder.rs +++ b/crates/service/storyteller_web/src/database/query_builders/list_users_query_builder.rs @@ -1,6 +1,6 @@ use chrono::{DateTime, Utc}; use container_common::anyhow_result::AnyhowResult; -use crate::database::helpers::boolean_converters::i8_to_bool; +use database_queries::helpers::boolean_converters::i8_to_bool; use sqlx::MySqlPool; /// NB: This is not to be shared externally. @@ -70,21 +70,21 @@ impl ListUsersQueryBuilder { .map(|raw_result| raw_result.user_id); let users = internal_results - .iter() + .into_iter() .map(|r| { UserForList { user_id: r.user_id, - user_token: r.user_token.clone(), - username: r.username.clone(), - display_name: r.display_name.clone(), - gravatar_hash: r.gravatar_hash.clone(), + user_token: r.user_token, + username: r.username, + display_name: r.display_name, + gravatar_hash: r.gravatar_hash, is_banned: i8_to_bool(r.is_banned), - user_role_slug: r.user_role_slug.clone(), - ip_address_creation: r.ip_address_creation.clone(), - ip_address_last_login: r.ip_address_last_login.clone(), - ip_address_last_update: r.ip_address_last_update.clone(), - created_at: r.created_at.clone(), - updated_at: r.updated_at.clone(), + user_role_slug: r.user_role_slug, + ip_address_creation: r.ip_address_creation, + ip_address_last_login: r.ip_address_last_login, + ip_address_last_update: r.ip_address_last_update, + created_at: r.created_at, + updated_at: r.updated_at, } }) .collect::>(); diff --git a/crates/service/storyteller_web/src/http_server/endpoints/users/get_profile.rs b/crates/service/storyteller_web/src/http_server/endpoints/users/get_profile.rs index 5556e2d745..45d41a5341 100644 --- a/crates/service/storyteller_web/src/http_server/endpoints/users/get_profile.rs +++ b/crates/service/storyteller_web/src/http_server/endpoints/users/get_profile.rs @@ -1,7 +1,7 @@ use actix_http::Error; use actix_http::http::header; -use actix_web::cookie::Cookie; use actix_web::HttpResponseBuilder; +use actix_web::cookie::Cookie; use actix_web::error::ResponseError; use actix_web::http::StatusCode; use actix_web::web::Path; @@ -10,12 +10,11 @@ use anyhow::anyhow; use chrono::{DateTime, Utc}; use crate::AnyhowResult; use crate::database::enums::record_visibility::RecordVisibility; -use crate::database::helpers::boolean_converters::i8_to_bool; use crate::database::queries::list_user_badges::UserBadgeForList; use crate::database::queries::list_user_badges::list_user_badges; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; use crate::server_state::ServerState; -use derive_more::{Display, Error}; +use database_queries::helpers::boolean_converters::i8_to_bool; use log::{info, warn, log}; use md5::{Md5, Digest}; use regex::Regex; @@ -23,6 +22,7 @@ use sqlx::MySqlPool; use sqlx::error::DatabaseError; use sqlx::error::Error::Database; use sqlx::mysql::MySqlDatabaseError; +use std::fmt; use std::sync::Arc; // TODO: This is duplicated in query_user_profile @@ -89,7 +89,7 @@ pub struct RawUserProfileRecord { pub created_at: DateTime, } -#[derive(Debug, Display)] +#[derive(Debug)] pub enum ProfileError { ServerError, NotFound, @@ -119,6 +119,13 @@ impl ResponseError for ProfileError { } } +// NB: Not using derive_more::Display since Clion doesn't understand it. +impl fmt::Display for ProfileError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", self) + } +} + pub async fn get_profile_handler( http_request: HttpRequest, path: Path, @@ -218,24 +225,24 @@ WHERE }; let profile_for_response = UserProfileRecordForResponse { - user_token: profile_record.user_token.clone(), - username: profile_record.username.clone(), - display_name: profile_record.display_name.clone(), - email_gravatar_hash: profile_record.email_gravatar_hash.clone(), - profile_markdown: profile_record.profile_markdown.clone(), - profile_rendered_html: profile_record.profile_rendered_html.clone(), - user_role_slug: profile_record.user_role_slug.clone(), + user_token: profile_record.user_token, + username: profile_record.username, + display_name: profile_record.display_name, + email_gravatar_hash: profile_record.email_gravatar_hash, + profile_markdown: profile_record.profile_markdown, + profile_rendered_html: profile_record.profile_rendered_html, + user_role_slug: profile_record.user_role_slug, disable_gravatar: i8_to_bool(profile_record.disable_gravatar), preferred_tts_result_visibility: profile_record.preferred_tts_result_visibility, preferred_w2l_result_visibility: profile_record.preferred_w2l_result_visibility, - discord_username: profile_record.discord_username.clone(), - twitch_username: profile_record.twitch_username.clone(), - twitter_username: profile_record.twitter_username.clone(), - patreon_username: profile_record.patreon_username.clone(), - github_username: profile_record.github_username.clone(), - cashapp_username: profile_record.cashapp_username.clone(), - website_url: profile_record.website_url.clone(), - created_at: profile_record.created_at.clone(), + discord_username: profile_record.discord_username, + twitch_username: profile_record.twitch_username, + twitter_username: profile_record.twitter_username, + patreon_username: profile_record.patreon_username, + github_username: profile_record.github_username, + cashapp_username: profile_record.cashapp_username, + website_url: profile_record.website_url, + created_at: profile_record.created_at, maybe_moderator_fields: maybe_mod_fields, badges, }; diff --git a/crates/service/storyteller_web/src/http_server/endpoints/users/login.rs b/crates/service/storyteller_web/src/http_server/endpoints/users/login.rs index a348294866..6a7dad39c0 100644 --- a/crates/service/storyteller_web/src/http_server/endpoints/users/login.rs +++ b/crates/service/storyteller_web/src/http_server/endpoints/users/login.rs @@ -1,7 +1,7 @@ use actix_http::Error; use actix_http::http::header; -use actix_web::cookie::Cookie; use actix_web::HttpResponseBuilder; +use actix_web::cookie::Cookie; use actix_web::error::ResponseError; use actix_web::http::StatusCode; use actix_web::{Responder, web, HttpResponse, error, HttpRequest}; @@ -11,7 +11,7 @@ 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::serialize_as_json_error::serialize_as_json_error; use crate::server_state::ServerState; -use derive_more::{Display, Error}; +use database_queries::helpers::boolean_converters::i8_to_bool; use log::{info, warn, log}; use regex::Regex; use sqlx::MySqlPool; @@ -21,7 +21,6 @@ use sqlx::mysql::MySqlDatabaseError; use std::fmt::Formatter; use std::fmt; use std::sync::Arc; -use crate::database::helpers::boolean_converters::i8_to_bool; #[derive(Deserialize)] pub struct LoginRequest { diff --git a/crates/service/storyteller_web/src/http_server/endpoints/w2l/get_w2l_template.rs b/crates/service/storyteller_web/src/http_server/endpoints/w2l/get_w2l_template.rs index 49a82e4475..29e416d29f 100644 --- a/crates/service/storyteller_web/src/http_server/endpoints/w2l/get_w2l_template.rs +++ b/crates/service/storyteller_web/src/http_server/endpoints/w2l/get_w2l_template.rs @@ -1,14 +1,13 @@ use actix_http::Error; use actix_http::http::header; -use actix_web::cookie::Cookie; use actix_web::HttpResponseBuilder; +use actix_web::cookie::Cookie; use actix_web::error::ResponseError; use actix_web::http::StatusCode; use actix_web::web::Path; use actix_web::{Responder, web, HttpResponse, error, HttpRequest, HttpMessage}; use chrono::{DateTime, Utc}; use crate::AnyhowResult; -use crate::database::helpers::boolean_converters::nullable_i8_to_optional_bool; use crate::database::queries::query_w2l_template::W2lTemplateRecordForResponse; use crate::database::queries::query_w2l_template::select_w2l_template_by_token; use crate::http_server::web_utils::ip_address::get_request_ip; @@ -16,13 +15,13 @@ use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; use crate::server_state::ServerState; use crate::validations::passwords::validate_passwords; use crate::validations::username::validate_username; -use derive_more::{Display, Error}; use log::{info, warn, log}; use regex::Regex; use sqlx::MySqlPool; use sqlx::error::DatabaseError; use sqlx::error::Error::Database; use sqlx::mysql::MySqlDatabaseError; +use std::fmt; use std::sync::Arc; /// For the URL PathInfo @@ -37,7 +36,7 @@ pub struct GetW2lTemplateSuccessResponse { pub template: W2lTemplateRecordForResponse, } -#[derive(Debug, Display)] +#[derive(Debug)] pub enum GetW2lTemplateError { ServerError, NotFound, @@ -61,6 +60,13 @@ impl ResponseError for GetW2lTemplateError { } } +// NB: Not using derive_more::Display since Clion doesn't understand it. +impl fmt::Display for GetW2lTemplateError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", self) + } +} + pub async fn get_w2l_template_handler( http_request: HttpRequest, path: Path, diff --git a/crates/service/storyteller_web/src/http_server/web_utils/session_checker.rs b/crates/service/storyteller_web/src/http_server/web_utils/session_checker.rs index a7691877f4..e922c1f629 100644 --- a/crates/service/storyteller_web/src/http_server/web_utils/session_checker.rs +++ b/crates/service/storyteller_web/src/http_server/web_utils/session_checker.rs @@ -2,8 +2,8 @@ use actix_web::HttpRequest; use anyhow::anyhow; use crate::AnyhowResult; use crate::database::enums::record_visibility::RecordVisibility; -use crate::database::helpers::boolean_converters::{i8_to_bool, nullable_i8_to_optional_bool}; use crate::http_server::web_utils::cookie_manager::CookieManager; +use database_queries::helpers::boolean_converters::{nullable_i8_to_optional_bool, i8_to_bool}; use log::{info, warn}; use sqlx::MySqlPool; use sqlx::error::Error::RowNotFound; @@ -235,17 +235,17 @@ WHERE user_sessions.token = ? match maybe_user_record { Ok(raw_user_record) => { let result_user_record = SessionUserRecord { - user_token: raw_user_record.user_token.clone(), - username: raw_user_record.username.clone(), - display_name: raw_user_record.display_name.clone(), - email_address: raw_user_record.email_address.clone(), + user_token: raw_user_record.user_token, + username: raw_user_record.username, + display_name: raw_user_record.display_name, + email_address: raw_user_record.email_address, email_confirmed: i8_to_bool(raw_user_record.email_confirmed), - email_gravatar_hash: raw_user_record.email_gravatar_hash.clone(), + email_gravatar_hash: raw_user_record.email_gravatar_hash, // Preference disable_gravatar: i8_to_bool(raw_user_record.disable_gravatar), auto_play_audio_preference: nullable_i8_to_optional_bool(raw_user_record.auto_play_audio_preference), auto_play_video_preference: nullable_i8_to_optional_bool(raw_user_record.auto_play_video_preference), - user_role_slug: raw_user_record.user_role_slug.clone(), + user_role_slug: raw_user_record.user_role_slug, preferred_tts_result_visibility: raw_user_record.preferred_tts_result_visibility, preferred_w2l_result_visibility: raw_user_record.preferred_w2l_result_visibility,