From 3c1cba1fad65cba937cd7d6fc4fa618f2f4f9eb2 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sat, 30 Dec 2023 02:31:33 -0500 Subject: [PATCH] add creator details to user bookmarks (for weights, media files) --- .../user_bookmarks/list_user_bookmarks.rs | 13 +++++++ .../list_user_bookmarks_result.rs | 38 +++++++++++++++++++ .../list_user_bookmarks_for_user_handler.rs | 26 +++++++++++++ 3 files changed, 77 insertions(+) diff --git a/crates/lib/mysql_queries/src/queries/user_bookmarks/list_user_bookmarks.rs b/crates/lib/mysql_queries/src/queries/user_bookmarks/list_user_bookmarks.rs index 73bb02c805..5c4591371f 100644 --- a/crates/lib/mysql_queries/src/queries/user_bookmarks/list_user_bookmarks.rs +++ b/crates/lib/mysql_queries/src/queries/user_bookmarks/list_user_bookmarks.rs @@ -55,12 +55,20 @@ fn select_result_fields() -> &'static str { media_files.public_bucket_directory_hash as maybe_media_file_public_bucket_hash, media_files.maybe_public_bucket_prefix as maybe_media_file_public_bucket_prefix, media_files.maybe_public_bucket_extension as maybe_media_file_public_bucket_extension, + media_file_creator.token as maybe_media_file_creator_user_token, + media_file_creator.username as maybe_media_file_creator_username, + media_file_creator.display_name as maybe_media_file_creator_display_name, + media_file_creator.email_gravatar_hash as maybe_media_file_creator_gravatar_hash, model_weights.weights_type as maybe_model_weight_type, model_weights.weights_category as maybe_model_weight_category, media_file_cover_images.public_bucket_directory_hash as maybe_model_weight_cover_image_public_bucket_hash, media_file_cover_images.maybe_public_bucket_prefix as maybe_model_weight_cover_image_public_bucket_prefix, media_file_cover_images.maybe_public_bucket_extension as maybe_model_weight_cover_image_public_bucket_extension, + model_weight_creator.token as maybe_model_weight_creator_user_token, + model_weight_creator.username as maybe_model_weight_creator_username, + model_weight_creator.display_name as maybe_model_weight_creator_display_name, + model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash, model_weights.title as maybe_descriptive_text_model_weight_title, tts_models.title as maybe_descriptive_text_tts_model_title, @@ -98,8 +106,13 @@ JOIN users AS u LEFT OUTER JOIN model_weights ON model_weights.token = f.entity_token LEFT OUTER JOIN media_files AS media_file_cover_images ON model_weights.maybe_cover_image_media_file_token = media_file_cover_images.token +LEFT OUTER JOIN users as model_weight_creator + ON model_weights.creator_user_token = model_weight_creator.token LEFT OUTER JOIN media_files ON media_files.token = f.entity_token +LEFT OUTER JOIN users as media_file_creator + ON media_files.maybe_creator_user_token = media_file_creator.token + LEFT OUTER JOIN tts_models ON tts_models.token = f.entity_token LEFT OUTER JOIN tts_results ON tts_results.token = f.entity_token LEFT OUTER JOIN users ON users.token = f.entity_token diff --git a/crates/lib/mysql_queries/src/queries/user_bookmarks/list_user_bookmarks_result.rs b/crates/lib/mysql_queries/src/queries/user_bookmarks/list_user_bookmarks_result.rs index 8f41f42e7a..232862f550 100644 --- a/crates/lib/mysql_queries/src/queries/user_bookmarks/list_user_bookmarks_result.rs +++ b/crates/lib/mysql_queries/src/queries/user_bookmarks/list_user_bookmarks_result.rs @@ -22,6 +22,11 @@ pub struct UserBookmark { pub maybe_media_file_public_bucket_prefix: Option, pub maybe_media_file_public_bucket_extension: Option, + pub maybe_media_file_creator_user_token: Option, + pub maybe_media_file_creator_username: Option, + pub maybe_media_file_creator_display_name: Option, + pub maybe_media_file_creator_gravatar_hash: Option, + /// Something descriptive about the bookmarked entity. /// This might be TTS text, a username, etc. It depends on the entity type. pub maybe_entity_descriptive_text: Option, @@ -42,6 +47,12 @@ pub struct UserBookmark { /// Only set if the bookmark is of a media_files record *AND* the model has a cover image. pub maybe_model_weight_cover_image_public_bucket_extension: Option, + pub maybe_model_weight_creator_user_token: Option, + pub maybe_model_weight_creator_username: Option, + pub maybe_model_weight_creator_display_name: Option, + pub maybe_model_weight_creator_gravatar_hash: Option, + + // TODO(bt,2023-12-30): I don't think these user fields are necessary. pub user_token: UserToken, pub username: String, pub user_display_name: String, @@ -58,6 +69,7 @@ pub struct RawUserBookmarkRecord { pub (crate) entity_type: UserBookmarkEntityType, pub (crate) entity_token: String, + // TODO(bt,2023-12-30): I don't think these user fields are necessary. pub (crate) user_token: UserToken, pub (crate) username: String, pub (crate) user_display_name: String, @@ -73,6 +85,11 @@ pub struct RawUserBookmarkRecord { pub (crate) maybe_media_file_public_bucket_prefix: Option, pub (crate) maybe_media_file_public_bucket_extension: Option, + pub (crate) maybe_media_file_creator_user_token: Option, + pub (crate) maybe_media_file_creator_username: Option, + pub (crate) maybe_media_file_creator_display_name: Option, + pub (crate) maybe_media_file_creator_gravatar_hash: Option, + pub (crate) maybe_model_weight_type: Option, pub (crate) maybe_model_weight_category: Option, @@ -80,6 +97,11 @@ pub struct RawUserBookmarkRecord { pub (crate) maybe_model_weight_cover_image_public_bucket_prefix: Option, pub (crate) maybe_model_weight_cover_image_public_bucket_extension: Option, + pub (crate) maybe_model_weight_creator_user_token: Option, + pub (crate) maybe_model_weight_creator_username: Option, + pub (crate) maybe_model_weight_creator_display_name: Option, + pub (crate) maybe_model_weight_creator_gravatar_hash: Option, + pub (crate) maybe_descriptive_text_model_weight_title: Option, pub (crate) maybe_descriptive_text_tts_model_title: Option, pub (crate) maybe_descriptive_text_tts_result_inference_text: Option, @@ -98,6 +120,10 @@ impl RawUserBookmarkRecord { maybe_media_file_public_bucket_hash: self.maybe_media_file_public_bucket_hash, maybe_media_file_public_bucket_prefix: self.maybe_media_file_public_bucket_prefix, maybe_media_file_public_bucket_extension: self.maybe_media_file_public_bucket_extension, + maybe_media_file_creator_user_token: self.maybe_media_file_creator_user_token, + maybe_media_file_creator_username: self.maybe_media_file_creator_username, + maybe_media_file_creator_display_name: self.maybe_media_file_creator_display_name, + maybe_media_file_creator_gravatar_hash: self.maybe_media_file_creator_gravatar_hash, maybe_entity_descriptive_text: match self.entity_type { UserBookmarkEntityType::User => self.maybe_descriptive_text_user_display_name, UserBookmarkEntityType::ModelWeight => self.maybe_descriptive_text_model_weight_title, @@ -120,6 +146,10 @@ impl RawUserBookmarkRecord { maybe_model_weight_cover_image_public_bucket_hash: self.maybe_model_weight_cover_image_public_bucket_hash, maybe_model_weight_cover_image_public_bucket_prefix: self.maybe_model_weight_cover_image_public_bucket_prefix, maybe_model_weight_cover_image_public_bucket_extension: self.maybe_model_weight_cover_image_public_bucket_extension, + maybe_model_weight_creator_user_token: self.maybe_model_weight_creator_user_token, + maybe_model_weight_creator_username: self.maybe_model_weight_creator_username, + maybe_model_weight_creator_display_name: self.maybe_model_weight_creator_display_name, + maybe_model_weight_creator_gravatar_hash: self.maybe_model_weight_creator_gravatar_hash, user_token: self.user_token, username: self.username, user_display_name: self.user_display_name, @@ -149,11 +179,19 @@ impl FromRow<'_, MySqlRow> for RawUserBookmarkRecord { maybe_media_file_public_bucket_hash: row.try_get("maybe_media_file_public_bucket_hash")?, maybe_media_file_public_bucket_prefix: row.try_get("maybe_media_file_public_bucket_prefix")?, maybe_media_file_public_bucket_extension: row.try_get("maybe_media_file_public_bucket_extension")?, + maybe_media_file_creator_user_token: row.try_get("maybe_media_file_creator_user_token")?, + maybe_media_file_creator_username: row.try_get("maybe_media_file_creator_username")?, + maybe_media_file_creator_display_name: row.try_get("maybe_media_file_creator_display_name")?, + maybe_media_file_creator_gravatar_hash: row.try_get("maybe_media_file_creator_gravatar_hash")?, maybe_model_weight_type: WeightsType::try_from_mysql_row_nullable(row, "maybe_model_weight_type")?, maybe_model_weight_category: WeightsCategory::try_from_mysql_row_nullable(row, "maybe_model_weight_category")?, maybe_model_weight_cover_image_public_bucket_hash: row.try_get("maybe_model_weight_cover_image_public_bucket_hash")?, maybe_model_weight_cover_image_public_bucket_prefix: row.try_get("maybe_model_weight_cover_image_public_bucket_prefix")?, maybe_model_weight_cover_image_public_bucket_extension: row.try_get("maybe_model_weight_cover_image_public_bucket_extension")?, + maybe_model_weight_creator_user_token: row.try_get("maybe_model_weight_creator_user_token")?, + maybe_model_weight_creator_username: row.try_get("maybe_model_weight_creator_username")?, + maybe_model_weight_creator_display_name: row.try_get("maybe_model_weight_creator_display_name")?, + maybe_model_weight_creator_gravatar_hash: row.try_get("maybe_model_weight_creator_gravatar_hash")?, maybe_descriptive_text_model_weight_title: row.try_get("maybe_descriptive_text_model_weight_title")?, maybe_descriptive_text_tts_model_title: row.try_get("maybe_descriptive_text_tts_model_title")?, maybe_descriptive_text_tts_result_inference_text: row.try_get("maybe_descriptive_text_tts_result_inference_text")?, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/user_bookmarks/list_user_bookmarks_for_user_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/user_bookmarks/list_user_bookmarks_for_user_handler.rs index cb77766d72..ebdc72887e 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/user_bookmarks/list_user_bookmarks_for_user_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/user_bookmarks/list_user_bookmarks_for_user_handler.rs @@ -23,6 +23,7 @@ use mysql_queries::queries::user_bookmarks::list_user_bookmarks::{list_user_book use tokens::tokens::user_bookmarks::UserBookmarkToken; use crate::http_server::common_responses::pagination_page::PaginationPage; +use crate::http_server::common_responses::user_details_lite::UserDetailsLight; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; use crate::server_state::ServerState; @@ -98,6 +99,9 @@ pub struct MediaFileData { /// URL to the media file. pub public_bucket_path: String, + + /// Creator of the media file + pub maybe_creator: Option, } #[derive(Serialize, ToSchema)] @@ -109,6 +113,11 @@ pub struct WeightsData { /// Cover images are small descriptive images that can be set for any model. /// If a cover image is set, this is the path to the asset. pub maybe_cover_image_public_bucket_path: Option, + + /// Creator of the weight + /// NB: Technically this should not be optional, but since the join is + /// incredibly telescopic, we may as well make it optional for now. + pub maybe_creator: Option, } #[derive(Debug, ToSchema)] @@ -197,6 +206,7 @@ pub async fn list_user_bookmarks_for_user_handler( .get_full_object_path_str() .to_string() }); + let maybe_model_weight_cover_image = user_bookmark.maybe_model_weight_cover_image_public_bucket_hash .as_deref() .map(|hash| { @@ -208,6 +218,20 @@ pub async fn list_user_bookmarks_for_user_handler( .to_string() }); + let maybe_media_file_creator = UserDetailsLight::from_optional_db_fields( + user_bookmark.maybe_media_file_creator_user_token.as_ref(), + user_bookmark.maybe_media_file_creator_username.as_deref(), + user_bookmark.maybe_media_file_creator_display_name.as_deref(), + user_bookmark.maybe_media_file_creator_gravatar_hash.as_deref(), + ); + + let maybe_model_weight_creator = UserDetailsLight::from_optional_db_fields( + user_bookmark.maybe_model_weight_creator_user_token.as_ref(), + user_bookmark.maybe_model_weight_creator_username.as_deref(), + user_bookmark.maybe_model_weight_creator_display_name.as_deref(), + user_bookmark.maybe_model_weight_creator_gravatar_hash.as_deref(), + ); + UserBookmarkListItem { token: user_bookmark.token, details: UserBookmarkDetailsForUserList { @@ -219,6 +243,7 @@ pub async fn list_user_bookmarks_for_user_handler( // TODO(bt,2023-12-28): Proper default, optional, or "unknown" values would be better. media_type: user_bookmark.maybe_media_file_type.unwrap_or(MediaFileType::Image), public_bucket_path: path, + maybe_creator: maybe_media_file_creator, }), }, maybe_weight_data: match user_bookmark.entity_type { @@ -228,6 +253,7 @@ pub async fn list_user_bookmarks_for_user_handler( weight_type: user_bookmark.maybe_model_weight_type.unwrap_or(WeightsType::Tacotron2), weight_category: user_bookmark.maybe_model_weight_category.unwrap_or(WeightsCategory::TextToSpeech), maybe_cover_image_public_bucket_path: maybe_model_weight_cover_image, + maybe_creator: maybe_model_weight_creator, }), _ => None, },