add creator details to user bookmarks (for weights, media files)

This commit is contained in:
Brandon Thomas committed 2023-12-30 02:31:33 -05:00
1 parent 1bf58b01e1
commit 3c1cba1fad
3 files changed
+77

No files matched your search

@@ -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
@@ -22,6 +22,11 @@ pub struct UserBookmark {
pub maybe_media_file_public_bucket_prefix: Option<String>,
pub maybe_media_file_public_bucket_extension: Option<String>,
pub maybe_media_file_creator_user_token: Option<UserToken>,
pub maybe_media_file_creator_username: Option<String>,
pub maybe_media_file_creator_display_name: Option<String>,
pub maybe_media_file_creator_gravatar_hash: Option<String>,
/// 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<String>,
@@ -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<String>,
pub maybe_model_weight_creator_user_token: Option<UserToken>,
pub maybe_model_weight_creator_username: Option<String>,
pub maybe_model_weight_creator_display_name: Option<String>,
pub maybe_model_weight_creator_gravatar_hash: Option<String>,
// 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<String>,
pub (crate) maybe_media_file_public_bucket_extension: Option<String>,
pub (crate) maybe_media_file_creator_user_token: Option<UserToken>,
pub (crate) maybe_media_file_creator_username: Option<String>,
pub (crate) maybe_media_file_creator_display_name: Option<String>,
pub (crate) maybe_media_file_creator_gravatar_hash: Option<String>,
pub (crate) maybe_model_weight_type: Option<WeightsType>,
pub (crate) maybe_model_weight_category: Option<WeightsCategory>,
@@ -80,6 +97,11 @@ pub struct RawUserBookmarkRecord {
pub (crate) maybe_model_weight_cover_image_public_bucket_prefix: Option<String>,
pub (crate) maybe_model_weight_cover_image_public_bucket_extension: Option<String>,
pub (crate) maybe_model_weight_creator_user_token: Option<UserToken>,
pub (crate) maybe_model_weight_creator_username: Option<String>,
pub (crate) maybe_model_weight_creator_display_name: Option<String>,
pub (crate) maybe_model_weight_creator_gravatar_hash: Option<String>,
pub (crate) maybe_descriptive_text_model_weight_title: Option<String>,
pub (crate) maybe_descriptive_text_tts_model_title: Option<String>,
pub (crate) maybe_descriptive_text_tts_result_inference_text: Option<String>,
@@ -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")?,
@@ -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<UserDetailsLight>,
}
#[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<String>,
/// 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<UserDetailsLight>,
}
#[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,
},