From 3ea554f322a869ef76d97a345cf8547efbb6602c Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Sun, 1 Jun 2025 18:53:33 -0400 Subject: [PATCH] wip fal backend --- .../endpoints/generate/image/mod.rs | 1 + .../image/remove_image_background_handler.rs | 138 ++++++++++++++++++ .../src/http_server/endpoints/generate/mod.rs | 2 + .../endpoints/generate/video/mod.rs | 0 .../src/http_server/endpoints/mod.rs | 3 +- 5 files changed, 143 insertions(+), 1 deletion(-) create mode 100644 crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/mod.rs create mode 100644 crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/remove_image_background_handler.rs create mode 100644 crates/service/web/storyteller_web/src/http_server/endpoints/generate/mod.rs create mode 100644 crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/mod.rs diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/mod.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/mod.rs new file mode 100644 index 0000000000..a318a9cde3 --- /dev/null +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/mod.rs @@ -0,0 +1 @@ +mod remove_image_background_handler; \ No newline at end of file diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/remove_image_background_handler.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/remove_image_background_handler.rs new file mode 100644 index 0000000000..9cc36c27f0 --- /dev/null +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/image/remove_image_background_handler.rs @@ -0,0 +1,138 @@ +use std::fmt; +use std::sync::Arc; + +use actix_web::{HttpRequest, HttpResponse, web}; +use actix_web::error::ResponseError; +use actix_web::http::StatusCode; +use actix_web::web::Path; +use log::warn; +use utoipa::ToSchema; + +use http_server_common::response::serialize_as_json_error::serialize_as_json_error; +use mysql_queries::queries::media_files::edit::rename_media_file::rename_media_file; +use mysql_queries::queries::media_files::get::get_media_file::get_media_file; +use tokens::tokens::media_files::MediaFileToken; +use crate::http_server::common_requests::media_file_token_path_info::MediaFileTokenPathInfo; +use crate::http_server::web_utils::response_success_helpers::simple_json_success; +use crate::state::server_state::ServerState; +use crate::util::delete_role_disambiguation::{delete_role_disambiguation, DeleteRole}; + +#[derive(Deserialize, ToSchema)] +pub struct RemoveImageBackgroundRequest { + /// New name for the media file. + /// If absent or empty string, the name will be cleared + name: Option, +} + +// =============== Error Response =============== + +#[derive(Debug, Serialize, ToSchema)] +pub enum RemoveImageBackgroundError { + BadInput(String), + NotFound, + NotAuthorized, + ServerError, +} + +impl ResponseError for RemoveImageBackgroundError { + fn status_code(&self) -> StatusCode { + match *self { + RemoveImageBackgroundError::BadInput(_) => StatusCode::BAD_REQUEST, + RemoveImageBackgroundError::NotFound => StatusCode::NOT_FOUND, + RemoveImageBackgroundError::NotAuthorized => StatusCode::UNAUTHORIZED, + RemoveImageBackgroundError::ServerError => StatusCode::INTERNAL_SERVER_ERROR, + } + } + + fn error_response(&self) -> HttpResponse { + serialize_as_json_error(self) + } +} + +// NB: Not using derive_more::Display since Clion doesn't understand it. +impl fmt::Display for RemoveImageBackgroundError { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "{:?}", self) + } +} + +// =============== Handler =============== + +/// Change (or remove) the "title" of a media file. +#[utoipa::path( + post, + tag = "Generate Images", + path = "/v1/generate/image/remove_background", + responses( + (status = 200, description = "Success", body = SimpleGenericJsonSuccess), + (status = 400, description = "Bad input", body = RemoveImageBackgroundError), + (status = 401, description = "Not authorized", body = RemoveImageBackgroundError), + (status = 500, description = "Server error", body = RemoveImageBackgroundError), + ), + params( + ("request" = RemoveImageBackgroundRequest, description = "Payload for Request"), + ("path" = MediaFileTokenPathInfo, description = "Path for Request") + ) +)] +pub async fn remove_image_background_handler( + http_request: HttpRequest, + path: Path, + request: web::Json, + server_state: web::Data> +) -> Result{ + let maybe_user_session = server_state + .session_checker + .maybe_get_user_session(&http_request, &server_state.mysql_pool) + .await + .map_err(|e| { + warn!("Session checker error: {:?}", e); + RemoveImageBackgroundError::ServerError + })?; + + let user_session = match maybe_user_session { + Some(session) => session, + None => { + warn!("not logged in"); + return Err(RemoveImageBackgroundError::NotAuthorized); + } + }; + + let is_mod = user_session.can_ban_users; + + let media_file_lookup_result = get_media_file( + &path.token, + is_mod, + &server_state.mysql_pool, + ).await; + + let media_file = match media_file_lookup_result { + Ok(Some(media_file)) => media_file, + Ok(None) => { + warn!("MediaFile not found: {:?}", path.token); + return Err(RemoveImageBackgroundError::NotFound); + }, + Err(err) => { + warn!("Error looking up media_file: {:?}", err); + return Err(RemoveImageBackgroundError::ServerError); + } + }; + + let is_creator = media_file.maybe_creator_user_token + .is_some_and(|t| t.as_str() == user_session.user_token.as_str()); + + if !is_creator && !is_mod { + warn!("user is not allowed to delete this media_file: {:?}", user_session.user_token); + return Err(RemoveImageBackgroundError::NotAuthorized); + } + + rename_media_file( + &path.token, + request.name.as_deref(), + &server_state.mysql_pool + ).await.map_err(|err| { + warn!("Error renaming media_file: {:?}", err); + RemoveImageBackgroundError::ServerError + })?; + + Ok(simple_json_success()) +} diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/mod.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/mod.rs new file mode 100644 index 0000000000..82a9d3c9e0 --- /dev/null +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/mod.rs @@ -0,0 +1,2 @@ +pub mod image; +pub mod video; \ No newline at end of file diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/mod.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/generate/video/mod.rs new file mode 100644 index 0000000000..e69de29bb2 diff --git a/crates/service/web/storyteller_web/src/http_server/endpoints/mod.rs b/crates/service/web/storyteller_web/src/http_server/endpoints/mod.rs index 210a23d87f..ad98ad8040 100644 --- a/crates/service/web/storyteller_web/src/http_server/endpoints/mod.rs +++ b/crates/service/web/storyteller_web/src/http_server/endpoints/mod.rs @@ -4,6 +4,7 @@ pub mod beta_keys; pub mod comments; pub mod download_job; pub mod featured_items; +pub mod generate; pub mod image_studio; pub mod inference_job; pub mod media_files; @@ -18,9 +19,9 @@ pub mod subscriptions; pub mod tags; pub mod trending; pub mod tts; -pub mod users; pub mod user_bookmarks; pub mod user_ratings; +pub mod users; pub mod voice_clone_requests; pub mod voice_conversion; pub mod voice_designer;