From 9b4ffa79862ddad5d0b2586b596d3fac9388099d Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Thu, 12 Mar 2026 21:34:31 -0400 Subject: [PATCH] long lived url tech debt hurting local dev (#1139) kill some local dev tech debt on url construction --- .../media/cover_image_links.rs | 29 ++- .../media/cover_image_links_builder.rs | 29 ++- .../media/media_file_cover_image_details.rs | 166 ++++++++++++++++-- .../media_file_cover_image_details_builder.rs | 26 +-- .../media/weights_cover_image_details.rs | 18 +- .../get/batch_get_media_files_handler.rs | 3 +- .../media_files/get/get_media_file_handler.rs | 7 +- ...tch_generated_redux_media_files_handler.rs | 2 +- .../list/list_featured_media_files_handler.rs | 3 +- ...list_media_files_by_batch_token_handler.rs | 2 +- .../list/list_media_files_for_user_handler.rs | 3 +- .../list/list_media_files_handler.rs | 3 +- .../list/list_pinned_media_files_handler.rs | 3 +- .../search_featured_media_files_handler.rs | 3 +- .../search_session_media_files_handler.rs | 3 +- .../list_user_bookmarks_for_user_handler.rs | 2 + .../weights/get/get_weight_handler.rs | 1 + .../list/list_available_weights_handler.rs | 1 + .../list/list_featured_weights_handler.rs | 1 + .../list/list_pinned_weights_handler.rs | 1 + .../list/list_weights_by_user_handler.rs | 1 + .../search/search_model_weights_impl.rs | 1 + .../bucket_urls/bucket_url_from_media_path.rs | 25 ++- .../bucket_urls/bucket_url_from_str_path.rs | 23 ++- .../bucket_url_string_from_media_path.rs | 25 ++- 25 files changed, 304 insertions(+), 77 deletions(-) diff --git a/crates/service/web/storyteller_web/src/http_server/common_responses/media/cover_image_links.rs b/crates/service/web/storyteller_web/src/http_server/common_responses/media/cover_image_links.rs index 7d4e3ff6b1..0d5fa18c77 100644 --- a/crates/service/web/storyteller_web/src/http_server/common_responses/media/cover_image_links.rs +++ b/crates/service/web/storyteller_web/src/http_server/common_responses/media/cover_image_links.rs @@ -1,5 +1,7 @@ +use crate::http_server::common_responses::media::cdn_link; use crate::http_server::common_responses::media::media_domain::MediaDomain; use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; +use server_environment::ServerEnvironment; use url::Url; use utoipa::ToSchema; @@ -24,24 +26,27 @@ impl CoverImageLinks { pub fn from_media_path( domain: MediaDomain, + server_environment: ServerEnvironment, bucket_path: &MediaFileBucketPath, ) -> Option { let rooted_path = bucket_path.get_full_object_path_str(); - Self::from_rooted_path(domain, rooted_path) + Self::from_rooted_path(domain, server_environment, rooted_path) } pub fn from_maybe_media_path( domain: MediaDomain, + server_environment: ServerEnvironment, bucket_path: Option<&MediaFileBucketPath>, ) -> Option { match bucket_path { None => None, - Some(bucket_path) => Self::from_media_path(domain, bucket_path), + Some(bucket_path) => Self::from_media_path(domain, server_environment, bucket_path), } } pub fn from_parts( domain: MediaDomain, + server_environment: ServerEnvironment, maybe_cover_image_public_bucket_path: Option<&str>, maybe_cover_image_public_bucket_prefix: Option<&str>, maybe_cover_image_public_bucket_extension: Option<&str>, @@ -55,11 +60,12 @@ impl CoverImageLinks { maybe_cover_image_public_bucket_prefix, maybe_cover_image_public_bucket_extension ); - Self::from_media_path(domain, &bucket_path) + Self::from_media_path(domain, server_environment, &bucket_path) } pub fn from_rooted_path( domain: MediaDomain, + server_environment: ServerEnvironment, rooted_path: &str, ) -> Option { if !rooted_path.ends_with(".jpg") @@ -68,17 +74,24 @@ impl CoverImageLinks { return None; } - let mut cdn_url = domain.new_cdn_url(); + let mut cdn_url = cdn_link::new_cdn_url(domain, server_environment); cdn_url.set_path(rooted_path); Some(Self { cdn_url, - thumbnail_template: thumbnail_template(domain, rooted_path), + thumbnail_template: thumbnail_template(domain, server_environment, rooted_path), }) } } -fn thumbnail_template(media_domain: MediaDomain, rooted_path: &str) -> String { - let host = media_domain.cdn_url_str(); - format!("{host}/cdn-cgi/image/width={{WIDTH}},quality={QUALITY}{rooted_path}") +fn thumbnail_template(media_domain: MediaDomain, server_environment: ServerEnvironment, rooted_path: &str) -> String { + let host = cdn_link::get_cdn_host(media_domain, server_environment); + match server_environment { + ServerEnvironment::Production => { + format!("{host}/cdn-cgi/image/width={{WIDTH}},quality={QUALITY}{rooted_path}") + } + ServerEnvironment::Development => { + format!("{host}{rooted_path}") + } + } } diff --git a/crates/service/web/storyteller_web/src/http_server/common_responses/media/cover_image_links_builder.rs b/crates/service/web/storyteller_web/src/http_server/common_responses/media/cover_image_links_builder.rs index 2ad7615f06..ca1ab8da4f 100644 --- a/crates/service/web/storyteller_web/src/http_server/common_responses/media/cover_image_links_builder.rs +++ b/crates/service/web/storyteller_web/src/http_server/common_responses/media/cover_image_links_builder.rs @@ -1,6 +1,8 @@ +use crate::http_server::common_responses::media::cdn_link; use crate::http_server::common_responses::media::media_domain::MediaDomain; use artcraft_api_defs::common::responses::cover_image_links::CoverImageLinks; use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; +use server_environment::ServerEnvironment; // TODO(bt,2024-09-18): Consolidate thumbnail builder code and vars // TODO(bt,2024-09-05): Worth reducing the quality at all? @@ -12,24 +14,27 @@ impl CoverImageLinksBuilder { pub fn from_media_path( domain: MediaDomain, + server_environment: ServerEnvironment, bucket_path: &MediaFileBucketPath, ) -> Option { let rooted_path = bucket_path.get_full_object_path_str(); - Self::from_rooted_path(domain, rooted_path) + Self::from_rooted_path(domain, server_environment, rooted_path) } pub fn from_maybe_media_path( domain: MediaDomain, + server_environment: ServerEnvironment, bucket_path: Option<&MediaFileBucketPath>, ) -> Option { match bucket_path { None => None, - Some(bucket_path) => Self::from_media_path(domain, bucket_path), + Some(bucket_path) => Self::from_media_path(domain, server_environment, bucket_path), } } pub fn from_parts( domain: MediaDomain, + server_environment: ServerEnvironment, maybe_cover_image_public_bucket_path: Option<&str>, maybe_cover_image_public_bucket_prefix: Option<&str>, maybe_cover_image_public_bucket_extension: Option<&str>, @@ -43,11 +48,12 @@ impl CoverImageLinksBuilder { maybe_cover_image_public_bucket_prefix, maybe_cover_image_public_bucket_extension ); - Self::from_media_path(domain, &bucket_path) + Self::from_media_path(domain, server_environment, &bucket_path) } pub fn from_rooted_path( domain: MediaDomain, + server_environment: ServerEnvironment, rooted_path: &str, ) -> Option { if !rooted_path.ends_with(".jpg") @@ -56,17 +62,24 @@ impl CoverImageLinksBuilder { return None; } - let mut cdn_url = domain.new_cdn_url(); + let mut cdn_url = cdn_link::new_cdn_url(domain, server_environment); cdn_url.set_path(rooted_path); Some(CoverImageLinks { cdn_url, - thumbnail_template: thumbnail_template(domain, rooted_path), + thumbnail_template: thumbnail_template(domain, server_environment, rooted_path), }) } } -fn thumbnail_template(media_domain: MediaDomain, rooted_path: &str) -> String { - let host = media_domain.cdn_url_str(); - format!("{host}/cdn-cgi/image/width={{WIDTH}},quality={QUALITY}{rooted_path}") +fn thumbnail_template(media_domain: MediaDomain, server_environment: ServerEnvironment, rooted_path: &str) -> String { + let host = cdn_link::get_cdn_host(media_domain, server_environment); + match server_environment { + ServerEnvironment::Production => { + format!("{host}/cdn-cgi/image/width={{WIDTH}},quality={QUALITY}{rooted_path}") + } + ServerEnvironment::Development => { + format!("{host}{rooted_path}") + } + } } diff --git a/crates/service/web/storyteller_web/src/http_server/common_responses/media/media_file_cover_image_details.rs b/crates/service/web/storyteller_web/src/http_server/common_responses/media/media_file_cover_image_details.rs index 40320a03bb..d8b153ded9 100644 --- a/crates/service/web/storyteller_web/src/http_server/common_responses/media/media_file_cover_image_details.rs +++ b/crates/service/web/storyteller_web/src/http_server/common_responses/media/media_file_cover_image_details.rs @@ -3,10 +3,11 @@ use std::hash::{Hash, Hasher}; use url::Url; use utoipa::ToSchema; +use crate::http_server::common_responses::media::cdn_link; use crate::http_server::common_responses::media::cover_image_links::CoverImageLinks; use crate::http_server::common_responses::media::media_domain::MediaDomain; -use crate::http_server::web_utils::bucket_urls::bucket_url_from_media_path::bucket_url_from_media_path; use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; +use server_environment::ServerEnvironment; use tokens::tokens::media_files::MediaFileToken; /// There are currently 25 cover images numbered 0 to 24 (0-indexed). @@ -62,7 +63,11 @@ impl MediaFileCoverImageDetails { } /// For non-media file tokens (eg. emulated TTS results) - pub fn from_token_str(token: &str) -> Self { + pub fn from_legacy_token_str(token: &str) -> Self { + Self::from_token_str(token) + } + + fn from_token_str(token: &str) -> Self { Self { // TODO(bt,2024-04-07): Add column to schema to support + CRUD to add. maybe_cover_image_public_bucket_path: None, @@ -76,6 +81,7 @@ impl MediaFileCoverImageDetails { pub fn from_optional_db_fields( token: &MediaFileToken, domain: MediaDomain, + server_environment: ServerEnvironment, maybe_cover_image_public_bucket_path: Option<&str>, maybe_cover_image_public_bucket_prefix: Option<&str>, maybe_cover_image_public_bucket_extension: Option<&str>, @@ -83,15 +89,17 @@ impl MediaFileCoverImageDetails { Self::from_optional_db_str_fields( token.as_str(), domain, + server_environment, maybe_cover_image_public_bucket_path, maybe_cover_image_public_bucket_prefix, maybe_cover_image_public_bucket_extension ) } - pub fn from_optional_db_str_fields( + fn from_optional_db_str_fields( token: &str, domain: MediaDomain, + server_environment: ServerEnvironment, maybe_cover_image_public_bucket_path: Option<&str>, maybe_cover_image_public_bucket_prefix: Option<&str>, maybe_cover_image_public_bucket_extension: Option<&str>, @@ -112,19 +120,19 @@ impl MediaFileCoverImageDetails { // NB: Fail construction open. let maybe_cover_image_public_bucket_url = maybe_bucket_path .as_ref() - .map(|bucket_path| bucket_url_from_media_path(bucket_path).ok()) - .flatten(); + .and_then(|bucket_path| { + let rooted_path = bucket_path.get_full_object_path_str(); + let mut url = cdn_link::new_cdn_url(domain, server_environment); + url.set_path(rooted_path); + Some(url) + }); let maybe_links = CoverImageLinks::from_maybe_media_path( - domain, maybe_bucket_path.as_ref()); - - // let maybe_media_links = maybe_bucket_path - // .map(|path| MediaLinks::from_media_path(domain, &path)); + domain, server_environment, maybe_bucket_path.as_ref()); Self { maybe_cover_image_public_bucket_path, maybe_cover_image_public_bucket_url, - //maybe_media_links, maybe_links, default_cover: MediaFileDefaultCover::from_token_str(token), } @@ -181,4 +189,142 @@ mod tests { assert_eq!(cover.color_index, 0); assert_eq!(cover.image_index, 23); } + + #[test] + fn test_cover_image_url_production() { + let token = MediaFileToken::new_from_str("test_token"); + let domain = super::MediaDomain::FakeYou; + let env = super::ServerEnvironment::Production; + + let details = super::MediaFileCoverImageDetails::from_optional_db_fields( + &token, + domain, + env, + Some("bucket_hash"), + Some("image_"), + Some(".png"), + ); + + let url = details.maybe_cover_image_public_bucket_url.unwrap(); + assert!( + url.as_str().starts_with("https://cdn-2.fakeyou.com"), + "Production URL should start with https://cdn-2.fakeyou.com, got: {}", + url + ); + } + + #[test] + fn test_cover_image_url_development() { + let token = MediaFileToken::new_from_str("test_token"); + let domain = super::MediaDomain::FakeYou; + let env = super::ServerEnvironment::Development; + + let details = super::MediaFileCoverImageDetails::from_optional_db_fields( + &token, + domain, + env, + Some("bucket_hash"), + Some("image_"), + Some(".png"), + ); + + let url = details.maybe_cover_image_public_bucket_url.unwrap(); + assert!( + url.as_str().starts_with("https://pub-c8a4a5bdbdb048f286b77bdf9f786ff2.r2.dev/"), + "Development URL should start with https://pub-c8a4a5bdbdb048f286b77bdf9f786ff2.r2.dev/, got: {}", + url + ); + } + + #[test] + fn test_cover_image_links_cdn_url_production() { + let token = MediaFileToken::new_from_str("test_token"); + let domain = super::MediaDomain::FakeYou; + let env = super::ServerEnvironment::Production; + + let details = super::MediaFileCoverImageDetails::from_optional_db_fields( + &token, + domain, + env, + Some("bucket_hash"), + Some("image_"), + Some(".png"), + ); + + let links = details.maybe_links.unwrap(); + assert!( + links.cdn_url.as_str().starts_with("https://cdn-2.fakeyou.com"), + "Production cdn_url should start with https://cdn-2.fakeyou.com, got: {}", + links.cdn_url + ); + } + + #[test] + fn test_cover_image_links_cdn_url_development() { + let token = MediaFileToken::new_from_str("test_token"); + let domain = super::MediaDomain::FakeYou; + let env = super::ServerEnvironment::Development; + + let details = super::MediaFileCoverImageDetails::from_optional_db_fields( + &token, + domain, + env, + Some("bucket_hash"), + Some("image_"), + Some(".png"), + ); + + let links = details.maybe_links.unwrap(); + assert!( + links.cdn_url.as_str().starts_with("https://pub-c8a4a5bdbdb048f286b77bdf9f786ff2.r2.dev/"), + "Development cdn_url should start with https://pub-c8a4a5bdbdb048f286b77bdf9f786ff2.r2.dev/, got: {}", + links.cdn_url + ); + } + + #[test] + fn test_cover_image_links_thumbnail_template_production() { + let token = MediaFileToken::new_from_str("test_token"); + let domain = super::MediaDomain::FakeYou; + let env = super::ServerEnvironment::Production; + + let details = super::MediaFileCoverImageDetails::from_optional_db_fields( + &token, + domain, + env, + Some("bucket_hash"), + Some("image_"), + Some(".png"), + ); + + let links = details.maybe_links.unwrap(); + assert!( + links.thumbnail_template.starts_with("https://cdn-2.fakeyou.com"), + "Production thumbnail_template should start with https://cdn-2.fakeyou.com, got: {}", + links.thumbnail_template + ); + } + + #[test] + fn test_cover_image_links_thumbnail_template_development() { + let token = MediaFileToken::new_from_str("test_token"); + let domain = super::MediaDomain::FakeYou; + let env = super::ServerEnvironment::Development; + + let details = super::MediaFileCoverImageDetails::from_optional_db_fields( + &token, + domain, + env, + Some("bucket_hash"), + Some("image_"), + Some(".png"), + ); + + let links = details.maybe_links.unwrap(); + assert!( + links.thumbnail_template.starts_with("https://pub-c8a4a5bdbdb048f286b77bdf9f786ff2.r2.dev/"), + "Development thumbnail_template should start with https://pub-c8a4a5bdbdb048f286b77bdf9f786ff2.r2.dev/, got: {}", + links.thumbnail_template + ); + } } diff --git a/crates/service/web/storyteller_web/src/http_server/common_responses/media/media_file_cover_image_details_builder.rs b/crates/service/web/storyteller_web/src/http_server/common_responses/media/media_file_cover_image_details_builder.rs index 1b325e3a28..07bdb026ee 100644 --- a/crates/service/web/storyteller_web/src/http_server/common_responses/media/media_file_cover_image_details_builder.rs +++ b/crates/service/web/storyteller_web/src/http_server/common_responses/media/media_file_cover_image_details_builder.rs @@ -1,8 +1,8 @@ use crate::http_server::common_responses::media::cover_image_links_builder::CoverImageLinksBuilder; use crate::http_server::common_responses::media::media_domain::MediaDomain; -use crate::http_server::web_utils::bucket_urls::bucket_url_from_media_path::bucket_url_from_media_path; use artcraft_api_defs::common::responses::media_file_cover_image_details::{MediaFileCoverImageDetails, MediaFileDefaultCover}; use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; +use server_environment::ServerEnvironment; use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; use tokens::tokens::media_files::MediaFileToken; @@ -42,6 +42,7 @@ impl MediaFileCoverImageDetailsBuilder { pub fn from_optional_db_fields( token: &MediaFileToken, domain: MediaDomain, + server_environment: ServerEnvironment, maybe_cover_image_public_bucket_path: Option<&str>, maybe_cover_image_public_bucket_prefix: Option<&str>, maybe_cover_image_public_bucket_extension: Option<&str>, @@ -49,6 +50,7 @@ impl MediaFileCoverImageDetailsBuilder { Self::from_optional_db_str_fields( token.as_str(), domain, + server_environment, maybe_cover_image_public_bucket_path, maybe_cover_image_public_bucket_prefix, maybe_cover_image_public_bucket_extension @@ -58,6 +60,7 @@ impl MediaFileCoverImageDetailsBuilder { pub fn from_optional_db_str_fields( token: &str, domain: MediaDomain, + server_environment: ServerEnvironment, maybe_cover_image_public_bucket_path: Option<&str>, maybe_cover_image_public_bucket_prefix: Option<&str>, maybe_cover_image_public_bucket_extension: Option<&str>, @@ -69,29 +72,10 @@ impl MediaFileCoverImageDetailsBuilder { maybe_cover_image_public_bucket_extension )); - let maybe_cover_image_public_bucket_path = maybe_bucket_path - .as_ref() - .map(|bucket_path| bucket_path - .get_full_object_path_str() - .to_string()); - - // NB: Fail construction open. - let maybe_cover_image_public_bucket_url = maybe_bucket_path - .as_ref() - .map(|bucket_path| bucket_url_from_media_path(bucket_path).ok()) - .flatten(); - let maybe_links = CoverImageLinksBuilder::from_maybe_media_path( - domain, maybe_bucket_path.as_ref()); - - // let maybe_media_links = maybe_bucket_path - // .map(|path| MediaLinks::from_media_path(domain, &path)); + domain, server_environment, maybe_bucket_path.as_ref()); MediaFileCoverImageDetails { - // NB: The code using this builder does not populate or read these legacy fields: - // maybe_cover_image_public_bucket_path, - // maybe_cover_image_public_bucket_url, - // maybe_media_links, maybe_links, default_cover: MediaFileDefaultCoverBuilder::from_token_str(token), } diff --git a/crates/service/web/storyteller_web/src/http_server/common_responses/media/weights_cover_image_details.rs b/crates/service/web/storyteller_web/src/http_server/common_responses/media/weights_cover_image_details.rs index 9e2b528dd0..f3e2dbb43a 100644 --- a/crates/service/web/storyteller_web/src/http_server/common_responses/media/weights_cover_image_details.rs +++ b/crates/service/web/storyteller_web/src/http_server/common_responses/media/weights_cover_image_details.rs @@ -1,12 +1,13 @@ use url::Url; use utoipa::ToSchema; +use crate::http_server::common_responses::media::cdn_link; use crate::http_server::common_responses::media::cover_image_links::CoverImageLinks; use crate::http_server::common_responses::media::media_domain::MediaDomain; -use crate::http_server::web_utils::bucket_urls::bucket_url_from_media_path::bucket_url_from_media_path; use crate::util::placeholder_images::cover_images::default_cover_image_color_from_token::default_cover_image_color_from_token; use crate::util::placeholder_images::cover_images::default_cover_image_from_token::default_cover_image_from_token; use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; +use server_environment::ServerEnvironment; use tokens::tokens::model_weights::ModelWeightToken; /// Everything we need to create a cover image. @@ -45,6 +46,7 @@ impl WeightsCoverImageDetails { pub fn from_optional_db_fields( domain: MediaDomain, + server_environment: ServerEnvironment, model_weight_token: &ModelWeightToken, maybe_cover_image_public_bucket_path: Option<&str>, maybe_cover_image_public_bucket_prefix: Option<&str>, @@ -66,13 +68,15 @@ impl WeightsCoverImageDetails { // NB: Fail construction open. let maybe_cover_image_public_bucket_url = maybe_bucket_path .as_ref() - .map(|bucket_path| bucket_url_from_media_path(bucket_path).ok()) - .flatten(); - - let image_index = default_cover_image_from_token(model_weight_token); + .and_then(|bucket_path| { + let rooted_path = bucket_path.get_full_object_path_str(); + let mut url = cdn_link::new_cdn_url(domain, server_environment); + url.set_path(rooted_path); + Some(url) + }); let maybe_links = CoverImageLinks::from_maybe_media_path( - domain, maybe_bucket_path.as_ref()); + domain, server_environment, maybe_bucket_path.as_ref()); Self { maybe_cover_image_public_bucket_path, @@ -96,6 +100,7 @@ impl WeightsDefaultCoverInfo { mod tests { use crate::http_server::common_responses::media::media_domain::MediaDomain; use crate::http_server::common_responses::media::weights_cover_image_details::WeightsCoverImageDetails; + use server_environment::ServerEnvironment; use tokens::tokens::model_weights::ModelWeightToken; use url::Url; @@ -109,6 +114,7 @@ mod tests { let cover_image = WeightsCoverImageDetails::from_optional_db_fields( domain, + ServerEnvironment::Production, &token, maybe_public_bucket_hash, maybe_prefix, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/batch_get_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/batch_get_media_files_handler.rs index 63c719a402..8eefccc75d 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/batch_get_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/batch_get_media_files_handler.rs @@ -341,10 +341,11 @@ pub async fn batch_get_media_files_handler( public_bucket_path: public_bucket_path .get_full_object_path_str() .to_string(), - public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path), + public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path, media_domain, server_state.server_environment), cover_image: MediaFileCoverImageDetails::from_optional_db_fields( &result.token, media_domain, + server_state.server_environment, result.maybe_file_cover_image_public_bucket_hash.as_deref(), result.maybe_file_cover_image_public_bucket_prefix.as_deref(), result.maybe_file_cover_image_public_bucket_extension.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/get_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/get_media_file_handler.rs index 67766c69cc..280d506737 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/get_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/get/get_media_file_handler.rs @@ -366,7 +366,7 @@ async fn modern_media_file_lookup( maybe_batch_token: result.maybe_batch_token, maybe_scene_source_media_file_token: result.maybe_scene_source_media_file_token, media_links: MediaLinksBuilder::from_media_path_and_env(media_domain, server_state.server_environment, &public_bucket_path), - public_bucket_url: bucket_url_from_media_path(&public_bucket_path) + public_bucket_url: bucket_url_from_media_path(&public_bucket_path, media_domain, server_state.server_environment) .map_err(|err| { warn!("error creating URL: {:?}", err); GetMediaFileError::ServerError @@ -377,6 +377,7 @@ async fn modern_media_file_lookup( cover_image: MediaFileCoverImageDetails::from_optional_db_fields( &result.token, media_domain, + server_state.server_environment, result.maybe_file_cover_image_public_bucket_hash.as_deref(), result.maybe_file_cover_image_public_bucket_prefix.as_deref(), result.maybe_file_cover_image_public_bucket_extension.as_deref(), @@ -503,13 +504,13 @@ async fn emulate_media_file_with_legacy_tts_result_lookup( maybe_batch_token: None, maybe_scene_source_media_file_token: None, media_links: MediaLinksBuilder::from_rooted_path_and_env(media_domain, server_state.server_environment, &public_bucket_path), - public_bucket_url: bucket_url_from_str_path(&public_bucket_path) + public_bucket_url: bucket_url_from_str_path(&public_bucket_path, media_domain, server_state.server_environment) .map_err(|err| { warn!("error creating URL: {:?}", err); GetMediaFileError::ServerError })?, public_bucket_path, - cover_image: MediaFileCoverImageDetails::from_token_str(&result.tts_result_token), + cover_image: MediaFileCoverImageDetails::from_legacy_token_str(&result.tts_result_token), maybe_model_weight_info: Some(GetMediaFileModelInfo { // NB: These should be reasonable synthetic defaults for emulated TT2 results, even the "ModelWeightToken". weight_token: ModelWeightToken::new_from_str(&result.tts_model_token), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_batch_generated_redux_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_batch_generated_redux_media_files_handler.rs index 5d6079f21a..0fdc50385d 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_batch_generated_redux_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_batch_generated_redux_media_files_handler.rs @@ -8,7 +8,6 @@ use crate::http_server::common_responses::media::media_links_builder::MediaLinks use crate::http_server::common_responses::user_details_lite_builder::UserDetailsLightBuilder; use crate::http_server::endpoints::media_files::get::get_media_file_handler::GetMediaFilePathInfo; use crate::http_server::endpoints::media_files::helpers::get_media_domain::get_media_domain; -use crate::http_server::web_utils::bucket_urls::bucket_url_string_from_media_path::bucket_url_string_from_media_path; use crate::http_server::web_utils::response_error_helpers::to_simple_json_error; use crate::state::server_state::ServerState; use actix_web::error::ResponseError; @@ -120,6 +119,7 @@ pub async fn list_batch_generated_redux_media_files_handler( cover_image: MediaFileCoverImageDetailsBuilder::from_optional_db_fields( &result.token, media_domain, + server_state.server_environment, result.maybe_file_cover_image_public_bucket_hash.as_deref(), result.maybe_file_cover_image_public_bucket_prefix.as_deref(), result.maybe_file_cover_image_public_bucket_extension.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_featured_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_featured_media_files_handler.rs index b476fb15d9..aab70e1a7c 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_featured_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_featured_media_files_handler.rs @@ -296,10 +296,11 @@ pub async fn list_featured_media_files_handler( public_bucket_path: public_bucket_path .get_full_object_path_str() .to_string(), - public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path), + public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path, media_domain, server_state.server_environment), cover_image: MediaFileCoverImageDetails::from_optional_db_fields( &m.token, media_domain, + server_state.server_environment, m.maybe_file_cover_image_public_bucket_hash.as_deref(), m.maybe_file_cover_image_public_bucket_prefix.as_deref(), m.maybe_file_cover_image_public_bucket_extension.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_by_batch_token_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_by_batch_token_handler.rs index af9d5d9c60..903a286ad5 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_by_batch_token_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_by_batch_token_handler.rs @@ -285,7 +285,7 @@ pub async fn list_media_files_by_batch_token_handler( public_bucket_path: public_bucket_path .get_full_object_path_str() .to_string(), - public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path), + public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path, media_domain, server_state.server_environment), cover_image: MediaFileCoverImageDetails::from_token(&record.token), creator_set_visibility: record.creator_set_visibility, is_user_upload: record.is_user_upload, diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_for_user_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_for_user_handler.rs index abbc192ee9..463952f5aa 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_for_user_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_for_user_handler.rs @@ -344,10 +344,11 @@ pub async fn list_media_files_for_user_handler( public_bucket_path: public_bucket_path .get_full_object_path_str() .to_string(), - public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path), + public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path, media_domain, server_state.server_environment), cover_image: MediaFileCoverImageDetails::from_optional_db_fields( &record.token, media_domain, + server_state.server_environment, record.maybe_file_cover_image_public_bucket_hash.as_deref(), record.maybe_file_cover_image_public_bucket_prefix.as_deref(), record.maybe_file_cover_image_public_bucket_extension.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_handler.rs index 8117759a25..28e33413e3 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_media_files_handler.rs @@ -353,10 +353,11 @@ pub async fn list_media_files_handler( public_bucket_path: public_bucket_path .get_full_object_path_str() .to_string(), - public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path), + public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path, media_domain, server_state.server_environment), cover_image: MediaFileCoverImageDetails::from_optional_db_fields( &record.token, media_domain, + server_state.server_environment, record.maybe_file_cover_image_public_bucket_hash.as_deref(), record.maybe_file_cover_image_public_bucket_prefix.as_deref(), record.maybe_file_cover_image_public_bucket_extension.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_pinned_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_pinned_media_files_handler.rs index f28892ce07..3674621018 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_pinned_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/list/list_pinned_media_files_handler.rs @@ -223,10 +223,11 @@ pub async fn list_pinned_media_files_handler( public_bucket_path: public_bucket_path .get_full_object_path_str() .to_string(), - public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path), + public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path, media_domain, server_state.server_environment), cover_image: MediaFileCoverImageDetails::from_optional_db_fields( &m.token, media_domain, + server_state.server_environment, m.maybe_file_cover_image_public_bucket_hash.as_deref(), m.maybe_file_cover_image_public_bucket_prefix.as_deref(), m.maybe_file_cover_image_public_bucket_extension.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/search/search_featured_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/search/search_featured_media_files_handler.rs index 1aa50c5e6f..421c28d5ff 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/search/search_featured_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/search/search_featured_media_files_handler.rs @@ -235,10 +235,11 @@ pub async fn search_featured_media_files_handler( public_bucket_path: public_bucket_path .get_full_object_path_str() .to_string(), - public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path), + public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path, media_domain, server_state.server_environment), cover_image: MediaFileCoverImageDetails::from_optional_db_fields( &result.token, media_domain, + server_state.server_environment, result.maybe_cover_image_public_bucket_hash.as_deref(), result.maybe_cover_image_public_bucket_prefix.as_deref(), result.maybe_cover_image_public_bucket_extension.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/search/search_session_media_files_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/search/search_session_media_files_handler.rs index 1f3245aa82..da66f77d8b 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/search/search_session_media_files_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/search/search_session_media_files_handler.rs @@ -262,10 +262,11 @@ pub async fn search_session_media_files_handler( public_bucket_path: public_bucket_path .get_full_object_path_str() .to_string(), - public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path), + public_bucket_url: bucket_url_string_from_media_path(&public_bucket_path, media_domain, server_state.server_environment), cover_image: MediaFileCoverImageDetails::from_optional_db_fields( &result.token, media_domain, + server_state.server_environment, result.maybe_cover_image_public_bucket_hash.as_deref(), result.maybe_cover_image_public_bucket_prefix.as_deref(), result.maybe_cover_image_public_bucket_extension.as_deref(), 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 d83d259a76..a14958d9f9 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 @@ -243,6 +243,7 @@ pub async fn list_user_bookmarks_for_user_handler( maybe_media_file_cover = Some(MediaFileCoverImageDetails::from_optional_db_fields( &MediaFileToken::new_from_str(&user_bookmark.entity_token), media_domain, + server_state.server_environment, user_bookmark.maybe_media_file_cover_image_public_bucket_hash.as_deref(), user_bookmark.maybe_media_file_cover_image_public_bucket_prefix.as_deref(), user_bookmark.maybe_media_file_cover_image_public_bucket_extension.as_deref(), @@ -251,6 +252,7 @@ pub async fn list_user_bookmarks_for_user_handler( UserBookmarkEntityType::ModelWeight => { maybe_model_weight_cover = Some(WeightsCoverImageDetails::from_optional_db_fields( media_domain, + server_state.server_environment, &ModelWeightToken::new_from_str(&user_bookmark.entity_token), user_bookmark.maybe_model_weight_cover_image_public_bucket_hash.as_deref(), user_bookmark.maybe_model_weight_cover_image_public_bucket_prefix.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/get/get_weight_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/get/get_weight_handler.rs index 0e202c1d0d..98cf173669 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/get/get_weight_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/get/get_weight_handler.rs @@ -184,6 +184,7 @@ pub async fn get_weight_handler( let cover_image_details = WeightsCoverImageDetails::from_optional_db_fields( media_domain, + server_state.server_environment, &weight.token, weight.maybe_cover_image_public_bucket_hash.as_deref(), weight.maybe_cover_image_public_bucket_prefix.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_available_weights_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_available_weights_handler.rs index c01689629d..ebc61599e9 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_available_weights_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_available_weights_handler.rs @@ -234,6 +234,7 @@ pub async fn list_available_weights_handler( .map(|weight| { let cover_image_details = WeightsCoverImageDetails::from_optional_db_fields( media_domain, + server_state.server_environment, &weight.token, weight.maybe_cover_image_public_bucket_hash.as_deref(), weight.maybe_cover_image_public_bucket_prefix.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_featured_weights_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_featured_weights_handler.rs index 1f02b99a17..c30bdf9b86 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_featured_weights_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_featured_weights_handler.rs @@ -235,6 +235,7 @@ pub async fn list_featured_weights_handler( .map(|w| { let cover_image_details = WeightsCoverImageDetails::from_optional_db_fields( media_domain, + server_state.server_environment, &w.token, w.maybe_cover_image_public_bucket_hash.as_deref(), w.maybe_cover_image_public_bucket_prefix.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_pinned_weights_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_pinned_weights_handler.rs index e9e8913be8..feb6e61bb7 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_pinned_weights_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_pinned_weights_handler.rs @@ -156,6 +156,7 @@ pub async fn list_pinned_weights_handler( .map(|w| { let cover_image_details = WeightsCoverImageDetails::from_optional_db_fields( media_domain, + server_state.server_environment, &w.token, w.maybe_cover_image_public_bucket_hash.as_deref(), w.maybe_cover_image_public_bucket_prefix.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_weights_by_user_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_weights_by_user_handler.rs index c17df8fc5c..6b906a7847 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_weights_by_user_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/list/list_weights_by_user_handler.rs @@ -212,6 +212,7 @@ pub async fn list_weights_by_user_handler( let cover_image_details = WeightsCoverImageDetails::from_optional_db_fields( media_domain, + server_state.server_environment, &weight.token, weight.maybe_cover_image_public_bucket_hash.as_deref(), weight.maybe_cover_image_public_bucket_prefix.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/search/search_model_weights_impl.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/search/search_model_weights_impl.rs index 9becea63fa..717b5bd682 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/weights/search/search_model_weights_impl.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/weights/search/search_model_weights_impl.rs @@ -201,6 +201,7 @@ pub async fn search_model_weights_impl( .map(|result| { let cover_image_details = WeightsCoverImageDetails::from_optional_db_fields( media_domain, + server_state.server_environment, &result.token, result.maybe_cover_image_public_bucket_hash.as_deref(), result.maybe_cover_image_public_bucket_prefix.as_deref(), diff --git a/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_from_media_path.rs b/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_from_media_path.rs index f27c562dd2..25e330748b 100644 --- a/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_from_media_path.rs +++ b/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_from_media_path.rs @@ -2,13 +2,20 @@ use url::Url; use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; use errors::AnyhowResult; +use server_environment::ServerEnvironment; + +use crate::http_server::common_responses::media::cdn_link; +use crate::http_server::common_responses::media::media_domain::MediaDomain; #[deprecated(note = "This is tied to GCP and is legacy.")] pub fn bucket_url_from_media_path( bucket_path: &MediaFileBucketPath, + domain: MediaDomain, + server_environment: ServerEnvironment, ) -> AnyhowResult { let path = bucket_path.get_full_object_path_str(); - let url = format!("https://cdn-2.fakeyou.com{}", path); + let host = cdn_link::get_cdn_host(domain, server_environment); + let url = format!("{host}{path}"); let url = Url::parse(&url)?; Ok(url) } @@ -18,14 +25,24 @@ mod tests { use url::Url; use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; + use server_environment::ServerEnvironment; + use crate::http_server::common_responses::media::media_domain::MediaDomain; use crate::http_server::web_utils::bucket_urls::bucket_url_from_media_path::bucket_url_from_media_path; #[test] - fn test() { + fn test_production() { let bucket_path = MediaFileBucketPath::from_object_hash("test", Some("pre_"), Some(".ext")); - assert_eq!(bucket_url_from_media_path(&bucket_path).unwrap(), - Url::parse("https://storage.googleapis.com/vocodes-public/media/t/e/s/test/pre_test.ext").unwrap()); + assert_eq!(bucket_url_from_media_path(&bucket_path, MediaDomain::FakeYou, ServerEnvironment::Production).unwrap(), + Url::parse("https://cdn-2.fakeyou.com/media/t/e/s/test/pre_test.ext").unwrap()); + } + + #[test] + fn test_development() { + let bucket_path = MediaFileBucketPath::from_object_hash("test", Some("pre_"), Some(".ext")); + + assert_eq!(bucket_url_from_media_path(&bucket_path, MediaDomain::FakeYou, ServerEnvironment::Development).unwrap(), + Url::parse("https://pub-c8a4a5bdbdb048f286b77bdf9f786ff2.r2.dev/media/t/e/s/test/pre_test.ext").unwrap()); } } \ No newline at end of file diff --git a/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_from_str_path.rs b/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_from_str_path.rs index f7dc714102..357fab3357 100644 --- a/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_from_str_path.rs +++ b/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_from_str_path.rs @@ -1,11 +1,18 @@ use url::Url; use errors::AnyhowResult; +use server_environment::ServerEnvironment; + +use crate::http_server::common_responses::media::cdn_link; +use crate::http_server::common_responses::media::media_domain::MediaDomain; pub fn bucket_url_from_str_path( bucket_path: &str, + domain: MediaDomain, + server_environment: ServerEnvironment, ) -> AnyhowResult { - let url = format!("https://cdn-2.fakeyou.com{}", bucket_path); + let host = cdn_link::get_cdn_host(domain, server_environment); + let url = format!("{host}{bucket_path}"); let url = Url::parse(&url)?; Ok(url) } @@ -13,12 +20,20 @@ pub fn bucket_url_from_str_path( #[cfg(test)] mod tests { use url::Url; + use server_environment::ServerEnvironment; + use crate::http_server::common_responses::media::media_domain::MediaDomain; use crate::http_server::web_utils::bucket_urls::bucket_url_from_str_path::bucket_url_from_str_path; #[test] - fn test() { - assert_eq!(bucket_url_from_str_path("/foo/bar").unwrap(), - Url::parse("https://storage.googleapis.com/vocodes-public/foo/bar").unwrap()); + fn test_production() { + assert_eq!(bucket_url_from_str_path("/foo/bar", MediaDomain::FakeYou, ServerEnvironment::Production).unwrap(), + Url::parse("https://cdn-2.fakeyou.com/foo/bar").unwrap()); + } + + #[test] + fn test_development() { + assert_eq!(bucket_url_from_str_path("/foo/bar", MediaDomain::FakeYou, ServerEnvironment::Development).unwrap(), + Url::parse("https://pub-c8a4a5bdbdb048f286b77bdf9f786ff2.r2.dev/foo/bar").unwrap()); } } \ No newline at end of file diff --git a/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_string_from_media_path.rs b/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_string_from_media_path.rs index 2b350221ec..c9f5f05c9c 100644 --- a/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_string_from_media_path.rs +++ b/crates/service/web/storyteller_web/src/http_server/web_utils/bucket_urls/bucket_url_string_from_media_path.rs @@ -1,24 +1,41 @@ use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; +use server_environment::ServerEnvironment; + +use crate::http_server::common_responses::media::cdn_link; +use crate::http_server::common_responses::media::media_domain::MediaDomain; /// An infallible version of `bucket_url_from_media_path` that returns a string. pub fn bucket_url_string_from_media_path( bucket_path: &MediaFileBucketPath, + domain: MediaDomain, + server_environment: ServerEnvironment, ) -> String { let path = bucket_path.get_full_object_path_str(); - format!("https://cdn-2.fakeyou.com{}", path) + let host = cdn_link::get_cdn_host(domain, server_environment); + format!("{host}{path}") } #[cfg(test)] mod tests { use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath; + use server_environment::ServerEnvironment; + use crate::http_server::common_responses::media::media_domain::MediaDomain; use crate::http_server::web_utils::bucket_urls::bucket_url_string_from_media_path::bucket_url_string_from_media_path; #[test] - fn test() { + fn test_production() { let bucket_path = MediaFileBucketPath::from_object_hash("test", Some("pre_"), Some(".ext")); - assert_eq!(&bucket_url_string_from_media_path(&bucket_path), - "https://storage.googleapis.com/vocodes-public/media/t/e/s/test/pre_test.ext"); + assert_eq!(&bucket_url_string_from_media_path(&bucket_path, MediaDomain::FakeYou, ServerEnvironment::Production), + "https://cdn-2.fakeyou.com/media/t/e/s/test/pre_test.ext"); + } + + #[test] + fn test_development() { + let bucket_path = MediaFileBucketPath::from_object_hash("test", Some("pre_"), Some(".ext")); + + assert_eq!(&bucket_url_string_from_media_path(&bucket_path, MediaDomain::FakeYou, ServerEnvironment::Development), + "https://pub-c8a4a5bdbdb048f286b77bdf9f786ff2.r2.dev/media/t/e/s/test/pre_test.ext"); } }