diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_engine_asset/drain_multipart_request.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_engine_asset/drain_multipart_request.rs index d8c7df40ca..0a963578a1 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_engine_asset/drain_multipart_request.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_engine_asset/drain_multipart_request.rs @@ -19,6 +19,9 @@ pub struct MediaFileUploadData { // Optional: title of the scene (media_files' maybe_title) pub title: Option, + + // Optional: visibility + pub visibility: Option, } /// Pull common parts out of multipart media HTTP requests, typically for handling file uploads. @@ -29,6 +32,7 @@ pub async fn drain_multipart_request(mut multipart_payload: Multipart) -> Anyhow //let mut media_file_class = None; let mut media_file_subtype = None; let mut title = None; + let mut visibility = None; while let Ok(Some(mut field)) = multipart_payload.try_next().await { let mut field_name = None; @@ -90,6 +94,13 @@ pub async fn drain_multipart_request(mut multipart_payload: Multipart) -> Anyhow e })?; }, + Some("visibility") => { + visibility = read_multipart_field_as_text(&mut field).await + .map_err(|e| { + warn!("Error reading title: {:}", &e); + e + })?; + }, _ => continue, } } @@ -100,5 +111,6 @@ pub async fn drain_multipart_request(mut multipart_payload: Multipart) -> Anyhow file_bytes, media_file_subtype, title, + visibility, }) } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_engine_asset/upload_engine_asset_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_engine_asset/upload_engine_asset_media_file_handler.rs index 81b687bee0..27a424bc41 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_engine_asset/upload_engine_asset_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_engine_asset/upload_engine_asset_media_file_handler.rs @@ -124,9 +124,19 @@ pub async fn upload_engine_asset_media_file_handler( // ==================== UPLOAD METADATA ==================== // - let creator_set_visibility = maybe_user_session - .as_ref() - .map(|user_session| user_session.preferred_tts_result_visibility) // TODO: We need a new type of visibility control. + let creator_set_visibility = upload_media_request.visibility + .as_deref() + .map(|visibility| Visibility::from_str(visibility)) + .transpose() + .map_err(|err| { + error!("Invalid visibility: {:?}", err); + MediaFileUploadError::BadInput("invalid visibility".to_string()) + })? + .or_else(|| { + maybe_user_session + .as_ref() + .map(|user_session| user_session.preferred_tts_result_visibility) + }) .unwrap_or(Visibility::default()); // ==================== USER DATA ==================== // diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/drain_multipart_request.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/drain_multipart_request.rs index f45d47828f..8c9a2c04f1 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/drain_multipart_request.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/drain_multipart_request.rs @@ -16,6 +16,9 @@ pub struct MediaFileUploadData { // Optional: title of the scene (media_files' maybe_title) pub title: Option, + + // Optional: visibility + pub visibility: Option, } /// Where the frontend tells us the file came from. @@ -35,6 +38,7 @@ pub async fn drain_multipart_request(mut multipart_payload: Multipart) -> Anyhow let mut file_name = None; let mut media_source = None; let mut title = None; + let mut visibility = None; while let Ok(Some(mut field)) = multipart_payload.try_next().await { let mut field_name = None; @@ -77,6 +81,13 @@ pub async fn drain_multipart_request(mut multipart_payload: Multipart) -> Anyhow e })?; }, + Some("visibility") => { + visibility = read_multipart_field_as_text(&mut field).await + .map_err(|e| { + warn!("Error reading title: {:}", &e); + e + })?; + }, _ => continue, } } @@ -99,5 +110,6 @@ pub async fn drain_multipart_request(mut multipart_payload: Multipart) -> Anyhow file_bytes, media_source, title, + visibility, }) } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/process_upload_media_file.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/process_upload_media_file.rs index b760525adb..233eba889c 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/process_upload_media_file.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_generic/process_upload_media_file.rs @@ -119,9 +119,19 @@ pub async fn process_upload_media_file( // ==================== PROCESS REQUEST ==================== // - let creator_set_visibility = maybe_user_session - .as_ref() - .map(|user_session| user_session.preferred_tts_result_visibility) // TODO: We need a new type of visibility control. + let creator_set_visibility = upload_media_request.visibility + .as_deref() + .map(|visibility| Visibility::from_str(visibility)) + .transpose() + .map_err(|err| { + error!("Invalid visibility: {:?}", err); + MediaFileUploadError::BadInput("invalid visibility".to_string()) + })? + .or_else(|| { + maybe_user_session + .as_ref() + .map(|user_session| user_session.preferred_tts_result_visibility) + }) .unwrap_or(Visibility::default()); let ip_address = get_request_ip(&http_request); diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video/drain_multipart_request.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video/drain_multipart_request.rs index f45d47828f..8c9a2c04f1 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video/drain_multipart_request.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video/drain_multipart_request.rs @@ -16,6 +16,9 @@ pub struct MediaFileUploadData { // Optional: title of the scene (media_files' maybe_title) pub title: Option, + + // Optional: visibility + pub visibility: Option, } /// Where the frontend tells us the file came from. @@ -35,6 +38,7 @@ pub async fn drain_multipart_request(mut multipart_payload: Multipart) -> Anyhow let mut file_name = None; let mut media_source = None; let mut title = None; + let mut visibility = None; while let Ok(Some(mut field)) = multipart_payload.try_next().await { let mut field_name = None; @@ -77,6 +81,13 @@ pub async fn drain_multipart_request(mut multipart_payload: Multipart) -> Anyhow e })?; }, + Some("visibility") => { + visibility = read_multipart_field_as_text(&mut field).await + .map_err(|e| { + warn!("Error reading title: {:}", &e); + e + })?; + }, _ => continue, } } @@ -99,5 +110,6 @@ pub async fn drain_multipart_request(mut multipart_payload: Multipart) -> Anyhow file_bytes, media_source, title, + visibility, }) } diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video/upload_video_media_file_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video/upload_video_media_file_handler.rs index e3b3d48536..524d68a7f2 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video/upload_video_media_file_handler.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/media_files/upload/upload_video/upload_video_media_file_handler.rs @@ -131,9 +131,19 @@ pub async fn upload_video_media_file_handler( // ==================== UPLOAD METADATA ==================== // - let creator_set_visibility = maybe_user_session - .as_ref() - .map(|user_session| user_session.preferred_tts_result_visibility) // TODO: We need a new type of visibility control. + let creator_set_visibility = upload_media_request.visibility + .as_deref() + .map(|visibility| Visibility::from_str(visibility)) + .transpose() + .map_err(|err| { + error!("Invalid visibility: {:?}", err); + MediaFileUploadError::BadInput("invalid visibility".to_string()) + })? + .or_else(|| { + maybe_user_session + .as_ref() + .map(|user_session| user_session.preferred_tts_result_visibility) + }) .unwrap_or(Visibility::default()); let upload_type = match upload_media_request.media_source {