This commit is contained in:
Brandon Thomas committed 2024-10-03 00:45:07 -04:00
1 parent a2a7a10d0c
commit c767a17da7
6 files changed
+54 -25

No files matched your search

@@ -1,4 +1,3 @@
use log::info;
use crate::utils::transactor::Transactor;
use errors::AnyhowResult;
use sqlx::mysql::MySqlRow;
@@ -43,14 +43,15 @@ use crate::http_server::common_requests::media_file_token_path_info::MediaFileTo
use crate::http_server::common_responses::media::cover_image_links::CoverImageLinks;
use crate::http_server::common_responses::media::media_file_cover_image_details::MediaFileCoverImageDetails;
use crate::http_server::common_responses::media::media_file_cover_image_details::MediaFileDefaultCover;
use crate::http_server::common_responses::media::media_links::*;
use crate::http_server::common_responses::media::weights_cover_image_details::*;
use crate::http_server::common_responses::media_file_origin_details::*;
use crate::http_server::common_responses::media_file_social_meta_lite::MediaFileSocialMetaLight;
use crate::http_server::common_responses::media::media_links::*;
use crate::http_server::common_responses::pagination_cursors::PaginationCursors;
use crate::http_server::common_responses::pagination_page::PaginationPage;
use crate::http_server::common_responses::simple_entity_stats::SimpleEntityStats;
use crate::http_server::common_responses::simple_response::SimpleResponse;
use crate::http_server::common_responses::tag_info::TagInfo;
use crate::http_server::common_responses::user_details_lite::{UserDefaultAvatarInfo, UserDetailsLight};
use crate::http_server::endpoints::analytics::log_browser_session_handler::*;
use crate::http_server::endpoints::app_state::components::get_permissions::AppStateLegacyPermissionFlags;
@@ -119,6 +120,8 @@ use crate::http_server::endpoints::moderation::user_feature_flags::edit_user_fea
use crate::http_server::endpoints::prompts::get_prompt_handler::*;
use crate::http_server::endpoints::service::status_alert_handler::*;
use crate::http_server::endpoints::stats::get_unified_queue_stats_handler::*;
use crate::http_server::endpoints::tags::list_tags_for_entity_handler::*;
use crate::http_server::endpoints::tags::set_tags_for_entity_handler::*;
use crate::http_server::endpoints::tts::enqueue_infer_tts_handler::enqueue_infer_tts_handler::*;
use crate::http_server::endpoints::user_bookmarks::batch_get_user_bookmarks_handler::*;
use crate::http_server::endpoints::user_bookmarks::create_user_bookmark_handler::*;
@@ -128,15 +131,13 @@ use crate::http_server::endpoints::user_bookmarks::list_user_bookmarks_for_user_
use crate::http_server::endpoints::user_ratings::batch_get_user_rating_handler::*;
use crate::http_server::endpoints::user_ratings::get_user_rating_handler::*;
use crate::http_server::endpoints::user_ratings::set_user_rating_handler::*;
use crate::http_server::endpoints::tags::list_tags_for_entity_handler::*;
use crate::http_server::endpoints::tags::set_tags_for_entity_handler::*;
use crate::http_server::endpoints::users::create_account_handler::*;
use crate::http_server::endpoints::users::edit_username_handler::*;
use crate::http_server::endpoints::users::get_profile_handler::*;
use crate::http_server::endpoints::users::google_sso::google_sso_handler::*;
use crate::http_server::endpoints::users::login_handler::*;
use crate::http_server::endpoints::users::logout_handler::*;
use crate::http_server::endpoints::users::session_info_handler::*;
use crate::http_server::endpoints::users::edit_username_handler::*;
use crate::http_server::endpoints::users::google_sso::google_sso_handler::*;
use crate::http_server::endpoints::users::create_account_handler::*;
use crate::http_server::endpoints::users::session_token_info_handler::*;
use crate::http_server::endpoints::voice_conversion::enqueue_voice_conversion_inference_handler::*;
use crate::http_server::endpoints::voice_designer::inference::enqueue_tts_request::*;
@@ -311,6 +312,7 @@ use crate::http_server::web_utils::response_success_helpers::*;
SimpleEntityStats,
SimpleGenericJsonSuccess,
SimpleResponse,
TagInfo,
UserDetailsLight,
VideoPreviews,
Visibility,
@@ -5,5 +5,6 @@ pub mod pagination_cursors;
pub mod pagination_page;
pub mod simple_entity_stats;
pub mod simple_response;
pub mod tag_info;
pub mod user_avatars;
pub mod user_details_lite;
@@ -0,0 +1,8 @@
use tokens::tokens::tags::TagToken;
use utoipa::ToSchema;
#[derive(Serialize, ToSchema)]
pub struct TagInfo {
pub token: TagToken,
pub value: String,
}
@@ -6,6 +6,7 @@
use std::fmt;
use std::sync::Arc;
use crate::http_server::common_responses::tag_info::TagInfo;
use crate::http_server::endpoints::comments::list_comments_handler::ListCommentsPathInfo;
use crate::http_server::endpoints::media_files::edit::set_media_file_cover_image_handler::SetMediaFileCoverImageError;
use crate::http_server::endpoints::users::edit_username_handler::EditUsernameError;
@@ -54,7 +55,7 @@ pub struct ListTagsForEntityPathInfo {
#[derive(Serialize, ToSchema)]
pub struct ListTagsForEntitySuccessResponse {
pub success: bool,
pub tags: Vec<String>,
pub tags: Vec<TagInfo>,
}
#[derive(Debug, ToSchema)]
@@ -145,7 +146,10 @@ pub async fn list_tags_for_entity_handler(
success: true,
tags: tags
.into_iter()
.map(|tag| tag.tag_value)
.map(|tag| TagInfo {
token: tag.token,
value: tag.tag_value,
})
.collect(),
}))
}
@@ -6,6 +6,7 @@
use std::fmt;
use std::sync::Arc;
use crate::http_server::common_responses::tag_info::TagInfo;
use crate::http_server::endpoints::comments::list_comments_handler::ListCommentsPathInfo;
use crate::http_server::endpoints::media_files::edit::set_media_file_cover_image_handler::SetMediaFileCoverImageError;
use crate::http_server::endpoints::users::edit_username_handler::EditUsernameError;
@@ -43,6 +44,9 @@ use tokens::tokens::w2l_templates::W2lTemplateToken;
use user_input_common::check_for_slurs::contains_slurs;
use utoipa::ToSchema;
/// Maximum number of tags allowed per item.
const MAX_TAGS : usize = 30;
/// For the URL PathInfo
#[derive(Deserialize, ToSchema)]
pub struct SetTagsForEntityPathInfo {
@@ -59,7 +63,7 @@ pub struct SetTagsForEntityRequest {
#[derive(Serialize, ToSchema)]
pub struct SetTagsForEntitySuccessResponse {
pub success: bool,
pub tag_tokens: Vec<TagToken>,
pub tags: Vec<TagInfo>,
}
#[derive(Debug, ToSchema)]
@@ -171,6 +175,12 @@ pub async fn set_tags_for_entity_handler(
let matching_tags = select_matching_tags(&request_tags, Transactor::for_connection(&mut *mysql_connection))
.await
.map(|tags| tags.into_iter()
.map(|tag| TagInfo {
token: tag.token,
value: tag.tag_value.to_string(),
})
.collect::<Vec<TagInfo>>())
.map_err(|e| {
warn!("error selecting tags: {:?}", e);
SetTagsForEntityError::ServerError
@@ -178,7 +188,7 @@ pub async fn set_tags_for_entity_handler(
let matching_tag_values = matching_tags
.iter()
.map(|tag| tag.tag_value.to_string())
.map(|tag| tag.value.to_string())
.collect::<Vec<String>>();
let new_tag_values = request_tags.iter()
@@ -186,7 +196,7 @@ pub async fn set_tags_for_entity_handler(
.map(|tag| tag.as_str())
.collect::<Vec<&str>>();
let mut new_tag_tokens = Vec::new();
let mut new_tags = Vec::new();
// TODO(bt): Bulk insert instead of insert per tag.
@@ -197,24 +207,26 @@ pub async fn set_tags_for_entity_handler(
warn!("error creating tag: {:?}", e);
SetTagsForEntityError::ServerError
})?;
new_tag_tokens.push(token);
new_tags.push(TagInfo {
token,
value: new_tag_value.to_string(),
});
}
let existing_tag_tokens = matching_tags.iter()
.map(|tag| tag.token.clone())
.collect::<Vec<_>>();
let final_tag_set = matching_tags.into_iter()
.chain(new_tags.into_iter())
.collect::<Vec<TagInfo>>();
let final_tag_set = existing_tag_tokens.iter()
.chain(new_tag_tokens.iter())
.map(|token| token.clone())
.collect::<Vec<_>>();
let final_tag_tokens = final_tag_set.iter()
.map(|tag_info| tag_info.token.clone())
.collect::<Vec<TagToken>>();
let entity = TagUseEntity::from_entity_type_and_token(
path.entity_type, &path.entity_token);
update_tags_for_entity(
entity,
&final_tag_set,
&final_tag_tokens,
&mut mysql_connection)
.await
.map_err(|e| {
@@ -224,8 +236,7 @@ pub async fn set_tags_for_entity_handler(
Ok(Json(SetTagsForEntitySuccessResponse {
success: true,
tag_tokens: final_tag_set
,
tags: final_tag_set,
}))
}
@@ -277,8 +288,12 @@ async fn get_is_creator(
}
fn to_normalized_tags(tags: &str) -> Vec<String> {
tags.split(',')
let mut tags : Vec<String> = tags.split(',')
.map(|tag| tag.trim().to_lowercase())
.filter(|tag| !tag.is_empty())
.collect()
.collect();
tags.truncate(MAX_TAGS);
tags
}