diff --git a/.sqlx/query-7ab54466ca3021d90e0feb234acba56bf53d415dde69bc1c35120ed0c8dd1858.json b/.sqlx/query-066c16a04112b0ee83a54e29d5f96125f7c90db89ec9bd16275172d14722a381.json similarity index 85% rename from .sqlx/query-7ab54466ca3021d90e0feb234acba56bf53d415dde69bc1c35120ed0c8dd1858.json rename to .sqlx/query-066c16a04112b0ee83a54e29d5f96125f7c90db89ec9bd16275172d14722a381.json index 208c502b93..9c76122962 100644 --- a/.sqlx/query-7ab54466ca3021d90e0feb234acba56bf53d415dde69bc1c35120ed0c8dd1858.json +++ b/.sqlx/query-066c16a04112b0ee83a54e29d5f96125f7c90db89ec9bd16275172d14722a381.json @@ -1,6 +1,6 @@ { "db_name": "MySQL", - "query": "\nSELECT *\nFROM tts_model_upload_jobs\nWHERE\n (\n status IN (\"pending\", \"attempt_failed\")\n )\n AND\n (\n retry_at IS NULL\n OR\n retry_at < CURRENT_TIMESTAMP\n )\n LIMIT ?\n ", + "query": "\nSELECT\n id,\n token,\n uuid_idempotency_token,\n on_success_result_token,\n creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`,\n creator_ip_address,\n creator_set_visibility,\n title,\n tts_model_type,\n download_url,\n status,\n attempt_count,\n failure_reason,\n created_at,\n updated_at,\n retry_at\nFROM tts_model_upload_jobs\nWHERE\n (\n status IN (\"pending\", \"attempt_failed\")\n )\n AND\n (\n retry_at IS NULL\n OR\n retry_at < CURRENT_TIMESTAMP\n )\n LIMIT ?\n ", "describe": { "columns": [ { @@ -45,37 +45,7 @@ }, { "ordinal": 4, - "name": "title", - "type_info": { - "type": "VarString", - "flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE", - "char_set": 224, - "max_size": 1020 - } - }, - { - "ordinal": 5, - "name": "tts_model_type", - "type_info": { - "type": "String", - "flags": "NOT_NULL | BINARY | ENUM", - "char_set": 224, - "max_size": 60 - } - }, - { - "ordinal": 6, - "name": "download_url", - "type_info": { - "type": "VarString", - "flags": "BINARY", - "char_set": 224, - "max_size": 2048 - } - }, - { - "ordinal": 7, - "name": "creator_user_token", + "name": "creator_user_token: tokens::tokens::users::UserToken", "type_info": { "type": "VarString", "flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE", @@ -84,7 +54,7 @@ } }, { - "ordinal": 8, + "ordinal": 5, "name": "creator_ip_address", "type_info": { "type": "VarString", @@ -94,7 +64,7 @@ } }, { - "ordinal": 9, + "ordinal": 6, "name": "creator_set_visibility", "type_info": { "type": "String", @@ -103,6 +73,36 @@ "max_size": 28 } }, + { + "ordinal": 7, + "name": "title", + "type_info": { + "type": "VarString", + "flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE", + "char_set": 224, + "max_size": 1020 + } + }, + { + "ordinal": 8, + "name": "tts_model_type", + "type_info": { + "type": "String", + "flags": "NOT_NULL | BINARY | ENUM", + "char_set": 224, + "max_size": 60 + } + }, + { + "ordinal": 9, + "name": "download_url", + "type_info": { + "type": "VarString", + "flags": "BINARY", + "char_set": 224, + "max_size": 2048 + } + }, { "ordinal": 10, "name": "status", @@ -174,17 +174,17 @@ true, false, false, + false, + false, + false, true, false, false, - false, - false, - false, true, false, false, true ] }, - "hash": "7ab54466ca3021d90e0feb234acba56bf53d415dde69bc1c35120ed0c8dd1858" + "hash": "066c16a04112b0ee83a54e29d5f96125f7c90db89ec9bd16275172d14722a381" } diff --git a/.sqlx/query-c7b4fecd829bddaeff77a6ce2240e2b939c5faac4a94da56aefd2a27eb9ed64a.json b/.sqlx/query-1246d346e63efa99516ab4efa2aec90e37322184237d94782f77cf7a7a14d53f.json similarity index 82% rename from .sqlx/query-c7b4fecd829bddaeff77a6ce2240e2b939c5faac4a94da56aefd2a27eb9ed64a.json rename to .sqlx/query-1246d346e63efa99516ab4efa2aec90e37322184237d94782f77cf7a7a14d53f.json index 9c136a9178..b88f7d15dc 100644 --- a/.sqlx/query-c7b4fecd829bddaeff77a6ce2240e2b939c5faac4a94da56aefd2a27eb9ed64a.json +++ b/.sqlx/query-1246d346e63efa99516ab4efa2aec90e37322184237d94782f77cf7a7a14d53f.json @@ -1,6 +1,6 @@ { "db_name": "MySQL", - "query": "\nSELECT\n tts_results.token as tts_result_token,\n\n tts_results.raw_inference_text,\n\n tts_results.model_token as tts_model_token,\n tts_models.title as tts_model_title,\n\n tts_results.maybe_pretrained_vocoder_used,\n\n users.token as maybe_creator_user_token,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n users.is_banned as maybe_creator_is_banned,\n\n model_users.token as maybe_model_creator_user_token,\n model_users.username as maybe_model_creator_username,\n model_users.display_name as maybe_model_creator_display_name,\n model_users.email_gravatar_hash as maybe_model_creator_gravatar_hash,\n model_users.is_banned as maybe_model_creator_is_banned,\n\n tts_results.public_bucket_wav_audio_path,\n tts_results.public_bucket_spectrogram_path,\n\n tts_results.creator_set_visibility,\n\n tts_results.generated_by_worker,\n tts_results.is_debug_request,\n\n tts_results.file_size_bytes,\n tts_results.duration_millis,\n tts_results.created_at,\n tts_results.updated_at,\n\n tts_results.creator_ip_address,\n tts_results.user_deleted_at,\n tts_results.mod_deleted_at\n\nFROM tts_results\nLEFT OUTER JOIN tts_models\n ON tts_results.model_token = tts_models.token\nLEFT OUTER JOIN users\n ON tts_results.maybe_creator_user_token = users.token\nLEFT OUTER JOIN users as model_users\n ON tts_models.creator_user_token = model_users.token\nWHERE\n tts_results.token = ?\n ", + "query": "\nSELECT\n tts_results.token as tts_result_token,\n\n tts_results.raw_inference_text,\n\n tts_results.model_token as tts_model_token,\n tts_models.title as tts_model_title,\n\n tts_results.maybe_pretrained_vocoder_used,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n users.is_banned as maybe_creator_is_banned,\n\n model_users.token as maybe_model_creator_user_token,\n model_users.username as maybe_model_creator_username,\n model_users.display_name as maybe_model_creator_display_name,\n model_users.email_gravatar_hash as maybe_model_creator_gravatar_hash,\n model_users.is_banned as maybe_model_creator_is_banned,\n\n tts_results.public_bucket_wav_audio_path,\n tts_results.public_bucket_spectrogram_path,\n\n tts_results.creator_set_visibility,\n\n tts_results.generated_by_worker,\n tts_results.is_debug_request,\n\n tts_results.file_size_bytes,\n tts_results.duration_millis,\n tts_results.created_at,\n tts_results.updated_at,\n\n tts_results.creator_ip_address,\n tts_results.user_deleted_at,\n tts_results.mod_deleted_at\n\nFROM tts_results\nLEFT OUTER JOIN tts_models\n ON tts_results.model_token = tts_models.token\nLEFT OUTER JOIN users\n ON tts_results.maybe_creator_user_token = users.token\nLEFT OUTER JOIN users as model_users\n ON tts_models.creator_user_token = model_users.token\nWHERE\n tts_results.token = ?\n ", "describe": { "columns": [ { @@ -55,7 +55,7 @@ }, { "ordinal": 5, - "name": "maybe_creator_user_token", + "name": "maybe_creator_user_token: tokens::tokens::users::UserToken", "type_info": { "type": "VarString", "flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE", @@ -307,5 +307,5 @@ true ] }, - "hash": "c7b4fecd829bddaeff77a6ce2240e2b939c5faac4a94da56aefd2a27eb9ed64a" + "hash": "1246d346e63efa99516ab4efa2aec90e37322184237d94782f77cf7a7a14d53f" } diff --git a/.sqlx/query-a3818a8688e1adab95f9f1263fbbd7effd5b77348b4e19cdba02672602b91d98.json b/.sqlx/query-386edf6842d78c963b0ab35a25b8d00f65abb529e2a5e4c206895ac9a807085a.json similarity index 81% rename from .sqlx/query-a3818a8688e1adab95f9f1263fbbd7effd5b77348b4e19cdba02672602b91d98.json rename to .sqlx/query-386edf6842d78c963b0ab35a25b8d00f65abb529e2a5e4c206895ac9a807085a.json index 746b0044f3..43458ae19b 100644 --- a/.sqlx/query-a3818a8688e1adab95f9f1263fbbd7effd5b77348b4e19cdba02672602b91d98.json +++ b/.sqlx/query-386edf6842d78c963b0ab35a25b8d00f65abb529e2a5e4c206895ac9a807085a.json @@ -1,6 +1,6 @@ { "db_name": "MySQL", - "query": "\nSELECT\n tts_results.token as tts_result_token,\n\n tts_results.raw_inference_text,\n\n tts_results.model_token as tts_model_token,\n tts_models.title as tts_model_title,\n\n tts_results.maybe_pretrained_vocoder_used,\n\n users.token as maybe_creator_user_token,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n users.is_banned as maybe_creator_is_banned,\n\n model_users.token as maybe_model_creator_user_token,\n model_users.username as maybe_model_creator_username,\n model_users.display_name as maybe_model_creator_display_name,\n model_users.email_gravatar_hash as maybe_model_creator_gravatar_hash,\n model_users.is_banned as maybe_model_creator_is_banned,\n\n tts_results.public_bucket_wav_audio_path,\n tts_results.public_bucket_spectrogram_path,\n\n tts_results.creator_set_visibility,\n\n tts_results.generated_by_worker,\n tts_results.is_debug_request,\n\n tts_results.file_size_bytes,\n tts_results.duration_millis,\n tts_results.created_at,\n tts_results.updated_at,\n\n tts_results.creator_ip_address,\n tts_results.user_deleted_at,\n tts_results.mod_deleted_at\n\nFROM tts_results\nLEFT OUTER JOIN tts_models\n ON tts_results.model_token = tts_models.token\nLEFT OUTER JOIN users\n ON tts_results.maybe_creator_user_token = users.token\nLEFT OUTER JOIN users as model_users\n ON tts_models.creator_user_token = model_users.token\nWHERE\n tts_results.token = ?\n AND tts_results.user_deleted_at IS NULL\n AND tts_results.mod_deleted_at IS NULL\n ", + "query": "\nSELECT\n tts_results.token as tts_result_token,\n\n tts_results.raw_inference_text,\n\n tts_results.model_token as tts_model_token,\n tts_models.title as tts_model_title,\n\n tts_results.maybe_pretrained_vocoder_used,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n users.is_banned as maybe_creator_is_banned,\n\n model_users.token as maybe_model_creator_user_token,\n model_users.username as maybe_model_creator_username,\n model_users.display_name as maybe_model_creator_display_name,\n model_users.email_gravatar_hash as maybe_model_creator_gravatar_hash,\n model_users.is_banned as maybe_model_creator_is_banned,\n\n tts_results.public_bucket_wav_audio_path,\n tts_results.public_bucket_spectrogram_path,\n\n tts_results.creator_set_visibility,\n\n tts_results.generated_by_worker,\n tts_results.is_debug_request,\n\n tts_results.file_size_bytes,\n tts_results.duration_millis,\n tts_results.created_at,\n tts_results.updated_at,\n\n tts_results.creator_ip_address,\n tts_results.user_deleted_at,\n tts_results.mod_deleted_at\n\nFROM tts_results\nLEFT OUTER JOIN tts_models\n ON tts_results.model_token = tts_models.token\nLEFT OUTER JOIN users\n ON tts_results.maybe_creator_user_token = users.token\nLEFT OUTER JOIN users as model_users\n ON tts_models.creator_user_token = model_users.token\nWHERE\n tts_results.token = ?\n AND tts_results.user_deleted_at IS NULL\n AND tts_results.mod_deleted_at IS NULL\n ", "describe": { "columns": [ { @@ -55,7 +55,7 @@ }, { "ordinal": 5, - "name": "maybe_creator_user_token", + "name": "maybe_creator_user_token: tokens::tokens::users::UserToken", "type_info": { "type": "VarString", "flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE", @@ -307,5 +307,5 @@ true ] }, - "hash": "a3818a8688e1adab95f9f1263fbbd7effd5b77348b4e19cdba02672602b91d98" + "hash": "386edf6842d78c963b0ab35a25b8d00f65abb529e2a5e4c206895ac9a807085a" } diff --git a/crates/cli/dev_database_seed/src/seeding/voice_conversion.rs b/crates/cli/dev_database_seed/src/seeding/voice_conversion.rs index fcbceecd22..13ff2f72a3 100644 --- a/crates/cli/dev_database_seed/src/seeding/voice_conversion.rs +++ b/crates/cli/dev_database_seed/src/seeding/voice_conversion.rs @@ -48,7 +48,7 @@ async fn create_rvc_model( original_download_url: "https://example.com", original_filename: "unknown.zip", file_size_bytes: 1234, - creator_user_token: creator_user_token.as_str(), + creator_user_token, creator_ip_address: "127.0.0.1", creator_set_visibility: Default::default(), has_index_file, diff --git a/crates/lib/mysql_queries/src/mediators/badge_granter.rs b/crates/lib/mysql_queries/src/mediators/badge_granter.rs index ec85cce537..f288a84d2f 100644 --- a/crates/lib/mysql_queries/src/mediators/badge_granter.rs +++ b/crates/lib/mysql_queries/src/mediators/badge_granter.rs @@ -85,7 +85,7 @@ impl BadgeGranter { } /// This needs to be called *after* successful upload. - pub async fn maybe_grant_voice_conversion_model_uploads_badge(&self, user_token: &str) -> AnyhowResult<()> { + pub async fn maybe_grant_voice_conversion_model_uploads_badge(&self, user_token: &UserToken) -> AnyhowResult<()> { let count = self.count_voice_conversion_models_uploaded(user_token).await?; let mut maybe_badge = None; @@ -119,16 +119,16 @@ impl BadgeGranter { None => return Ok(()), }; - if self.has_badge(user_token, badge).await? { + if self.has_badge(user_token.as_str(), badge).await? { return Ok(()) } let _record_id = self.insert( badge, - user_token, + user_token.as_str(), ).await?; - self.firehose_publisher.publish_user_badge_granted(user_token, badge.to_db_value()) + self.firehose_publisher.publish_user_badge_granted(user_token.as_str(), badge.to_db_value()) .await?; Ok(()) @@ -184,8 +184,8 @@ impl BadgeGranter { } /// This needs to be called *after* successful upload. - pub async fn maybe_grant_vocoder_model_uploads_badge(&self, user_token: &str) -> AnyhowResult<()> { - let count = self.count_vocoder_models_uploaded(user_token).await?; + pub async fn maybe_grant_vocoder_model_uploads_badge(&self, user_token: &UserToken) -> AnyhowResult<()> { + let count = self.count_vocoder_models_uploaded(user_token.as_str()).await?; let mut maybe_badge = None; @@ -218,24 +218,24 @@ impl BadgeGranter { None => return Ok(()), }; - if self.has_badge(user_token, badge).await? { + if self.has_badge(user_token.as_str(), badge).await? { return Ok(()) } let _record_id = self.insert( badge, - user_token, + user_token.as_str(), ).await?; - self.firehose_publisher.publish_user_badge_granted(user_token, badge.to_db_value()) + self.firehose_publisher.publish_user_badge_granted(user_token.as_str(), badge.to_db_value()) .await?; Ok(()) } /// This needs to be called *after* successful upload. - pub async fn maybe_grant_softvc_vocoder_model_uploads_badge(&self, user_token: &str) -> AnyhowResult<()> { - let count = self.count_softvc_vocoder_models_uploaded(user_token).await?; + pub async fn maybe_grant_softvc_vocoder_model_uploads_badge(&self, user_token: &UserToken) -> AnyhowResult<()> { + let count = self.count_softvc_vocoder_models_uploaded(user_token.as_str()).await?; let mut maybe_badge = None; @@ -268,16 +268,16 @@ impl BadgeGranter { None => return Ok(()), }; - if self.has_badge(user_token, badge).await? { + if self.has_badge(user_token.as_str(), badge).await? { return Ok(()) } let _record_id = self.insert( badge, - user_token, + user_token.as_str(), ).await?; - self.firehose_publisher.publish_user_badge_granted(user_token, badge.to_db_value()) + self.firehose_publisher.publish_user_badge_granted(user_token.as_str(), badge.to_db_value()) .await?; Ok(()) @@ -345,7 +345,7 @@ LIMIT 1 async fn count_voice_conversion_models_uploaded( &self, - user_token: &str, + user_token: &UserToken, ) -> AnyhowResult { // NB: This could get expensive! let maybe_result = sqlx::query_as!( diff --git a/crates/lib/mysql_queries/src/mediators/firehose_publisher.rs b/crates/lib/mysql_queries/src/mediators/firehose_publisher.rs index 429a6b35ee..8d70586bd0 100644 --- a/crates/lib/mysql_queries/src/mediators/firehose_publisher.rs +++ b/crates/lib/mysql_queries/src/mediators/firehose_publisher.rs @@ -125,10 +125,10 @@ impl FirehosePublisher { Ok(()) } - pub async fn publish_tts_model_upload_finished(&self, user_token: &str, model_token: &str) -> AnyhowResult<()> { + pub async fn publish_tts_model_upload_finished(&self, user_token: &UserToken, model_token: &str) -> AnyhowResult<()> { let _record_id = self.insert( FirehoseEvent::TtsModelUploadCompleted, - Some(user_token), + Some(user_token.as_str()), Some(model_token), Some(model_token) ).await?; @@ -258,10 +258,10 @@ impl FirehosePublisher { } // NB: Entity token is optional. - pub async fn publish_generic_download_finished(&self, user_token: &str, entity_token: Option<&str>) -> AnyhowResult<()> { + pub async fn publish_generic_download_finished(&self, user_token: &UserToken, entity_token: Option<&str>) -> AnyhowResult<()> { let _record_id = self.insert( FirehoseEvent::GenericDownloadCompleted, - Some(user_token), + Some(user_token.as_str()), entity_token, entity_token, ).await?; diff --git a/crates/lib/mysql_queries/src/queries/tts/tts_download_jobs/tts_download_job_queries.rs b/crates/lib/mysql_queries/src/queries/tts/tts_download_jobs/tts_download_job_queries.rs index 7fc5feec64..490493cf27 100644 --- a/crates/lib/mysql_queries/src/queries/tts/tts_download_jobs/tts_download_job_queries.rs +++ b/crates/lib/mysql_queries/src/queries/tts/tts_download_jobs/tts_download_job_queries.rs @@ -6,6 +6,7 @@ use sqlx::MySqlPool; use errors::AnyhowResult; use tokens::tokens::tts_models::TtsModelToken; +use tokens::tokens::users::UserToken; /// table: tts_model_upload_jobs #[derive(Debug)] @@ -14,7 +15,7 @@ pub struct TtsUploadJobRecord { pub token: String, pub uuid_idempotency_token: String, pub on_success_result_token: Option, - pub creator_user_token: String, + pub creator_user_token: UserToken, pub creator_ip_address: String, pub creator_set_visibility: String, // TODO pub title: String, @@ -34,7 +35,23 @@ pub async fn query_tts_upload_job_records(pool: &MySqlPool, num_records: u32) let job_records = sqlx::query_as!( TtsUploadJobRecord, r#" -SELECT * +SELECT + id, + token, + uuid_idempotency_token, + on_success_result_token, + creator_user_token as `creator_user_token: tokens::tokens::users::UserToken`, + creator_ip_address, + creator_set_visibility, + title, + tts_model_type, + download_url, + status, + attempt_count, + failure_reason, + created_at, + updated_at, + retry_at FROM tts_model_upload_jobs WHERE ( @@ -229,7 +246,7 @@ SET "#, &model_token, job.title.to_string(), - job.creator_user_token.clone(), + job.creator_user_token.as_str(), job.creator_ip_address.clone(), job.creator_ip_address.clone(), job.download_url.clone(), diff --git a/crates/lib/mysql_queries/src/queries/vocoder/insert_vocoder_model.rs b/crates/lib/mysql_queries/src/queries/vocoder/insert_vocoder_model.rs index 18ea02426c..6b8231628d 100644 --- a/crates/lib/mysql_queries/src/queries/vocoder/insert_vocoder_model.rs +++ b/crates/lib/mysql_queries/src/queries/vocoder/insert_vocoder_model.rs @@ -11,6 +11,7 @@ use sqlx::MySqlPool; use enums::common::visibility::Visibility; use enums::common::vocoder_type::VocoderType; use errors::AnyhowResult; +use tokens::tokens::users::UserToken; use tokens::tokens::vocoder_models::VocoderModelToken; pub struct Args<'a, P: AsRef> { @@ -22,7 +23,7 @@ pub struct Args<'a, P: AsRef> { pub original_filename: &'a str, pub file_size_bytes: u64, - pub creator_user_token: &'a str, + pub creator_user_token: &'a UserToken, pub creator_ip_address: &'a str, pub creator_set_visibility: Visibility, diff --git a/crates/lib/mysql_queries/src/queries/voice_conversion/models/insert_voice_conversion_model_from_download_job.rs b/crates/lib/mysql_queries/src/queries/voice_conversion/models/insert_voice_conversion_model_from_download_job.rs index 3f1f1c1bbc..df199c754a 100644 --- a/crates/lib/mysql_queries/src/queries/voice_conversion/models/insert_voice_conversion_model_from_download_job.rs +++ b/crates/lib/mysql_queries/src/queries/voice_conversion/models/insert_voice_conversion_model_from_download_job.rs @@ -6,6 +6,7 @@ use sqlx::MySqlPool; use enums::by_table::voice_conversion_models::voice_conversion_model_type::VoiceConversionModelType; use enums::common::visibility::Visibility; use errors::AnyhowResult; +use tokens::tokens::users::UserToken; use tokens::tokens::voice_conversion_models::VoiceConversionModelToken; pub struct InsertVoiceConversionModelArgs<'a, P: AsRef> { @@ -17,7 +18,7 @@ pub struct InsertVoiceConversionModelArgs<'a, P: AsRef> { pub original_filename: &'a str, pub file_size_bytes: u64, - pub creator_user_token: &'a str, + pub creator_user_token: &'a UserToken, pub creator_ip_address: &'a str, pub creator_set_visibility: Visibility,