cleanup of in-app i8_to_bool, some derive_more, etc.

This commit is contained in:
Brandon Thomas committed 2022-02-18 21:53:25 -05:00
1 parent 0d3faf230d
commit 30b484a92d
16 files changed
+176 -232

No files matched your search

@@ -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<i8>, 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<i8>) -> Option<bool> {
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));
}
}
@@ -1,2 +1 @@
pub mod boolean_converters;
pub mod enums;
@@ -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))
@@ -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};
@@ -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::<Vec<UserRoleForList>>())
@@ -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::<Vec<W2lTemplateRecordForList>>())
@@ -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,
}),
};
@@ -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,
}),
};
@@ -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,
}),
};
@@ -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::<Vec<AssignedCategory>>();
@@ -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::<Vec<Category>>();
@@ -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::<Vec<UserForList>>();
@@ -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<Utc>,
}
#[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<GetProfilePathInfo>,
@@ -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,
};
@@ -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 {
@@ -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<GetW2lTemplatePathInfo>,
@@ -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,