This commit is contained in:
Brandon Thomas committed 2026-03-23 00:12:24 -04:00
1 parent df34e5b7e2
commit 548ceb0118
151 files changed
+1182 -432

No files matched your search

@@ -37,6 +37,20 @@ impl JobStatusPlus {
Self::CancelledBySystem => "cancelled_by_system",
}
}
pub fn from_str(value: &str) -> Result<Self, String> {
match value {
"pending" => Ok(Self::Pending),
"started" => Ok(Self::Started),
"complete_success" => Ok(Self::CompleteSuccess),
"complete_failure" => Ok(Self::CompleteFailure),
"attempt_failed" => Ok(Self::AttemptFailed),
"dead" => Ok(Self::Dead),
"cancelled_by_user" => Ok(Self::CancelledByUser),
"cancelled_by_system" => Ok(Self::CancelledBySystem),
_ => Err(format!("invalid JobStatusPlus: {:?}", value)),
}
}
}
#[cfg(test)]
@@ -32,6 +32,31 @@ pub enum Visibility {
// have not yet been migrated to this scheme.
}
impl Default for Visibility {
fn default() -> Self {
Self::Public
}
}
impl Visibility {
pub const fn to_str(&self) -> &'static str {
match self {
Self::Public => "public",
Self::Hidden => "hidden",
Self::Private => "private",
}
}
pub fn from_str(value: &str) -> Result<Self, String> {
match value {
"public" => Ok(Self::Public),
"hidden" => Ok(Self::Hidden),
"private" => Ok(Self::Private),
_ => Err(format!("invalid Visibility: {:?}", value)),
}
}
}
#[cfg(test)]
mod tests {
use super::Visibility;
@@ -191,31 +191,31 @@ use artcraft_api_defs::prompts::create_prompt::CreatePromptResponse;
use billing_component::stripe::http_endpoints::checkout::create::stripe_create_checkout_session_error::CreateCheckoutSessionError;
use billing_component::stripe::http_endpoints::checkout::create::stripe_create_checkout_session_json_handler::*;
use billing_component::users::http_endpoints::list_active_user_subscriptions_handler::*;
use enums_db::by_table::beta_keys::beta_key_product::BetaKeyProduct;
use enums_db::by_table::comments::comment_entity_type::CommentEntityType;
use enums_db::by_table::featured_items::featured_item_entity_type::FeaturedItemEntityType;
use enums_api::by_table::beta_keys::beta_key_product::BetaKeyProduct;
use enums_api::by_table::comments::comment_entity_type::CommentEntityType;
use enums_api::by_table::featured_items::featured_item_entity_type::FeaturedItemEntityType;
use enums_api::api_safe::by_table::generic_inference_jobs::frontend_failure_category_for_old_clients::FrontendFailureCategoryForOldClients;
use enums_api::api_safe::by_table::generic_inference_jobs::frontend_failure_category_for_api_clients::FrontendFailureCategoryForApiClients;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_db::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_db::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums_db::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums_db::by_table::media_files::media_file_subtype::MediaFileSubtype;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_db::by_table::model_weights::{weights_category::WeightsCategory, weights_types::WeightsType};
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_db::by_table::user_bookmarks::user_bookmark_entity_type::UserBookmarkEntityType;
use enums_db::by_table::user_ratings::entity_type::UserRatingEntityType;
use enums_db::by_table::user_ratings::rating_value::UserRatingValue;
use enums_db::by_table::users::user_feature_flag::UserFeatureFlag;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_db::common::job_status_plus::JobStatusPlus;
use enums_db::common::model_type::ModelType;
use enums_db::common::visibility::Visibility;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_api::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums_api::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums_api::by_table::media_files::media_file_subtype::MediaFileSubtype;
use enums_api::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::model_weights::{weights_category::WeightsCategory, weights_types::WeightsType};
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::user_bookmarks::user_bookmark_entity_type::UserBookmarkEntityType;
use enums_api::by_table::user_ratings::entity_type::UserRatingEntityType;
use enums_api::by_table::user_ratings::rating_value::UserRatingValue;
use enums_api::by_table::users::user_feature_flag::UserFeatureFlag;
use enums_api::common::generation::generation_provider::GenerationProvider;
use enums_api::common::job_status_plus::JobStatusPlus;
use enums_api::common::model_type::ModelType;
use enums_api::common::visibility::Visibility;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_public::by_table::media_files::public_media_file_model_type::PublicMediaFileModelType;
use enums_public::by_table::model_weights::public_weights_types::PublicWeightsType;
use tokens::tokens::batch_generations::*;
@@ -2,7 +2,7 @@ use std::collections::HashSet;
use utoipa::ToSchema;
use enums_db::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums_api::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
/// AutoProductCategory can be used in APIs to auto-expand to multiple product categories,
/// deprecated product categories, etc.
@@ -1,8 +1,8 @@
use utoipa::ToSchema;
use enums_db::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums_db::by_table::media_files::media_file_origin_model_type::MediaFileOriginModelType;
use enums_db::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums_api::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums_api::by_table::media_files::media_file_origin_model_type::MediaFileOriginModelType;
use enums_api::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums_public::by_table::media_files::public_media_file_model_type::PublicMediaFileModelType;
use tokens::tokens::model_weights::ModelWeightToken;
@@ -53,14 +53,16 @@ impl MediaFileOriginDetails {
let maybe_model = match (maybe_model_type, maybe_model_token, maybe_model_title) {
(Some(model_type), Some(model_token), Some(model_title)) => {
Some(MediaFileModelDetails::ModelWeight {
model_type: PublicMediaFileModelType::from_enum(model_type),
model_type: enums_convert::by_table::media_files::media_file_origin_model_type::media_file_origin_model_type_to_api(&PublicMediaFileModelType::from_enum(model_type)),
token: model_token,
title: model_title,
})
},
(Some(model_type), None, None) => {
Some(MediaFileModelDetails::SystemModel {
model_type: PublicMediaFileModelType::from_enum(model_type),
model_type: enums_convert::by_table::media_files::media_file_origin_model_type::media_file_origin_model_type_to_api(&PublicMediaFileModelType::from_enum(model_type)),
})
},
_ => None,
@@ -12,8 +12,11 @@ use serde::Serialize;
use utoipa::ToSchema;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums_api::by_table::generic_inference_jobs::inference_job_type::InferenceJobType as ApiInferenceJobType;
use enums_db::by_table::generic_inference_jobs::inference_model_type::InferenceModelType;
use enums_api::by_table::generic_inference_jobs::inference_model_type::InferenceModelType as ApiInferenceModelType;
use enums_db::common::visibility::Visibility;
use http_server_common::request::get_request_header_optional::get_request_header_optional;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -193,7 +196,8 @@ pub async fn enqueue_fbx_to_gltf_handler(
job_type: InferenceJobType::ConvertFbxToGltf,
maybe_product_category: None, // This is not a product
inference_category: InferenceCategory::FormatConversion,
maybe_model_type: Some(InferenceModelType::ConvertFbxToGltf),
maybe_model_type: Some(enums_convert::by_table::generic_inference_jobs::inference_model_type::inference_model_type_to_api(&InferenceModelType::ConvertFbxToGltf)),
maybe_model_token: None,
maybe_input_source_token: Some(&request.media_file_token.as_str()),
maybe_input_source_token_type: None,
@@ -208,7 +212,8 @@ pub async fn enqueue_fbx_to_gltf_handler(
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
priority_level,
requires_keepalive: true,
is_debug_request,
@@ -13,9 +13,13 @@ use serde::Serialize;
use utoipa::ToSchema;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::by_table::generic_inference_jobs::inference_input_source_token_type::InferenceInputSourceTokenType;
use enums_api::by_table::generic_inference_jobs::inference_input_source_token_type::InferenceInputSourceTokenType as ApiInferenceInputSourceTokenType;
use enums_db::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums_api::by_table::generic_inference_jobs::inference_job_type::InferenceJobType as ApiInferenceJobType;
use enums_db::by_table::generic_inference_jobs::inference_model_type::InferenceModelType;
use enums_api::by_table::generic_inference_jobs::inference_model_type::InferenceModelType as ApiInferenceModelType;
use enums_db::common::visibility::Visibility;
use http_server_common::request::get_request_header_optional::get_request_header_optional;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -251,10 +255,12 @@ pub async fn enqueue_render_engine_scene_to_video_handler(
job_type: InferenceJobType::BevyToWorkflow,
maybe_product_category: None, // This is not a product anymore
inference_category: InferenceCategory::ConvertBvhToWorkflow,
maybe_model_type: Some(InferenceModelType::BvhToWorkflow),
maybe_model_type: Some(enums_convert::by_table::generic_inference_jobs::inference_model_type::inference_model_type_to_api(&InferenceModelType::BvhToWorkflow)),
maybe_model_token: None,
maybe_input_source_token: Some(&request.media_file_token.as_str()),
maybe_input_source_token_type: Some(InferenceInputSourceTokenType::MediaFile),
maybe_input_source_token_type: Some(enums_convert::by_table::generic_inference_jobs::inference_input_source_token_type::inference_input_source_token_type_to_api(&InferenceInputSourceTokenType::MediaFile)),
maybe_download_url: None,
maybe_cover_image_media_file_token: None,
maybe_raw_inference_text: None,
@@ -266,7 +272,8 @@ pub async fn enqueue_render_engine_scene_to_video_handler(
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
priority_level,
requires_keepalive: true,
is_debug_request,
@@ -8,8 +8,11 @@ use utoipa::ToSchema;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::visibility::Visibility;
use hashing::sha256::sha256_hash_bytes::sha256_hash_bytes;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -195,14 +198,17 @@ pub async fn create_scene_handler(
// TODO(bt, 2024-02-22): This should be a transaction.
let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs {
maybe_media_class: Some(MediaFileClass::Dimensional),
maybe_media_class: Some(enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&MediaFileClass::Dimensional)),
media_file_type: MediaFileType::SceneRon,
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
upload_type: UploadType::StorytellerEngine,
maybe_engine_category: Some(MediaFileEngineCategory::Scene),
maybe_engine_category: Some(enums_convert::by_table::media_files::media_file_engine_category::media_file_engine_category_to_api(&MediaFileEngineCategory::Scene)),
maybe_animation_type: None,
maybe_mime_type: Some(mime_type),
maybe_prompt_token: None,
@@ -10,7 +10,7 @@ use log::warn;
use utoipa::ToSchema;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType;
use mysql_queries::queries::media_files::get::get_media_file::get_media_file;
use tokens::tokens::media_files::MediaFileToken;
@@ -150,7 +150,8 @@ async fn modern_media_file_lookup(
success: true,
media_file: MediaFileInfo {
token: result.token,
media_type: result.media_type,
media_type: enums_convert::by_table::media_files::media_file_type::media_file_type_to_api(&result.media_type),
public_bucket_path,
created_at: result.created_at,
updated_at: result.updated_at,
@@ -16,8 +16,11 @@ use utoipa::ToSchema;
use web::Data;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums_api::by_table::generic_inference_jobs::inference_job_type::InferenceJobType as ApiInferenceJobType;
use enums_db::by_table::generic_inference_jobs::inference_model_type::InferenceModelType;
use enums_api::by_table::generic_inference_jobs::inference_model_type::InferenceModelType as ApiInferenceModelType;
use http_server_common::request::get_request_header_optional::get_request_header_optional;
use http_server_common::request::get_request_ip::get_request_ip;
use mysql_queries::payloads::generic_inference_args::generic_inference_args::{
@@ -8,8 +8,11 @@ use log::{error, info, warn};
use utoipa::ToSchema;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory;
use enums_api::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory as ApiInferenceJobProductCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums_api::by_table::generic_inference_jobs::inference_job_type::InferenceJobType as ApiInferenceJobType;
use enums_db::common::visibility::Visibility;
use http_server_common::request::get_request_ip::get_request_ip;
use mysql_queries::payloads::generic_inference_args::common::watermark_type::WatermarkType;
@@ -245,7 +248,8 @@ pub async fn enqueue_face_fusion_workflow_handler(
let query_result = insert_generic_inference_job(InsertGenericInferenceArgs {
uuid_idempotency_token: &request.uuid_idempotency_token,
job_type: InferenceJobType::FaceFusion,
maybe_product_category: Some(InferenceJobProductCategory::VidLipsyncFaceFusion),
maybe_product_category: Some(enums_convert::by_table::generic_inference_jobs::inference_job_product_category::inference_job_product_category_to_api(&InferenceJobProductCategory::VidLipsyncFaceFusion)),
inference_category: InferenceCategory::LipsyncAnimation,
maybe_model_type: None,
maybe_model_token: None,
@@ -262,7 +266,8 @@ pub async fn enqueue_face_fusion_workflow_handler(
maybe_creator_user_token: Some(&user_session.user_token_typed),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&set_visibility),
priority_level,
requires_keepalive: plan.workflow_requires_frontend_keepalive(),
is_debug_request,
@@ -8,8 +8,11 @@ use log::{error, info, warn};
use utoipa::ToSchema;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory;
use enums_api::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory as ApiInferenceJobProductCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums_api::by_table::generic_inference_jobs::inference_job_type::InferenceJobType as ApiInferenceJobType;
use enums_db::common::visibility::Visibility;
use http_server_common::request::get_request_ip::get_request_ip;
use mysql_queries::payloads::generic_inference_args::common::watermark_type::WatermarkType;
@@ -263,7 +266,8 @@ pub async fn enqueue_live_portrait_workflow_handler(
let query_result = insert_generic_inference_job(InsertGenericInferenceArgs {
uuid_idempotency_token: &request.uuid_idempotency_token,
job_type: InferenceJobType::LivePortrait,
maybe_product_category: Some(product_category),
maybe_product_category: Some(enums_convert::by_table::generic_inference_jobs::inference_job_product_category::inference_job_product_category_to_api(&product_category)),
inference_category: InferenceCategory::LivePortrait,
maybe_model_type: None,
maybe_model_token: None,
@@ -280,7 +284,8 @@ pub async fn enqueue_live_portrait_workflow_handler(
maybe_creator_user_token: Some(&user_session.user_token_typed),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&set_visibility),
priority_level,
requires_keepalive: plan.workflow_requires_frontend_keepalive(),
is_debug_request,
@@ -11,9 +11,13 @@ use log::{error, info, warn};
use utoipa::ToSchema;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory;
use enums_api::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory as ApiInferenceJobProductCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums_api::by_table::generic_inference_jobs::inference_job_type::InferenceJobType as ApiInferenceJobType;
use enums_db::by_table::generic_inference_jobs::inference_model_type::InferenceModelType;
use enums_api::by_table::generic_inference_jobs::inference_model_type::InferenceModelType as ApiInferenceModelType;
use enums_db::common::visibility::Visibility;
use http_server_common::request::get_request_header_optional::get_request_header_optional;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -277,8 +281,10 @@ pub async fn enqueue_studio_workflow_handler(
global_ip_adapter_token: empty_media_file_token_to_null(request.global_ipa_media_token.as_ref()),
// Other inputs
style_name: Some(request.style),
creator_visibility: Some(set_visibility),
style_name: Some(enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&request.style)),
creator_visibility: Some(enums_convert::common::visibility::visibility_to_db(&set_visibility)),
trim_start_milliseconds: Some(trim_start_millis),
trim_end_milliseconds: Some(trim_end_millis),
strength: maybe_strength,
@@ -322,7 +328,8 @@ pub async fn enqueue_studio_workflow_handler(
let query_result = insert_generic_inference_job(InsertGenericInferenceArgs {
uuid_idempotency_token: &request.uuid_idempotency_token,
job_type: InferenceJobType::ComfyUi,
maybe_product_category: Some(InferenceJobProductCategory::VidStudio),
maybe_product_category: Some(enums_convert::by_table::generic_inference_jobs::inference_job_product_category::inference_job_product_category_to_api(&InferenceJobProductCategory::VidStudio)),
inference_category: InferenceCategory::Workflow,
maybe_model_type: Some(InferenceModelType::ComfyUi), // NB: Model is static during inference
maybe_model_token: None, // NB: Model is static during inference
@@ -339,7 +346,8 @@ pub async fn enqueue_studio_workflow_handler(
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&set_visibility),
priority_level,
requires_keepalive: false,
is_debug_request,
@@ -11,9 +11,13 @@ use log::{error, info, warn};
use utoipa::ToSchema;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory;
use enums_api::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory as ApiInferenceJobProductCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums_api::by_table::generic_inference_jobs::inference_job_type::InferenceJobType as ApiInferenceJobType;
use enums_db::by_table::generic_inference_jobs::inference_model_type::InferenceModelType;
use enums_api::by_table::generic_inference_jobs::inference_model_type::InferenceModelType as ApiInferenceModelType;
use enums_db::common::visibility::Visibility;
use http_server_common::request::get_request_header_optional::get_request_header_optional;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -278,8 +282,10 @@ pub async fn enqueue_video_style_transfer_workflow_handler(
global_ip_adapter_token: empty_media_file_token_to_null(request.global_ipa_media_token.as_ref()),
// Other inputs
style_name: Some(request.style),
creator_visibility: Some(set_visibility),
style_name: Some(enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&request.style)),
creator_visibility: Some(enums_convert::common::visibility::visibility_to_db(&set_visibility)),
trim_start_milliseconds: Some(trim_start_millis),
trim_end_milliseconds: Some(trim_end_millis),
strength: maybe_strength,
@@ -323,7 +329,8 @@ pub async fn enqueue_video_style_transfer_workflow_handler(
let query_result = insert_generic_inference_job(InsertGenericInferenceArgs {
uuid_idempotency_token: &request.uuid_idempotency_token,
job_type: InferenceJobType::ComfyUi,
maybe_product_category: Some(InferenceJobProductCategory::VidStyleTransfer),
maybe_product_category: Some(enums_convert::by_table::generic_inference_jobs::inference_job_product_category::inference_job_product_category_to_api(&InferenceJobProductCategory::VidStyleTransfer)),
inference_category: InferenceCategory::Workflow,
maybe_model_type: Some(InferenceModelType::ComfyUi), // NB: Model is static during inference
maybe_model_token: None, // NB: Model is static during inference
@@ -340,7 +347,8 @@ pub async fn enqueue_video_style_transfer_workflow_handler(
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&set_visibility),
priority_level,
requires_keepalive: false,
is_debug_request,
@@ -11,7 +11,7 @@ use redis::{Commands, RedisResult};
use utoipa::ToSchema;
use enums_db::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory;
use enums_db::common::job_status_plus::JobStatusPlus;
use enums_api::common::job_status_plus::JobStatusPlus;
use mysql_queries::queries::generic_inference::web::get_inference_job_status::get_inference_job_status;
use mysql_queries::queries::generic_inference::web::job_status::GenericInferenceJobStatus;
use redis_schema::keys::inference_job::style_transfer_progress_key::StyleTransferProgressKey;
@@ -225,7 +225,8 @@ fn record_to_payload(
// maybe_style_name: record.request_details.maybe_style_name,
},
status: StatusDetailsResponse {
status: record.status,
status: enums_convert::common::job_status_plus::job_status_plus_to_api(&record.status),
maybe_extra_status_description,
maybe_assigned_worker: maybe_filter_model_name(record.maybe_assigned_worker.as_deref()),
maybe_assigned_cluster: record.maybe_assigned_cluster,
@@ -17,7 +17,7 @@ use utoipa::ToSchema;
use web::Data;
use enums_db::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory;
use enums_db::common::job_status_plus::JobStatusPlus;
use enums_api::common::job_status_plus::JobStatusPlus;
use mysql_queries::queries::generic_inference::web::get_inference_job_status::get_inference_job_status;
use mysql_queries::queries::generic_inference::web::job_status::GenericInferenceJobStatus;
use redis_schema::keys::inference_job::style_transfer_progress_key::StyleTransferProgressKey;
@@ -234,7 +234,8 @@ fn record_to_payload(
// maybe_style_name: record.request_details.maybe_style_name,
},
status: StatusDetailsResponse {
status: record.status,
status: enums_convert::common::job_status_plus::job_status_plus_to_api(&record.status),
maybe_extra_status_description,
maybe_assigned_worker: maybe_filter_model_name(record.maybe_assigned_worker.as_deref()),
maybe_assigned_cluster: record.maybe_assigned_cluster,
@@ -1,7 +1,7 @@
use utoipa::ToSchema;
use enums_db::common::visibility::Visibility;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::common::visibility::Visibility;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName;
use tokens::tokens::media_files::MediaFileToken;
#[derive(Deserialize, ToSchema)]
@@ -12,10 +12,14 @@ use log::{error, info, warn};
use utoipa::ToSchema;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums_api::by_table::generic_inference_jobs::inference_job_type::InferenceJobType as ApiInferenceJobType;
use enums_db::by_table::generic_inference_jobs::inference_model_type::InferenceModelType;
use enums_api::by_table::generic_inference_jobs::inference_model_type::InferenceModelType as ApiInferenceModelType;
use enums_db::common::visibility::Visibility;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName as ApiStyleTransferName;
use http_server_common::request::get_request_header_optional::get_request_header_optional;
use http_server_common::request::get_request_ip::get_request_ip;
use mysql_queries::payloads::generic_inference_args::generic_inference_args::{GenericInferenceArgs, InferenceCategoryAbbreviated, PolymorphicInferenceArgs};
@@ -406,8 +410,10 @@ pub async fn enqueue_video_style_transfer_handler(
global_ip_adapter_token: empty_media_file_token_to_null(request.global_ipa_media_token.as_ref()),
// Other inputs
style_name: Some(request.style),
creator_visibility: Some(set_visibility),
style_name: Some(enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&request.style)),
creator_visibility: Some(enums_convert::common::visibility::visibility_to_db(&set_visibility)),
trim_start_milliseconds: Some(trim_start_millis),
trim_end_milliseconds: Some(trim_end_millis),
strength: maybe_strength,
@@ -468,7 +474,8 @@ pub async fn enqueue_video_style_transfer_handler(
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&set_visibility),
priority_level,
requires_keepalive: plan.workflow_requires_frontend_keepalive(),
is_debug_request,
@@ -16,8 +16,11 @@ use utoipa::ToSchema;
use web::Data;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums_api::by_table::generic_inference_jobs::inference_job_type::InferenceJobType as ApiInferenceJobType;
use enums_db::by_table::generic_inference_jobs::inference_model_type::InferenceModelType;
use enums_api::by_table::generic_inference_jobs::inference_model_type::InferenceModelType as ApiInferenceModelType;
use enums_db::common::visibility::Visibility;
use http_server_common::request::get_request_header_optional::get_request_header_optional;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -220,7 +223,8 @@ pub async fn enqueue_workflow_upload_request(
maybe_title: Some(title),
maybe_description: Some(description),
maybe_commit_hash: Some(commit_hash),
creator_visibility: Some(visibility),
creator_visibility: Some(enums_convert::common::visibility::visibility_to_db(&visibility)),
remove_watermark: None,
// NB: The following args are irrelevant for uploading workflows
maybe_lora_model: None,
@@ -287,7 +291,8 @@ pub async fn enqueue_workflow_upload_request(
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Private,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Private),
priority_level,
requires_keepalive: false, //reverse ... TODO fix this. we set it base on account is premium or not ...
is_debug_request,
@@ -7,6 +7,7 @@ use actix_web::web::{Json, Query};
use actix_web::{web, HttpRequest};
use artcraft_api_defs::analytics::log_active_user::{LogAppActiveUserRequest, LogAppActiveUserResponse};
use enums_db::common::payments_namespace::PaymentsNamespace;
use enums_api::common::payments_namespace::PaymentsNamespace as ApiPaymentsNamespace;
use errors::AnyhowResult;
use http_server_common::request::get_request_ip::get_request_ip;
use log::{info, warn};
@@ -1,5 +1,5 @@
use crate::http_server::session::lookup::user_session_extended::{UserSessionExtended, UserSessionRoleAndPermissions};
use enums_db::by_table::users::user_feature_flag::UserFeatureFlag;
use enums_api::by_table::users::user_feature_flag::UserFeatureFlag;
use std::collections::BTreeSet;
use utoipa::ToSchema;
@@ -54,7 +54,8 @@ pub fn get_permissions(
None => LOGGED_OUT_PERMISSIONS.clone(),
Some(user) => AppStatePermissions {
is_moderator: is_moderator(&user.role),
feature_flags: user.feature_flags.clone_flags(),
feature_flags: enums_convert::by_table::users::user_feature_flag::user_feature_flag_to_api(&user.feature_flags.clone_flags()),
legacy_permission_flags: AppStateLegacyPermissionFlags {
can_use_tts: user.role.can_use_tts,
can_use_w2l: user.role.can_use_w2l,
@@ -9,6 +9,7 @@ use utoipa::ToSchema;
use crockford::crockford_entropy_lower;
use enums_db::by_table::beta_keys::beta_key_product::BetaKeyProduct;
use enums_api::by_table::beta_keys::beta_key_product::BetaKeyProduct as ApiBetaKeyProduct;
use mysql_queries::queries::beta_keys::insert_batch_beta_keys::{insert_batch_beta_keys, InsertBatchArgs};
use mysql_queries::queries::users::user_profiles::get_user_profile_by_username::get_user_profile_by_username;
@@ -8,7 +8,7 @@ use chrono::{DateTime, Utc};
use log::warn;
use utoipa::{IntoParams, ToSchema};
use enums_db::by_table::beta_keys::beta_key_product::BetaKeyProduct;
use enums_api::by_table::beta_keys::beta_key_product::BetaKeyProduct;
use markdown::markdown_with_socials_to_html::markdown_with_socials_to_html;
use mysql_queries::queries::beta_keys::list_beta_keys::{list_beta_keys, FilterToKeys, ListBetaKeysArgs};
use mysql_queries::queries::users::user_profiles::get_user_profile_by_username::get_user_profile_by_username;
@@ -201,7 +201,8 @@ pub async fn list_beta_keys_handler(
.map(|beta_key| {
BetaKeyItem {
token: beta_key.token.clone(),
product: beta_key.product,
product: enums_convert::by_table::beta_keys::beta_key_product::beta_key_product_to_api(&beta_key.product),
key_value: beta_key.key_value,
creator: UserDetailsLight::from_db_fields(
&beta_key.creator_user_token,
@@ -9,7 +9,8 @@ use utoipa::ToSchema;
use crate::http_server::session::lookup::user_session_feature_flags::UserSessionFeatureFlags;
use enums_db::by_table::beta_keys::beta_key_product::BetaKeyProduct;
use enums_db::by_table::users::user_feature_flag::UserFeatureFlag;
use enums_api::by_table::beta_keys::beta_key_product::BetaKeyProduct as ApiBetaKeyProduct;
use enums_api::by_table::users::user_feature_flag::UserFeatureFlag;
use http_server_common::request::get_request_ip::get_request_ip;
use mysql_queries::queries::beta_keys::get_beta_key_by_value::get_beta_key_by_value;
use mysql_queries::queries::beta_keys::redeem_beta_key::redeem_beta_key;
@@ -128,6 +129,7 @@ pub async fn redeem_beta_key_handler(
match beta_key.product {
BetaKeyProduct::Studio => {
enroll_in_studio(&request, &server_state, &user_session, &ip_address)
.await
.map_err(|err| {
@@ -13,6 +13,7 @@ use log::warn;
use utoipa::ToSchema;
use enums_db::by_table::comments::comment_entity_type::CommentEntityType;
use enums_api::by_table::comments::comment_entity_type::CommentEntityType as ApiCommentEntityType;
use http_server_common::request::get_request_ip::get_request_ip;
use markdown::simple_markdown_to_html::simple_markdown_to_html;
use mysql_queries::queries::comments::comment_entity_token::CommentEntityToken;
@@ -18,6 +18,7 @@ use crate::http_server::common_responses::user_avatars::default_avatar_color_fro
use crate::http_server::common_responses::user_avatars::default_avatar_from_username::default_avatar_from_username;
use crate::http_server::common_responses::user_details_lite::{UserDefaultAvatarInfo, UserDetailsLight};
use enums_db::by_table::comments::comment_entity_type::CommentEntityType;
use enums_api::by_table::comments::comment_entity_type::CommentEntityType as ApiCommentEntityType;
use mysql_queries::queries::comments::comment_entity_token::CommentEntityToken;
use mysql_queries::queries::comments::list_comments_for_entity::list_comments_for_entity;
use tokens::tokens::comments::CommentToken;
@@ -8,7 +8,7 @@ use actix_web::web::{Json, Path};
use actix_web::{web, HttpMessage, HttpRequest, HttpResponse};
use artcraft_api_defs::credits::get_session_credits::GetSessionCreditsResponse;
use chrono::{DateTime, Utc};
use enums_db::common::payments_namespace::PaymentsNamespace;
use enums_api::common::payments_namespace::PaymentsNamespace;
use log::{error, warn};
use mysql_queries::queries::prompt_context_items::list_prompt_context_items::list_prompt_context_items;
use mysql_queries::queries::prompts::get_prompt::{get_prompt, get_prompt_from_connection};
@@ -64,7 +64,8 @@ pub async fn get_session_credits_handler(
let maybe_wallet = find_primary_wallet_for_owner_using_connection(
&user_token,
path.namespace,
enums_convert::common::payments_namespace::payments_namespace_to_api(&path.namespace),
&mut mysql_connection,
).await.map_err(|err| {
error!("Error finding primary wallet for user: {:?}, error: {:?}", user_token, err);
@@ -12,6 +12,7 @@ use composite_identifiers::by_table::audit_logs::audit_log_entity::AuditLogEntit
use composite_identifiers::by_table::featured_items::featured_item_entity::FeaturedItemEntity;
use enums_db::by_table::audit_logs::audit_log_entity_action::AuditLogEntityAction;
use enums_db::by_table::featured_items::featured_item_entity_type::FeaturedItemEntityType;
use enums_api::by_table::featured_items::featured_item_entity_type::FeaturedItemEntityType as ApiFeaturedItemEntityType;
use enums_db::common::visibility::Visibility;
use http_server_common::request::get_request_ip::get_request_ip;
use mysql_queries::queries::audit_logs::insert_audit_log_transactional::{insert_audit_log_transactional, InsertAuditLogTransactionalArgs};
@@ -149,7 +150,8 @@ pub async fn create_featured_item_handler(
let token = MediaFileToken::new_from_str(&request.entity_token);
let result = update_media_file_visibility_transactional(UpdateMediaFileTransactionalArgs {
media_file_token: &token,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
transaction: &mut transaction,
}).await;
@@ -12,6 +12,7 @@ use composite_identifiers::by_table::audit_logs::audit_log_entity::AuditLogEntit
use composite_identifiers::by_table::featured_items::featured_item_entity::FeaturedItemEntity;
use enums_db::by_table::audit_logs::audit_log_entity_action::AuditLogEntityAction;
use enums_db::by_table::featured_items::featured_item_entity_type::FeaturedItemEntityType;
use enums_api::by_table::featured_items::featured_item_entity_type::FeaturedItemEntityType as ApiFeaturedItemEntityType;
use http_server_common::request::get_request_ip::get_request_ip;
use mysql_queries::queries::audit_logs::insert_audit_log_transactional::{insert_audit_log_transactional, InsertAuditLogTransactionalArgs};
use mysql_queries::queries::featured_items::delete_featured_item::delete_featured_item;
@@ -10,6 +10,7 @@ use utoipa::ToSchema;
use composite_identifiers::by_table::featured_items::featured_item_entity::FeaturedItemEntity;
use enums_db::by_table::featured_items::featured_item_entity_type::FeaturedItemEntityType;
use enums_api::by_table::featured_items::featured_item_entity_type::FeaturedItemEntityType as ApiFeaturedItemEntityType;
use mysql_queries::queries::featured_items::get_is_featured_by_token::get_is_featured_by_token;
use tokens::tokens::media_files::MediaFileToken;
use tokens::tokens::model_weights::ModelWeightToken;
@@ -17,7 +17,7 @@ use artcraft_router::generate::generate_image::generate_image_request::GenerateI
use enums_api::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums_api::common::generation::common_image_model::CommonImageModel;
use enums_api::common::generation::common_video_resolution::CommonVideoResolution;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider;
/// Estimate the credit and USD cost of an image generation request.
/// Does not require authentication and does not charge any credits.
@@ -12,7 +12,7 @@ use artcraft_router::api::image_list_ref::ImageListRef;
use artcraft_router::api::provider::Provider as RouterProvider;
use artcraft_router::generate::generate_splat::generate_splat_request::GenerateSplatRequest;
use enums_api::common::generation::common_splat_model::CommonSplatModel;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider;
use tokens::tokens::media_files::MediaFileToken;
@@ -16,7 +16,7 @@ use artcraft_router::generate::generate_video::generate_video_request::GenerateV
use enums_api::common::generation::common_aspect_ratio::CommonAspectRatio;
use enums_api::common::generation::common_video_model::CommonVideoModel;
use enums_api::common::generation::common_video_resolution::CommonVideoResolution;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider;
/// Estimate the credit and USD cost of a video generation request.
@@ -169,7 +169,8 @@ pub async fn flux_2_lora_edit_image_angle_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::Flux2LoraAngles),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: None,
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -213,7 +214,8 @@ pub async fn flux_2_lora_edit_image_angle_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -170,7 +170,8 @@ pub async fn qwen_edit_2511_edit_image_angle_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::QwenEdit2511Angles),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.additional_prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -214,7 +215,8 @@ pub async fn qwen_edit_2511_edit_image_angle_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -12,9 +12,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::edit::flux_pro_kontext_max_edit_image::{FluxProKontextMaxEditImageNumImages, FluxProKontextMaxEditImageRequest, FluxProKontextMaxEditImageResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::webhook::image::edit::enqueue_flux_pro_kontext_max_edit_webhook::{enqueue_flux_pro_kontext_max_edit_webhook, FluxProKontextMaxArgs, FluxProKontextMaxNumImages};
@@ -214,7 +218,8 @@ pub async fn flux_pro_kontext_max_edit_image_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::FluxProKontextMax),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -258,7 +263,8 @@ pub async fn flux_pro_kontext_max_edit_image_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
phantom: Default::default(),
}).await;
@@ -11,11 +11,17 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::edit::gemini_25_flash_edit_image::{Gemini25FlashEditImageNumImages, Gemini25FlashEditImageRequest, Gemini25FlashEditImageResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::payments_namespace::PaymentsNamespace;
use enums_api::common::payments_namespace::PaymentsNamespace as ApiPaymentsNamespace;
use enums_db::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums_api::common::stripe_subscription_status::StripeSubscriptionStatus as ApiStripeSubscriptionStatus;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::webhook::image::edit::enqueue_gemini_25_flash_edit_webhook::{enqueue_gemini_25_flash_edit_webhook, Gemini25FlashEditArgs, Gemini25FlashEditNumImages};
@@ -93,6 +99,7 @@ pub async fn gemini_25_flash_edit_image_handler(
let result = find_subscription_for_owner_user_using_connection(
user_token,
PaymentsNamespace::Artcraft,
&mut mysql_connection,
).await;
@@ -231,7 +238,8 @@ pub async fn gemini_25_flash_edit_image_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::Gemini25Flash),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -276,7 +284,8 @@ pub async fn gemini_25_flash_edit_image_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -12,11 +12,17 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::edit::gpt_image_1_edit_image::{GptImage1EditImageImageQuality, GptImage1EditImageImageSize, GptImage1EditImageNumImages, GptImage1EditImageRequest, GptImage1EditImageResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::payments_namespace::PaymentsNamespace;
use enums_api::common::payments_namespace::PaymentsNamespace as ApiPaymentsNamespace;
use enums_db::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums_api::common::stripe_subscription_status::StripeSubscriptionStatus as ApiStripeSubscriptionStatus;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -91,6 +97,7 @@ pub async fn gpt_image_1_edit_image_handler(
let result = find_subscription_for_owner_user_using_connection(
&user_token,
PaymentsNamespace::Artcraft,
&mut mysql_connection,
).await;
@@ -253,7 +260,8 @@ pub async fn gpt_image_1_edit_image_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::GptImage1),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -298,7 +306,8 @@ pub async fn gpt_image_1_edit_image_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -12,9 +12,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::edit::qwen_edit_image::{QwenEditImageAcceleration, QwenEditImageNumImages, QwenEditImageRequest, QwenEditImageResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -205,7 +209,8 @@ pub async fn qwen_edit_image_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::Qwen),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -250,7 +255,8 @@ pub async fn qwen_edit_image_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -11,9 +11,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::edit::seededit_3_edit_image::{SeedEdit3EditImageRequest, SeedEdit3EditImageResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::webhook::image::edit::enqueue_seededit_v3_edit_webhook::{enqueue_seededit_v3_edit_webhook, SeedEditV3EditArgs};
@@ -175,7 +179,8 @@ pub async fn seededit_3_edit_image_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::SeedEdit3),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -219,7 +224,8 @@ pub async fn seededit_3_edit_image_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
phantom: Default::default(),
}).await;
@@ -12,8 +12,11 @@ use artcraft_api_defs::generate::image::edit::flux_pro_kontext_max_edit_image::F
use artcraft_api_defs::generate::image::text::generate_flux_1_dev_text_to_image::{GenerateFlux1DevTextToImageAspectRatio, GenerateFlux1DevTextToImageNumImages, GenerateFlux1DevTextToImageRequest, GenerateFlux1DevTextToImageResponse};
use enums_db::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::webhook::image::text::enqueue_flux_1_dev_text_to_image_webhook::enqueue_flux_1_dev_text_to_image_webhook;
use fal_client::requests::webhook::image::text::enqueue_flux_1_dev_text_to_image_webhook::{Flux1DevArgs, Flux1DevAspectRatio, Flux1DevNumImages};
@@ -194,7 +197,8 @@ pub async fn generate_flux_1_dev_text_to_image_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Flux1Dev),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -220,7 +224,8 @@ pub async fn generate_flux_1_dev_text_to_image_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
phantom: Default::default(),
}).await;
@@ -274,7 +279,8 @@ async fn insert_mock_failure_job(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token,
maybe_model_type: Some(ModelType::Flux1Dev),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: prompt,
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -299,7 +305,8 @@ async fn insert_mock_failure_job(
maybe_creator_user_token,
maybe_avt_token,
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
maybe_frontend_failure_category,
maybe_failure_reason,
mysql_executor: &mut *transaction,
@@ -9,8 +9,11 @@ use actix_web::web::Json;
use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::text::generate_flux_1_schnell_text_to_image::{GenerateFlux1SchnellTextToImageAspectRatio, GenerateFlux1SchnellTextToImageNumImages, GenerateFlux1SchnellTextToImageRequest, GenerateFlux1SchnellTextToImageResponse};
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::webhook::image::text::enqueue_flux_1_schnell_text_to_image_webhook::enqueue_flux_1_schnell_text_to_image_webhook;
use fal_client::requests::webhook::image::text::enqueue_flux_1_schnell_text_to_image_webhook::{Flux1SchnellArgs, Flux1SchnellAspectRatio, Flux1SchnellNumImages};
@@ -174,7 +177,8 @@ pub async fn generate_flux_1_schnell_text_to_image_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Flux1Schnell),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -200,7 +204,8 @@ pub async fn generate_flux_1_schnell_text_to_image_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
phantom: Default::default(),
}).await;
@@ -12,8 +12,11 @@ use artcraft_api_defs::generate::image::text::generate_flux_1_schnell_text_to_im
use artcraft_api_defs::generate::image::text::generate_flux_pro_11_text_to_image::GenerateFluxPro11TextToImageResponse;
use artcraft_api_defs::generate::image::text::generate_flux_pro_11_text_to_image::{GenerateFluxPro11TextToImageAspectRatio, GenerateFluxPro11TextToImageNumImages, GenerateFluxPro11TextToImageRequest};
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::text::enqueue_flux_pro_11_text_to_image_webhook::FluxPro11Args;
@@ -158,7 +161,8 @@ pub async fn generate_flux_pro_11_text_to_image_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::FluxPro11),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -185,7 +189,8 @@ pub async fn generate_flux_pro_11_text_to_image_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -12,8 +12,11 @@ use artcraft_api_defs::generate::image::text::generate_flux_pro_11_text_to_image
use artcraft_api_defs::generate::image::text::generate_flux_pro_11_ultra_text_to_image::GenerateFluxPro11UltraTextToImageResponse;
use artcraft_api_defs::generate::image::text::generate_flux_pro_11_ultra_text_to_image::{GenerateFluxPro11UltraTextToImageAspectRatio, GenerateFluxPro11UltraTextToImageNumImages, GenerateFluxPro11UltraTextToImageRequest};
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::image::text::enqueue_flux_pro_11_ultra_text_to_image_webhook::FluxPro11UltraArgs;
@@ -162,7 +165,8 @@ pub async fn generate_flux_pro_11_ultra_text_to_image_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::FluxPro11Ultra),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -189,7 +193,8 @@ pub async fn generate_flux_pro_11_ultra_text_to_image_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -12,10 +12,15 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::text::generate_gpt_image_1_text_to_image::{GenerateGptImage1TextToImageImageQuality, GenerateGptImage1TextToImageImageSize, GenerateGptImage1TextToImageNumImages, GenerateGptImage1TextToImageRequest, GenerateGptImage1TextToImageResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::payments_namespace::PaymentsNamespace;
use enums_api::common::payments_namespace::PaymentsNamespace as ApiPaymentsNamespace;
use enums_db::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums_api::common::stripe_subscription_status::StripeSubscriptionStatus as ApiStripeSubscriptionStatus;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -88,6 +93,7 @@ pub async fn generate_gpt_image_1_text_to_image_handler(
let result = find_subscription_for_owner_user_using_connection(
&user_token,
PaymentsNamespace::Artcraft,
&mut mysql_connection,
).await;
@@ -204,7 +210,8 @@ pub async fn generate_gpt_image_1_text_to_image_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::GptImage1),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -231,7 +238,8 @@ pub async fn generate_gpt_image_1_text_to_image_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -11,9 +11,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::inpaint::flux_dev_juggernaut_inpaint_image::{FluxDevJuggernautInpaintImageNumImages, FluxDevJuggernautInpaintImageRequest, FluxDevJuggernautInpaintImageResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::webhook::image::infill::enqueue_flux_dev_juggernaut_infill_webhook::{enqueue_flux_dev_juggernaut_infill_webhook, FluxDevJuggernautInfillArgs, FluxDevJuggernautInfillNumImages};
@@ -213,7 +217,8 @@ pub async fn flux_dev_juggernaut_inpaint_image_handler(
// TODO(bt,2025-07-31): Should we have an "inpaint" specific variant?
// Depends on how we want to model provider / feature matrices, routing, and results going forward.
maybe_model_type: Some(ModelType::FluxDevJuggernaut),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -261,7 +266,8 @@ pub async fn flux_dev_juggernaut_inpaint_image_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
phantom: Default::default(),
}).await;
@@ -11,9 +11,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::inpaint::flux_pro_1_inpaint_image::{FluxPro1InpaintImageNumImages, FluxPro1InpaintImageRequest, FluxPro1InpaintImageResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::webhook::image::infill::enqueue_flux_pro_1_infill_webhook::{enqueue_flux_pro_1_infill_webhook, FluxPro1InfillArgs, FluxPro1InfillNumImages};
@@ -213,7 +217,8 @@ pub async fn flux_pro_1_inpaint_image_handler(
// TODO(bt,2025-07-31): Should we have an "inpaint" specific variant?
// Depends on how we want to model provider / feature matrices, routing, and results going forward.
maybe_model_type: Some(ModelType::FluxPro1),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -261,7 +266,8 @@ pub async fn flux_pro_1_inpaint_image_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
phantom: Default::default(),
}).await;
@@ -226,7 +226,8 @@ pub async fn bytedance_seedream_5_lite_multi_function_image_gen_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::Seedream5Lite),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -272,7 +273,8 @@ pub async fn bytedance_seedream_5_lite_multi_function_image_gen_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,9 +15,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::multi_function::bytedance_seedream_v4_multi_function_image_gen::{BytedanceSeedreamV4MultiFunctionImageGenImageSize, BytedanceSeedreamV4MultiFunctionImageGenNumImages, BytedanceSeedreamV4MultiFunctionImageGenRequest, BytedanceSeedreamV4MultiFunctionImageGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -250,7 +254,8 @@ pub async fn bytedance_seedream_v4_multi_function_image_gen_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::Seedream4),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -297,7 +302,8 @@ pub async fn bytedance_seedream_v4_multi_function_image_gen_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,9 +15,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::multi_function::bytedance_seedream_v4p5_multi_function_image_gen::{BytedanceSeedreamV4p5MultiFunctionImageGenImageSize, BytedanceSeedreamV4p5MultiFunctionImageGenNumImages, BytedanceSeedreamV4p5MultiFunctionImageGenRequest, BytedanceSeedreamV4p5MultiFunctionImageGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -248,7 +252,8 @@ pub async fn bytedance_seedream_v4p5_multi_function_image_gen_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::Seedream4p5),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -295,7 +300,8 @@ pub async fn bytedance_seedream_v4p5_multi_function_image_gen_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,11 +15,17 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::multi_function::gpt_image_1p5_multi_function_image_gen::{GptImage1p5MultiFunctionImageGenBackground, GptImage1p5MultiFunctionImageGenInputFidelity, GptImage1p5MultiFunctionImageGenNumImages, GptImage1p5MultiFunctionImageGenQuality, GptImage1p5MultiFunctionImageGenRequest, GptImage1p5MultiFunctionImageGenResponse, GptImage1p5MultiFunctionImageGenSize};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::payments_namespace::PaymentsNamespace;
use enums_api::common::payments_namespace::PaymentsNamespace as ApiPaymentsNamespace;
use enums_db::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums_api::common::stripe_subscription_status::StripeSubscriptionStatus as ApiStripeSubscriptionStatus;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -96,6 +102,7 @@ pub async fn gpt_image_1p5_multi_function_image_gen_handler(
let result = find_subscription_for_owner_user_using_connection(
user_token,
PaymentsNamespace::Artcraft,
&mut mysql_connection,
).await;
@@ -338,7 +345,8 @@ pub async fn gpt_image_1p5_multi_function_image_gen_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::GptImage1p5),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -385,7 +393,8 @@ pub async fn gpt_image_1p5_multi_function_image_gen_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -249,7 +249,8 @@ pub async fn nano_banana_2_multi_function_image_gen_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::NanoBanana2),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -295,7 +296,8 @@ pub async fn nano_banana_2_multi_function_image_gen_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -16,11 +16,17 @@ use artcraft_api_defs::generate::image::edit::gemini_25_flash_edit_image::{Gemin
use artcraft_api_defs::generate::image::multi_function::nano_banana_multi_function_image_gen::{NanoBananaMultiFunctionImageGenAspectRatio, NanoBananaMultiFunctionImageGenNumImages, NanoBananaMultiFunctionImageGenRequest, NanoBananaMultiFunctionImageGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::payments_namespace::PaymentsNamespace;
use enums_api::common::payments_namespace::PaymentsNamespace as ApiPaymentsNamespace;
use enums_db::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums_api::common::stripe_subscription_status::StripeSubscriptionStatus as ApiStripeSubscriptionStatus;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -99,6 +105,7 @@ pub async fn nano_banana_multi_function_image_gen_handler(
let result = find_subscription_for_owner_user_using_connection(
user_token,
PaymentsNamespace::Artcraft,
&mut mysql_connection,
).await;
@@ -281,7 +288,8 @@ pub async fn nano_banana_multi_function_image_gen_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::NanoBanana),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -328,7 +336,8 @@ pub async fn nano_banana_multi_function_image_gen_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,11 +15,17 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::multi_function::nano_banana_pro_multi_function_image_gen::{NanoBananaProMultiFunctionImageGenAspectRatio, NanoBananaProMultiFunctionImageGenImageResolution, NanoBananaProMultiFunctionImageGenNumImages, NanoBananaProMultiFunctionImageGenRequest, NanoBananaProMultiFunctionImageGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::payments_namespace::PaymentsNamespace;
use enums_api::common::payments_namespace::PaymentsNamespace as ApiPaymentsNamespace;
use enums_db::common::stripe_subscription_status::StripeSubscriptionStatus;
use enums_api::common::stripe_subscription_status::StripeSubscriptionStatus as ApiStripeSubscriptionStatus;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -96,6 +102,7 @@ pub async fn nano_banana_pro_multi_function_image_gen_handler(
let result = find_subscription_for_owner_user_using_connection(
user_token,
PaymentsNamespace::Artcraft,
&mut mysql_connection,
).await;
@@ -296,7 +303,8 @@ pub async fn nano_banana_pro_multi_function_image_gen_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(&user_token),
maybe_model_type: Some(ModelType::NanoBananaPro),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -343,7 +351,8 @@ pub async fn nano_banana_pro_multi_function_image_gen_handler(
maybe_creator_user_token: Some(&user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -10,7 +10,7 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::image::bg_removal::remove_image_background::RemoveImageBackgroundRequest;
use artcraft_api_defs::generate::image::bg_removal::remove_image_background::RemoveImageBackgroundResponse;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::common::visibility::Visibility;
use enums_api::common::visibility::Visibility;
use fal_client::requests::webhook::image::background::remove_background_rembg_webhook::{remove_background_rembg_webhook, RemoveBackgroundRembgWebhookArgs};
use http_server_common::request::get_request_ip::get_request_ip;
use log::{error, info, warn};
@@ -155,7 +155,8 @@ pub async fn remove_image_background_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *mysql_connection,
phantom: Default::default(),
}).await;
@@ -10,7 +10,7 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::object::generate_hunyuan_2_0_image_to_3d::GenerateHunyuan20ImageTo3dRequest;
use artcraft_api_defs::generate::object::generate_hunyuan_2_0_image_to_3d::GenerateHunyuan20ImageTo3dResponse;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::common::visibility::Visibility;
use enums_api::common::visibility::Visibility;
use fal_client::requests::webhook::object::enqueue_hunyuan_3d_2_image_to_3d_webhook::enqueue_hunyuan_3d_2_image_to_3d_webhook;
use fal_client::requests::webhook::object::enqueue_hunyuan_3d_2_image_to_3d_webhook::Hunyuan3d2Args;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -154,7 +154,8 @@ pub async fn generate_hunyuan_2_0_image_to_3d_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *mysql_connection,
phantom: Default::default(),
}).await;
@@ -10,7 +10,7 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::object::generate_hunyuan_2_1_image_to_3d::GenerateHunyuan21ImageTo3dRequest;
use artcraft_api_defs::generate::object::generate_hunyuan_2_1_image_to_3d::GenerateHunyuan21ImageTo3dResponse;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::common::visibility::Visibility;
use enums_api::common::visibility::Visibility;
use fal_client::requests::webhook::object::enqueue_hunyuan_3d_21_image_to_3d_webhook::enqueue_hunyuan_3d_2_1_image_to_3d_webhook;
use fal_client::requests::webhook::object::enqueue_hunyuan_3d_21_image_to_3d_webhook::Hunyuan3d21Args;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -154,7 +154,8 @@ pub async fn generate_hunyuan_2_1_image_to_3d_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *mysql_connection,
phantom: Default::default(),
}).await;
@@ -303,7 +303,8 @@ pub async fn generate_hunyuan3d_v3_multi_function_object_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Hunyuan3d3),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -374,7 +375,8 @@ pub async fn generate_hunyuan3d_v3_multi_function_object_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
phantom: Default::default(),
})
@@ -175,7 +175,8 @@ pub async fn generate_worldlabs_marble_0p1_mini_splat_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(user_token),
maybe_model_type: Some(ModelType::Marble0p1Mini),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -221,7 +222,8 @@ pub async fn generate_worldlabs_marble_0p1_mini_splat_handler(
maybe_creator_user_token: Some(user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
phantom: Default::default(),
}).await;
@@ -175,7 +175,8 @@ pub async fn generate_worldlabs_marble_0p1_plus_splat_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: Some(user_token),
maybe_model_type: Some(ModelType::Marble0p1Plus),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -221,7 +222,8 @@ pub async fn generate_worldlabs_marble_0p1_plus_splat_handler(
maybe_creator_user_token: Some(user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
phantom: Default::default(),
}).await;
@@ -15,8 +15,11 @@ use artcraft_api_defs::generate::video::generate_kling_1_6_pro_image_to_video::{
use artcraft_api_defs::generate::video::generate_kling_1_6_pro_image_to_video::{GenerateKling16ProDuration, GenerateKling16ProImageToVideoResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_kling_v1p6_pro_image_to_video_webhook::{enqueue_kling_v1p6_pro_image_to_video_webhook, Kling1p6ProArgs, Kling1p6ProAspectRatio, Kling1p6ProDuration};
@@ -217,7 +220,8 @@ pub async fn generate_kling_1_6_pro_video_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Kling16Pro),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -246,7 +250,8 @@ pub async fn generate_kling_1_6_pro_video_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -13,8 +13,11 @@ use artcraft_api_defs::generate::video::generate_kling_2_1_master_image_to_video
use artcraft_api_defs::generate::video::generate_kling_2_1_master_image_to_video::{GenerateKling21MasterDuration, GenerateKling21MasterImageToVideoResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_kling_v2p1_master_image_to_video_webhook::{enqueue_kling_v2p1_master_image_to_video_webhook, Kling2p1MasterArgs, Kling2p1MasterAspectRatio, Kling2p1MasterDuration};
@@ -204,7 +207,8 @@ pub async fn generate_kling_2_1_master_video_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Kling21Master),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -231,7 +235,8 @@ pub async fn generate_kling_2_1_master_video_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,8 +15,11 @@ use artcraft_api_defs::generate::video::generate_kling_2_1_pro_image_to_video::{
use artcraft_api_defs::generate::video::generate_kling_2_1_pro_image_to_video::{GenerateKling21ProDuration, GenerateKling21ProImageToVideoResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_kling_v2p1_pro_image_to_video_webhook::enqueue_kling_v2p1_pro_image_to_video_webhook;
@@ -219,7 +222,8 @@ pub async fn generate_kling_2_1_pro_video_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Kling21Pro),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -246,7 +250,8 @@ pub async fn generate_kling_2_1_pro_video_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -17,8 +17,11 @@ use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_vide
use artcraft_api_defs::generate::video::generate_seedance_1_0_lite_image_to_video::{GenerateSeedance10LiteAspectRatio, GenerateSeedance10LiteDuration};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_seedance_1_lite_image_to_video_webhook::Seedance1LiteDuration;
@@ -234,7 +237,8 @@ pub async fn generate_seedance_1_0_lite_image_to_video_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Seedance10Lite),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -261,7 +265,8 @@ pub async fn generate_seedance_1_0_lite_image_to_video_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -17,8 +17,11 @@ use artcraft_api_defs::generate::video::generate_seedance_1_0_pro_image_to_video
use artcraft_api_defs::generate::video::generate_seedance_1_0_pro_image_to_video::GenerateSeedance10ProResolution;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_seedance_1_pro_image_to_video_webhook::enqueue_seedance_1_pro_image_to_video_webhook;
@@ -211,7 +214,8 @@ pub async fn generate_seedance_1_0_pro_image_to_video_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Seedance10Pro),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -238,7 +242,8 @@ pub async fn generate_seedance_1_0_pro_image_to_video_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -17,8 +17,11 @@ use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateV
use artcraft_api_defs::generate::video::generate_veo_2_image_to_video::GenerateVeo2ImageToVideoResponse;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_veo_2_image_to_video_webhook::enqueue_veo_2_image_to_video_webhook;
@@ -215,7 +218,8 @@ pub async fn generate_veo_2_image_to_video_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Veo2),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -244,7 +248,8 @@ pub async fn generate_veo_2_image_to_video_handler(
.map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -14,8 +14,11 @@ use anyhow::anyhow;
use artcraft_api_defs::generate::video::generate_veo_3_fast_image_to_video::{GenerateVeo3FastDuration, GenerateVeo3FastImageToVideoRequest, GenerateVeo3FastImageToVideoResponse, GenerateVeo3FastResolution};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_veo_3_fast_image_to_video_webhook::{enqueue_veo_3_fast_image_to_video_webhook, Veo3FastArgs, Veo3FastDuration, Veo3FastResolution};
@@ -208,7 +211,8 @@ pub async fn generate_veo_3_fast_image_to_video_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Veo3Fast),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -237,7 +241,8 @@ pub async fn generate_veo_3_fast_image_to_video_handler(
.map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -14,8 +14,11 @@ use anyhow::anyhow;
use artcraft_api_defs::generate::video::generate_veo_3_image_to_video::{GenerateVeo3AspectRatio, GenerateVeo3Duration, GenerateVeo3ImageToVideoRequest, GenerateVeo3ImageToVideoResponse, GenerateVeo3Resolution};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
use fal_client::requests::webhook::video::image::enqueue_veo_3_image_to_video_webhook::{enqueue_veo_3_image_to_video_webhook, Veo3Args, Veo3AspectRatio, Veo3Duration, Veo3Resolution};
@@ -216,7 +219,8 @@ pub async fn generate_veo_3_image_to_video_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Veo3),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: Some(prompt),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -245,7 +249,8 @@ pub async fn generate_veo_3_image_to_video_handler(
.map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,9 +15,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::video::multi_function::kling_2_5_turbo_multi_function_video_gen::{Kling2p5TurboProMultiFunctionVideoGenAspectRatio, Kling2p5TurboProMultiFunctionVideoGenDuration, Kling2p5TurboProMultiFunctionVideoGenRequest, Kling2p5TurboProMultiFunctionVideoGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -257,7 +261,8 @@ pub async fn kling_2p5_turbo_pro_multi_function_video_gen_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Kling2p5TurboPro),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -315,7 +320,8 @@ pub async fn kling_2p5_turbo_pro_multi_function_video_gen_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,9 +15,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::video::multi_function::kling_2_6_multi_function_video_gen::{Kling2p6ProMultiFunctionVideoGenAspectRatio, Kling2p6ProMultiFunctionVideoGenDuration, Kling2p6ProMultiFunctionVideoGenRequest, Kling2p6ProMultiFunctionVideoGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -256,7 +260,8 @@ pub async fn kling_2p6_pro_multi_function_video_gen_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Kling2p6Pro),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -314,7 +319,8 @@ pub async fn kling_2p6_pro_multi_function_video_gen_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,9 +15,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::video::multi_function::kling_3p0_pro_multi_function_video_gen::{Kling3p0ProMultiFunctionVideoGenAspectRatio, Kling3p0ProMultiFunctionVideoGenDuration, Kling3p0ProMultiFunctionVideoGenRequest, Kling3p0ProMultiFunctionVideoGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -305,7 +309,8 @@ pub async fn kling_3p0_pro_multi_function_video_gen_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Kling3p0Pro),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -363,7 +368,8 @@ pub async fn kling_3p0_pro_multi_function_video_gen_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,9 +15,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::video::multi_function::kling_3p0_standard_multi_function_video_gen::{Kling3p0StandardMultiFunctionVideoGenAspectRatio, Kling3p0StandardMultiFunctionVideoGenDuration, Kling3p0StandardMultiFunctionVideoGenRequest, Kling3p0StandardMultiFunctionVideoGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -305,7 +309,8 @@ pub async fn kling_3p0_standard_multi_function_video_gen_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Kling3p0Standard),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -363,7 +368,8 @@ pub async fn kling_3p0_standard_multi_function_video_gen_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -310,7 +310,8 @@ pub async fn seedance_1p5_pro_multi_function_video_gen_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Seedance1p5Pro),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -368,7 +369,8 @@ pub async fn seedance_1p5_pro_multi_function_video_gen_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -269,7 +269,8 @@ pub async fn seedance_2p0_multi_function_video_gen_handler(
prompt_type: PromptType::ArtcraftApp,
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Seedance2p0),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -314,7 +315,8 @@ pub async fn seedance_2p0_multi_function_video_gen_handler(
for media_token in tokens {
context_items.push(PromptContextItem {
media_token: media_token.clone(),
context_semantic_type: semantic_type,
context_semantic_type: enums_convert::by_table::prompt_context_items::prompt_context_semantic_type::prompt_context_semantic_type_to_api(&semantic_type),
});
}
}
@@ -364,7 +366,8 @@ pub async fn seedance_2p0_multi_function_video_gen_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
phantom: Default::default(),
}
@@ -15,9 +15,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::video::multi_function::sora_2_multi_function_video_gen::{Sora2MultiFunctionVideoGenAspectRatio, Sora2MultiFunctionVideoGenDuration, Sora2MultiFunctionVideoGenRequest, Sora2MultiFunctionVideoGenResolution, Sora2MultiFunctionVideoGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -276,7 +280,8 @@ pub async fn sora_2_multi_function_video_gen_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Sora2),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -334,7 +339,8 @@ pub async fn sora_2_multi_function_video_gen_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,9 +15,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::video::multi_function::sora_2_pro_multi_function_video_gen::{Sora2ProMultiFunctionVideoGenAspectRatio, Sora2ProMultiFunctionVideoGenDuration, Sora2ProMultiFunctionVideoGenRequest, Sora2ProMultiFunctionVideoGenResolution, Sora2ProMultiFunctionVideoGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -278,7 +282,8 @@ pub async fn sora_2_pro_multi_function_video_gen_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Sora2Pro),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -336,7 +341,8 @@ pub async fn sora_2_pro_multi_function_video_gen_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,9 +15,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::video::multi_function::veo_3p1_fast_multi_function_video_gen::{Veo3p1FastMultiFunctionVideoGenAspectRatio, Veo3p1FastMultiFunctionVideoGenDuration, Veo3p1FastMultiFunctionVideoGenRequest, Veo3p1FastMultiFunctionVideoGenResolution, Veo3p1FastMultiFunctionVideoGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -341,7 +345,8 @@ pub async fn veo_3p1_fast_multi_function_video_gen_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Veo3p1Fast),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -399,7 +404,8 @@ pub async fn veo_3p1_fast_multi_function_video_gen_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -15,9 +15,13 @@ use actix_web::{web, HttpRequest};
use artcraft_api_defs::generate::video::multi_function::veo_3p1_multi_function_video_gen::{Veo3p1MultiFunctionVideoGenAspectRatio, Veo3p1MultiFunctionVideoGenDuration, Veo3p1MultiFunctionVideoGenRequest, Veo3p1MultiFunctionVideoGenResolution, Veo3p1MultiFunctionVideoGenResponse};
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType;
use enums_api::by_table::prompt_context_items::prompt_context_semantic_type::PromptContextSemanticType as ApiPromptContextSemanticType;
use enums_db::by_table::prompts::prompt_type::PromptType;
use enums_api::by_table::prompts::prompt_type::PromptType as ApiPromptType;
use enums_db::common::generation::generation_provider::GenerationProvider;
use enums_api::common::generation::generation_provider::GenerationProvider as ApiGenerationProvider;
use enums_db::common::model_type::ModelType;
use enums_api::common::model_type::ModelType as ApiModelType;
use enums_db::common::visibility::Visibility;
use fal_client::creds::open_ai_api_key::OpenAiApiKey;
use fal_client::requests::traits::fal_request_cost_calculator_trait::FalRequestCostCalculator;
@@ -341,7 +345,8 @@ pub async fn veo_3p1_multi_function_video_gen_handler(
.as_ref()
.map(|s| &s.user_token),
maybe_model_type: Some(ModelType::Veo3p1),
maybe_generation_provider: Some(GenerationProvider::Artcraft),
maybe_generation_provider: Some(enums_convert::common::generation::generation_provider::generation_provider_to_api(&GenerationProvider::Artcraft)),
maybe_positive_prompt: request.prompt.as_deref(),
maybe_negative_prompt: None,
maybe_other_args: None,
@@ -399,7 +404,8 @@ pub async fn veo_3p1_multi_function_video_gen_handler(
maybe_creator_user_token: maybe_user_session.as_ref().map(|s| &s.user_token),
maybe_avt_token: maybe_avt_token.as_ref(),
creator_ip_address: &ip_address,
creator_set_visibility: Visibility::Public,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&Visibility::Public),
mysql_executor: &mut *transaction,
starting_job_status_override: None,
maybe_frontend_failure_category: None,
@@ -12,10 +12,15 @@ use base64::Engine;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use cloud_storage::bucket_client::BucketClient;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums_api::by_table::media_files::media_file_origin_category::MediaFileOriginCategory as ApiMediaFileOriginCategory;
use enums_db::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums_api::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory as ApiMediaFileOriginProductCategory;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::job_status_plus::JobStatusPlus;
use enums_api::common::job_status_plus::JobStatusPlus as ApiJobStatusPlus;
use errors::AnyhowResult;
use hashing::sha256::sha256_hash_bytes::sha256_hash_bytes;
use images::image_info::image_info::ImageInfo;
@@ -138,6 +143,7 @@ pub async fn update_gpt_image_job_status_handler(
match inference_job.status {
JobStatusPlus::CompleteSuccess => {
// Job has already been completed. Don't replay the request.
return Ok(Json(UpdateGptImageJobStatusSuccessResponse { success: true }))
},
@@ -14,7 +14,9 @@ use utoipa::ToSchema;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::visibility::Visibility;
use hashing::sha256::sha256_hash_bytes::sha256_hash_bytes;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -237,7 +239,8 @@ pub async fn upload_snapshot_media_file_handler(
})?;
let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs {
maybe_media_class: Some(MediaFileClass::Image),
maybe_media_class: Some(enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&MediaFileClass::Image)),
media_file_type: MediaFileType::Image,
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(),
@@ -24,8 +24,11 @@ use bucket_paths::legacy::typified_paths::public::voice_conversion_results::buck
use chrono::{DateTime, Utc};
use enums_db::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::common::job_status_plus::JobStatusPlus;
use enums_api::common::job_status_plus::JobStatusPlus as ApiJobStatusPlus;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName as ApiStyleTransferName;
use log::error;
use mysql_queries::queries::generic_inference::web::batch_get_inference_job_status::batch_get_inference_job_status;
use mysql_queries::queries::generic_inference::web::job_status::GenericInferenceJobStatus;
@@ -75,7 +78,7 @@ pub struct BatchInferenceJobStatusResponsePayload {
/// Details about what the user requested for generation
#[derive(Serialize, ToSchema)]
pub struct BatchRequestDetailsResponse {
pub inference_category: InferenceCategory,
pub inference_category: ApiInferenceCategory,
pub maybe_model_type: Option<String>,
pub maybe_model_token: Option<String>,
@@ -87,7 +90,7 @@ pub struct BatchRequestDetailsResponse {
/// OPTIONAL. For Comfy / Video Style Transfer jobs, this might include
/// the name of the selected style.
pub maybe_style_name: Option<StyleTransferName>,
pub maybe_style_name: Option<ApiStyleTransferName>,
/// OPTIONAL. For Live Portrait jobs, this is additional information on the request.
pub maybe_live_portrait_details: Option<JobDetailsLivePortraitRequest>,
@@ -101,7 +104,7 @@ pub struct BatchRequestDetailsResponse {
#[derive(Serialize, ToSchema)]
pub struct BatchStatusDetailsResponse {
/// Primary status from the database (a state machine).
pub status: JobStatusPlus,
pub status: ApiJobStatusPlus,
/// Extra, temporary status from Redis.
/// This can denote inference progress, and the Python code can write to it.
@@ -290,12 +293,14 @@ fn db_record_to_response_payload(
BatchInferenceJobStatusResponsePayload {
job_token: record.job_token,
request: BatchRequestDetailsResponse {
inference_category: record.request_details.inference_category,
inference_category: enums_convert::by_table::generic_inference_jobs::inference_category::inference_category_to_api(&record.request_details.inference_category),
maybe_model_type: maybe_filter_model_name(record.request_details.maybe_model_type.as_deref()),
maybe_model_token: record.request_details.maybe_model_token,
maybe_model_title: record.request_details.maybe_model_title,
maybe_raw_inference_text: record.request_details.maybe_raw_inference_text,
maybe_style_name: record.request_details.maybe_style_name,
maybe_style_name: enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&record.request_details.maybe_style_name),
maybe_live_portrait_details: maybe_polymorphic_args
.as_ref()
.and_then(|args| extract_live_portrait_details(args)),
@@ -304,7 +309,8 @@ fn db_record_to_response_payload(
.and_then(|args| extract_lipsync_details(args)),
},
status: BatchStatusDetailsResponse {
status: record.status,
status: enums_convert::common::job_status_plus::job_status_plus_to_api(&record.status),
maybe_extra_status_description,
maybe_assigned_worker: maybe_filter_model_name(record.maybe_assigned_worker.as_deref()),
maybe_assigned_cluster: record.maybe_assigned_cluster,
@@ -319,7 +325,9 @@ fn db_record_to_response_payload(
let public_bucket_media_path = match inference_category {
// NB: TTS has to be special cased due to legacy behavior
InferenceCategory::TextToSpeech |
InferenceCategory::F5TTS => {
match result_details.entity_type.as_str() {
"media_file" => {
// NB: We're migrating TTS to media_files.
@@ -360,11 +368,14 @@ fn db_record_to_response_payload(
}
// Unsupported media files.
InferenceCategory::FormatConversion |
InferenceCategory::ConvertBvhToWorkflow => {
"".to_string()
}
// Deprecated
InferenceCategory::DeprecatedField => {
"".to_string() // TODO(bt,2024-07-16): Read job type instead
}
// The blessed path that modern media files use.
@@ -22,8 +22,11 @@ use bucket_paths::legacy::typified_paths::public::voice_conversion_results::buck
use chrono::{DateTime, Utc};
use enums_db::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::common::job_status_plus::JobStatusPlus;
use enums_api::common::job_status_plus::JobStatusPlus as ApiJobStatusPlus;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName as ApiStyleTransferName;
use log::error;
use mysql_queries::queries::generic_inference::web::get_inference_job_status::get_inference_job_status;
use mysql_queries::queries::generic_inference::web::job_status::GenericInferenceJobStatus;
@@ -66,7 +69,7 @@ pub struct InferenceJobStatusResponsePayload {
/// Details about what the user requested for generation
#[derive(Serialize, ToSchema)]
pub struct RequestDetailsResponse {
pub inference_category: InferenceCategory,
pub inference_category: ApiInferenceCategory,
pub maybe_model_type: Option<String>,
pub maybe_model_token: Option<String>,
@@ -78,7 +81,7 @@ pub struct RequestDetailsResponse {
/// OPTIONAL. For Comfy / Video Style Transfer jobs, this might include
/// the name of the selected style.
pub maybe_style_name: Option<StyleTransferName>,
pub maybe_style_name: Option<ApiStyleTransferName>,
/// OPTIONAL. For Live Portrait jobs, this is additional information on the request.
pub maybe_live_portrait_details: Option<JobDetailsLivePortraitRequest>,
@@ -92,7 +95,7 @@ pub struct RequestDetailsResponse {
#[derive(Serialize, ToSchema)]
pub struct StatusDetailsResponse {
/// Primary status from the database (a state machine).
pub status: JobStatusPlus,
pub status: ApiJobStatusPlus,
/// Extra, temporary status from Redis.
/// This can denote inference progress, and the Python code can write to it.
@@ -280,12 +283,14 @@ fn record_to_payload(
InferenceJobStatusResponsePayload {
job_token: record.job_token,
request: RequestDetailsResponse {
inference_category: record.request_details.inference_category,
inference_category: enums_convert::by_table::generic_inference_jobs::inference_category::inference_category_to_api(&record.request_details.inference_category),
maybe_model_type: maybe_filter_model_name(record.request_details.maybe_model_type.as_deref()),
maybe_model_token: record.request_details.maybe_model_token,
maybe_model_title: record.request_details.maybe_model_title,
maybe_raw_inference_text: record.request_details.maybe_raw_inference_text,
maybe_style_name: record.request_details.maybe_style_name,
maybe_style_name: enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&record.request_details.maybe_style_name),
maybe_live_portrait_details: maybe_polymorphic_args
.as_ref()
.and_then(|args| extract_live_portrait_details(args)),
@@ -294,7 +299,8 @@ fn record_to_payload(
.and_then(|args| extract_lipsync_details(args)),
},
status: StatusDetailsResponse {
status: record.status,
status: enums_convert::common::job_status_plus::job_status_plus_to_api(&record.status),
maybe_extra_status_description,
maybe_assigned_worker: maybe_filter_model_name(record.maybe_assigned_worker.as_deref()),
maybe_assigned_cluster: record.maybe_assigned_cluster,
@@ -309,6 +315,7 @@ fn record_to_payload(
let public_bucket_media_path = match inference_category {
// NB: TTS has to be special cased due to legacy behavior
InferenceCategory::TextToSpeech
| InferenceCategory::F5TTS => {
match result_details.entity_type.as_str() {
"media_file" => {
@@ -350,11 +357,14 @@ fn record_to_payload(
}
// Unsupported media files.
InferenceCategory::FormatConversion |
InferenceCategory::ConvertBvhToWorkflow => {
"".to_string()
}
// Deprecated
InferenceCategory::DeprecatedField => {
"".to_string() // TODO(bt,2024-07-16): Read job type instead
}
// The blessed path that modern media files use.
@@ -390,6 +400,7 @@ mod tests {
use crate::http_server::common_responses::media::media_domain::MediaDomain;
use crate::http_server::endpoints::inference_job::get::get_inference_job_status_handler::record_to_payload;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use mysql_queries::queries::generic_inference::web::job_status::{GenericInferenceJobStatus, RequestDetails, ResultDetails};
use server_environment::ServerEnvironment;
use url::Url;
@@ -24,7 +24,9 @@ use chrono::{DateTime, Utc};
use enums_api::api_safe::by_table::generic_inference_jobs::frontend_failure_category_for_api_clients::FrontendFailureCategoryForApiClients;
use enums_api::api_safe::by_table::generic_inference_jobs::frontend_failure_category_for_old_clients::FrontendFailureCategoryForOldClients;
use enums_db::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums_api::by_table::generic_inference_jobs::inference_category::InferenceCategory as ApiInferenceCategory;
use enums_db::common::job_status_plus::JobStatusPlus;
use enums_api::common::job_status_plus::JobStatusPlus as ApiJobStatusPlus;
use log::{error, warn};
use mysql_queries::queries::generic_inference::web::job_status::GenericInferenceJobStatus;
use mysql_queries::queries::generic_inference::web::list_session_jobs::{list_session_jobs_from_connection, ListSessionJobsForUserArgs, SessionUser};
@@ -152,8 +154,10 @@ pub async fn list_session_jobs_handler(
let args = ListSessionJobsForUserArgs {
user,
maybe_include_job_statuses: include_states.as_ref(),
maybe_exclude_job_statuses: exclude_states.as_ref(),
maybe_include_job_statuses: enums_convert::common::job_status_plus::job_status_plus_to_api(&include_states.as_ref()),
maybe_exclude_job_statuses: enums_convert::common::job_status_plus::job_status_plus_to_api(&exclude_states.as_ref()),
};
// NB: Since this is publicly exposed, we don't query sensitive data.
@@ -222,6 +226,7 @@ fn records_to_response(
match record.request.inference_category {
// Show all audio results
InferenceCategory::TextToSpeech
| InferenceCategory::VoiceConversion
| InferenceCategory::SeedVc
| InferenceCategory::F5TTS => return true,
@@ -258,6 +263,7 @@ fn db_record_to_response_payload(
/// If the job's updated_at timestamp is updated elsewhere, then this is not accurate at all.
let maybe_current_execution_duration_seconds = match record.status {
JobStatusPlus::Started => {
let now = Utc::now();
let duration = now.signed_duration_since(record.updated_at);
Some(i64_to_u64_zero_clamped(duration.num_seconds()))
@@ -268,12 +274,14 @@ fn db_record_to_response_payload(
ListSessionJobsItem {
job_token: record.job_token,
request: ListSessionRequestDetailsResponse {
inference_category: record.request_details.inference_category,
inference_category: enums_convert::by_table::generic_inference_jobs::inference_category::inference_category_to_api(&record.request_details.inference_category),
maybe_model_type: maybe_filter_model_name(record.request_details.maybe_model_type.as_deref()),
maybe_model_token: record.request_details.maybe_model_token,
maybe_model_title: record.request_details.maybe_model_title,
maybe_raw_inference_text: record.request_details.maybe_raw_inference_text,
maybe_style_name: record.request_details.maybe_style_name,
maybe_style_name: enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&record.request_details.maybe_style_name),
maybe_live_portrait_details: maybe_polymorphic_args
.as_ref()
.and_then(|args| extract_live_portrait_details(args)),
@@ -282,7 +290,8 @@ fn db_record_to_response_payload(
.and_then(|args| extract_lipsync_details(args)),
},
status: ListSessionStatusDetailsResponse {
status: record.status,
status: enums_convert::common::job_status_plus::job_status_plus_to_api(&record.status),
maybe_extra_status_description,
maybe_assigned_worker: maybe_filter_model_name(record.maybe_assigned_worker.as_deref()),
maybe_assigned_cluster: record.maybe_assigned_cluster,
@@ -304,7 +313,9 @@ fn db_record_to_response_payload(
let public_bucket_media_path = match inference_category {
// NB: Be careful here, because this varies based on the type of inference result.
InferenceCategory::TextToSpeech |
InferenceCategory::F5TTS => {
match result_details.entity_type.as_str() {
"media_file" => {
// NB: We're migrating TTS to media_files.
@@ -345,11 +356,14 @@ fn db_record_to_response_payload(
}
// Unsupported media files.
InferenceCategory::FormatConversion |
InferenceCategory::ConvertBvhToWorkflow => {
"".to_string()
}
// Deprecated
InferenceCategory::DeprecatedField => {
"".to_string() // TODO(bt,2024-07-16): Read job type instead
}
// The blessed path that modern media files use.
@@ -9,7 +9,9 @@ use log::warn;
use utoipa::ToSchema;
use enums_db::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_api::by_table::media_files::media_file_animation_type::MediaFileAnimationType as ApiMediaFileAnimationType;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use http_server_common::response::serialize_as_json_error::serialize_as_json_error;
use mysql_queries::queries::media_files::edit::update_media_file_animation_type::update_media_file_animation_type;
use mysql_queries::queries::media_files::get::get_media_file::get_media_file;
@@ -23,7 +25,7 @@ use crate::state::server_state::ServerState;
pub struct ChangeMediaFileAnimationTypeRequest {
/// The new animation type for the media file.
/// It can be cleared to null, but only for characters.
pub maybe_animation_type: Option<MediaFileAnimationType>,
pub maybe_animation_type: Option<ApiMediaFileAnimationType>,
}
// =============== Error Response ===============
@@ -9,6 +9,7 @@ use log::warn;
use utoipa::ToSchema;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use http_server_common::response::serialize_as_json_error::serialize_as_json_error;
use mysql_queries::queries::media_files::edit::update_media_file_engine_category::update_media_file_engine_category;
use mysql_queries::queries::media_files::get::get_media_file::get_media_file;
@@ -20,7 +21,7 @@ use crate::state::server_state::ServerState;
#[derive(Deserialize, ToSchema)]
pub struct ChangeMediaFileEngineCategoryRequest {
pub engine_category: MediaFileEngineCategory,
pub engine_category: ApiMediaFileEngineCategory,
}
// =============== Error Response ===============
@@ -142,7 +142,8 @@ pub async fn change_media_file_visibility_handler(
let query_result = update_media_file_visibility(
UpdateMediaFileArgs {
media_file_token: &media_file_token.clone(),
creator_set_visibility: &creator_set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_db(&&creator_set_visibility),
maybe_mod_user_token: maybe_mod_user_token.as_deref(),
mysql_pool: &server_state.mysql_pool
}
@@ -9,6 +9,7 @@ use log::{info, warn};
use utoipa::ToSchema;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use http_server_common::response::serialize_as_json_error::serialize_as_json_error;
use mysql_queries::queries::media_files::edit::set_media_file_cover_image::{set_media_file_cover_image, UpdateArgs};
use mysql_queries::queries::media_files::get::get_media_file::get_media_file;
@@ -11,14 +11,22 @@ use artcraft_api_defs::common::responses::media_links::MediaLinks;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use chrono::{DateTime, Utc};
use enums_db::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_api::by_table::media_files::media_file_animation_type::MediaFileAnimationType as ApiMediaFileAnimationType;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use enums_db::by_table::media_files::media_file_subtype::MediaFileSubtype;
use enums_api::by_table::media_files::media_file_subtype::MediaFileSubtype as ApiMediaFileSubtype;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::by_table::model_weights::weights_category::WeightsCategory;
use enums_api::by_table::model_weights::weights_category::WeightsCategory as ApiWeightsCategory;
use enums_db::by_table::model_weights::weights_types::WeightsType;
use enums_api::by_table::model_weights::weights_types::WeightsType as ApiWeightsType;
use enums_db::common::visibility::Visibility;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName as ApiStyleTransferName;
use enums_public::by_table::model_weights::public_weights_types::PublicWeightsType;
use log::warn;
use mysql_queries::queries::media_files::get::batch_get_media_files::batch_get_media_files;
@@ -66,27 +74,27 @@ pub struct BatchMediaFileInfo {
pub token: MediaFileToken,
/// The coarse-grained class of media file: image, video, etc.
pub media_class: MediaFileClass,
pub media_class: ApiMediaFileClass,
/// Type of media will dictate which fields are populated and what
/// the frontend should display (eg. video player vs audio player).
/// This is closer in meaning to a "mime type".
pub media_type: MediaFileType,
pub media_type: ApiMediaFileType,
/// If this is an engine/3D asset, this is the broad category (scene,
/// animation, etc.) of that object.
/// This can also be used for filtering in list/batch endpoints.
pub maybe_engine_category: Option<MediaFileEngineCategory>,
pub maybe_engine_category: Option<ApiMediaFileEngineCategory>,
/// If this is an engine/3D asset for an animation or a rig that can
/// be animated with either (or both) skeletal or blend shape animations,
/// this describes the animation regime used or supported.
pub maybe_animation_type: Option<MediaFileAnimationType>,
pub maybe_animation_type: Option<ApiMediaFileAnimationType>,
/// If the media file has a subtype, we'll report it.
/// This is mostly used for Bevy engine files.
#[deprecated(note="This was for the Bevy engine. Do not use.")]
pub maybe_media_subtype: Option<MediaFileSubtype>,
pub maybe_media_subtype: Option<ApiMediaFileSubtype>,
/// Extension for the engine to load over remote:// URLs.
#[deprecated(note="This was for the Bevy engine. Do not use.")]
@@ -146,7 +154,7 @@ pub struct BatchMediaFileInfo {
/// For Comfy / Video Style Transfer jobs, this might include
/// the name of the selected style.
pub maybe_style_name: Option<StyleTransferName>,
pub maybe_style_name: Option<ApiStyleTransferName>,
/// The foreign key to the prompt used to generate the media, if applicable.
pub maybe_prompt_token: Option<PromptToken>,
@@ -186,7 +194,7 @@ pub struct BatchMediaFileInfo {
pub struct BatchGetMediaFilesModelInfo {
pub weight_token: ModelWeightToken,
pub weight_type: PublicWeightsType,
pub weight_category: WeightsCategory,
pub weight_category: ApiWeightsCategory,
pub title: String,
/// Cover images are small descriptive images that can be set for any model.
@@ -318,19 +326,28 @@ pub async fn batch_get_media_files_handler(
// NB: Some engine pages will need to know the engine extension to load the file.
let maybe_engine_extension = match result.media_type {
MediaFileType::Bvh => Some(".bvh".to_string()),
MediaFileType::Glb => Some(".glb".to_string()),
MediaFileType::Gltf => Some(".gltf".to_string()),
MediaFileType::SceneRon => Some(".scn.ron".to_string()),
_ => None,
};
BatchMediaFileInfo {
token: result.token.clone(),
media_class: result.media_class,
media_type: result.media_type,
maybe_engine_category: result.maybe_engine_category,
maybe_animation_type: result.maybe_animation_type,
maybe_media_subtype: result.maybe_media_subtype,
media_class: enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&result.media_class),
media_type: enums_convert::by_table::media_files::media_file_type::media_file_type_to_api(&result.media_type),
maybe_engine_category: enums_convert::by_table::media_files::media_file_engine_category::media_file_engine_category_to_api(&result.maybe_engine_category),
maybe_animation_type: enums_convert::by_table::media_files::media_file_animation_type::media_file_animation_type_to_api(&result.maybe_animation_type),
maybe_media_subtype: enums_convert::by_table::media_files::media_file_subtype::media_file_subtype_to_api(&result.maybe_media_subtype),
maybe_engine_extension,
maybe_batch_token: result.maybe_batch_token,
media_links: MediaLinksBuilder::from_media_path_and_env(
@@ -356,7 +373,8 @@ pub async fn batch_get_media_files_handler(
.as_ref()
.map(|info| MediaFileLivePortraitDetails::maybe_from_extra_info(&info))
.flatten(),
maybe_style_name: result.maybe_prompt_args
maybe_style_name: enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&result.maybe_prompt_args)
.as_ref()
.and_then(|args| args.style_name.as_ref())
.and_then(|style| style.to_style_name()),
@@ -366,8 +384,10 @@ pub async fn batch_get_media_files_handler(
weight_token,
// TODO(bt,2023-12-28): Instead of giving bogus defaults on None, make these optional or return
// None for *everything* on any field being absent.
weight_type: PublicWeightsType::from_enum(result.maybe_model_weights_type.unwrap_or(WeightsType::Tacotron2)),
weight_category: result.maybe_model_weights_category.unwrap_or(WeightsCategory::TextToSpeech),
weight_type: enums_convert::by_table::model_weights::weights_types::weights_type_to_api(&PublicWeightsType::from_enum(result.maybe_model_weights_type.unwrap_or(WeightsType::Tacotron2))),
weight_category: enums_convert::by_table::model_weights::weights_category::weights_category_to_api(&result.maybe_model_weights_category.unwrap_or(WeightsCategory::TextToSpeech)),
title: result.maybe_model_weights_title.unwrap_or_else(|| "model".to_string()),
maybe_cover_image_public_bucket_path,
maybe_weight_creator: UserDetailsLight::from_optional_db_fields_owned(
@@ -384,7 +404,8 @@ pub async fn batch_get_media_files_handler(
result.maybe_creator_display_name,
result.maybe_creator_gravatar_hash,
),
creator_set_visibility: result.creator_set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_api(&result.creator_set_visibility),
is_user_upload: result.is_user_upload,
is_intermediate_system_file: result.is_intermediate_system_file,
maybe_prompt_token: result.maybe_prompt_token,
@@ -20,14 +20,22 @@ use artcraft_api_defs::common::responses::media_links::MediaLinks;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use chrono::{DateTime, Utc};
use enums_db::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_api::by_table::media_files::media_file_animation_type::MediaFileAnimationType as ApiMediaFileAnimationType;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use enums_db::by_table::media_files::media_file_subtype::MediaFileSubtype;
use enums_api::by_table::media_files::media_file_subtype::MediaFileSubtype as ApiMediaFileSubtype;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::by_table::model_weights::weights_category::WeightsCategory;
use enums_api::by_table::model_weights::weights_category::WeightsCategory as ApiWeightsCategory;
use enums_db::by_table::model_weights::weights_types::WeightsType;
use enums_api::by_table::model_weights::weights_types::WeightsType as ApiWeightsType;
use enums_db::common::visibility::Visibility;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName as ApiStyleTransferName;
use enums_public::by_table::model_weights::public_weights_types::PublicWeightsType;
use log::warn;
use mysql_queries::queries::media_files::get::get_media_file::get_media_file;
@@ -56,27 +64,27 @@ pub struct MediaFileInfo {
pub token: MediaFileToken,
/// The coarse-grained class of media file: image, video, etc.
pub media_class: MediaFileClass,
pub media_class: ApiMediaFileClass,
/// Type of media will dictate which fields are populated and what
/// the frontend should display (eg. video player vs audio player).
/// This is closer in meaning to a "mime type".
pub media_type: MediaFileType,
pub media_type: ApiMediaFileType,
/// If this is an engine/3D asset, this is the broad category (scene,
/// animation, etc.) of that object.
/// This can also be used for filtering in list/batch endpoints.
pub maybe_engine_category: Option<MediaFileEngineCategory>,
pub maybe_engine_category: Option<ApiMediaFileEngineCategory>,
/// If this is an engine/3D asset for an animation or a rig that can
/// be animated with either (or both) skeletal or blend shape animations,
/// this describes the animation regime used or supported.
pub maybe_animation_type: Option<MediaFileAnimationType>,
pub maybe_animation_type: Option<ApiMediaFileAnimationType>,
/// If the media file has a subtype, we'll report it.
/// This is mostly used for Bevy engine files.
#[deprecated(note="This was for the Bevy engine. Do not use.")]
pub maybe_media_subtype: Option<MediaFileSubtype>,
pub maybe_media_subtype: Option<ApiMediaFileSubtype>,
/// Extension for the engine to load over remote:// URLs.
#[deprecated(note="This was for the Bevy engine. Do not use.")]
@@ -140,7 +148,7 @@ pub struct MediaFileInfo {
/// For Comfy / Video Style Transfer jobs, this might include
/// the name of the selected style.
pub maybe_style_name: Option<StyleTransferName>,
pub maybe_style_name: Option<ApiStyleTransferName>,
/// For Comfy / Video Style Transfer jobs, this indicates use of face detailer.
pub used_face_detailer: bool,
@@ -191,7 +199,7 @@ pub struct GetMediaFileModeratorFields {
pub struct GetMediaFileModelInfo {
pub weight_token: ModelWeightToken,
pub weight_type: PublicWeightsType,
pub weight_category: WeightsCategory,
pub weight_category: ApiWeightsCategory,
pub title: String,
/// Cover images are small descriptive images that can be set for any model.
@@ -346,9 +354,13 @@ async fn modern_media_file_lookup(
// NB: Some engine pages will need to know the engine extension to load the file.
let maybe_engine_extension = match result.media_type {
MediaFileType::Bvh => Some(".bvh".to_string()),
MediaFileType::Glb => Some(".glb".to_string()),
MediaFileType::Gltf => Some(".gltf".to_string()),
MediaFileType::SceneRon => Some(".scn.ron".to_string()),
_ => None,
};
@@ -356,10 +368,14 @@ async fn modern_media_file_lookup(
success: true,
media_file: MediaFileInfo {
token: result.token.clone(),
media_class: result.media_class,
media_type: result.media_type,
maybe_engine_category: result.maybe_engine_category,
maybe_animation_type: result.maybe_animation_type,
media_class: enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&result.media_class),
media_type: enums_convert::by_table::media_files::media_file_type::media_file_type_to_api(&result.media_type),
maybe_engine_category: enums_convert::by_table::media_files::media_file_engine_category::media_file_engine_category_to_api(&result.maybe_engine_category),
maybe_animation_type: enums_convert::by_table::media_files::media_file_animation_type::media_file_animation_type_to_api(&result.maybe_animation_type),
// maybe_media_subtype: result.maybe_media_subtype,
maybe_media_subtype: None, // NB(bt,2024-07-25): Stop populating field for consumers.
maybe_engine_extension,
@@ -388,7 +404,8 @@ async fn modern_media_file_lookup(
.as_ref()
.map(|info| MediaFileLivePortraitDetails::maybe_from_extra_info(&info))
.flatten(),
maybe_style_name: result.maybe_prompt_args
maybe_style_name: enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&result.maybe_prompt_args)
.as_ref()
.and_then(|args| args.style_name.as_ref())
.and_then(|style| style.to_style_name()),
@@ -406,8 +423,10 @@ async fn modern_media_file_lookup(
weight_token,
// TODO(bt,2023-12-28): Instead of giving bogus defaults on None, make these optional or return
// None for *everything* on any field being absent.
weight_type: PublicWeightsType::from_enum(result.maybe_model_weights_type.unwrap_or(WeightsType::Tacotron2)),
weight_category: result.maybe_model_weights_category.unwrap_or(WeightsCategory::TextToSpeech),
weight_type: enums_convert::by_table::model_weights::weights_types::weights_type_to_api(&PublicWeightsType::from_enum(result.maybe_model_weights_type.unwrap_or(WeightsType::Tacotron2))),
weight_category: enums_convert::by_table::model_weights::weights_category::weights_category_to_api(&result.maybe_model_weights_category.unwrap_or(WeightsCategory::TextToSpeech)),
title: result.maybe_model_weights_title.unwrap_or_else(|| "model".to_string()),
maybe_cover_image_public_bucket_path,
maybe_weight_creator: UserDetailsLight::from_optional_db_fields_owned(
@@ -424,7 +443,8 @@ async fn modern_media_file_lookup(
result.maybe_creator_display_name,
result.maybe_creator_gravatar_hash,
),
creator_set_visibility: result.creator_set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_api(&result.creator_set_visibility),
is_user_upload: result.is_user_upload,
is_intermediate_system_file: result.is_intermediate_system_file,
maybe_prompt_token: result.maybe_prompt_token,
@@ -531,7 +551,8 @@ async fn emulate_media_file_with_legacy_tts_result_lookup(
maybe_style_name: None,
used_face_detailer: false,
used_upscaler: false,
creator_set_visibility: result.creator_set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_api(&result.creator_set_visibility),
is_user_upload: false,
is_intermediate_system_file: false,
maybe_title: None,
@@ -99,8 +99,10 @@ pub async fn list_batch_generated_redux_media_files_handler(
BatchGeneratedReduxMediaFileInfo {
token: result.token.clone(),
media_class: result.media_class,
media_type: result.media_type,
media_class: enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&result.media_class),
media_type: enums_convert::by_table::media_files::media_file_type::media_file_type_to_api(&result.media_type),
maybe_batch_token: result.maybe_batch_token,
media_links: MediaLinksBuilder::from_media_path_and_env(
media_domain,
@@ -122,7 +124,8 @@ pub async fn list_batch_generated_redux_media_files_handler(
result.maybe_creator_display_name,
result.maybe_creator_gravatar_hash,
),
creator_set_visibility: result.creator_set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_api(&result.creator_set_visibility),
maybe_prompt_token: result.maybe_prompt_token,
maybe_original_filename: result.maybe_origin_filename,
maybe_duration_millis: result.maybe_duration_millis,
@@ -7,13 +7,21 @@ use artcraft_api_defs::common::responses::media_links::MediaLinks;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use chrono::{DateTime, Utc};
use enums_db::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_api::by_table::media_files::media_file_animation_type::MediaFileAnimationType as ApiMediaFileAnimationType;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use enums_db::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums_api::by_table::media_files::media_file_origin_category::MediaFileOriginCategory as ApiMediaFileOriginCategory;
use enums_db::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums_api::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory as ApiMediaFileOriginProductCategory;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::view_as::ViewAs;
use enums_api::common::view_as::ViewAs as ApiViewAs;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName as ApiStyleTransferName;
use enums_public::by_table::media_files::public_media_file_model_type::PublicMediaFileModelType;
use log::{error, warn};
use mysql_queries::queries::media_files::list::list_featured_media_files::{list_featured_media_files, FeaturedMediaFileListPage, ListFeaturedMediaFilesArgs};
@@ -103,22 +111,22 @@ pub struct FeaturedMediaFile {
pub token: MediaFileToken,
/// The coarse-grained class of media file: image, video, etc.
pub media_class: MediaFileClass,
pub media_class: ApiMediaFileClass,
/// Type of media will dictate which fields are populated and what
/// the frontend should display (eg. video player vs audio player).
/// This is closer in meaning to a "mime type".
pub media_type: MediaFileType,
pub media_type: ApiMediaFileType,
/// If this is an engine/3D asset, this is the broad category (scene,
/// animation, etc.) of that object.
/// This can also be used for filtering in list/batch endpoints.
pub maybe_engine_category: Option<MediaFileEngineCategory>,
pub maybe_engine_category: Option<ApiMediaFileEngineCategory>,
/// If this is an engine/3D asset for an animation or a rig that can
/// be animated with either (or both) skeletal or blend shape animations,
/// this describes the animation regime used or supported.
pub maybe_animation_type: Option<MediaFileAnimationType>,
pub maybe_animation_type: Option<ApiMediaFileAnimationType>,
/// (DEPRECATED) URL path to the media file
#[deprecated(note="This field doesn't point to the full URL. Use media_links instead to leverage the CDN.")]
@@ -137,10 +145,10 @@ pub struct FeaturedMediaFile {
pub cover_image: MediaFileCoverImageDetails,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub origin_category: MediaFileOriginCategory,
pub origin_category: ApiMediaFileOriginCategory,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub origin_product_category: MediaFileOriginProductCategory,
pub origin_product_category: ApiMediaFileOriginProductCategory,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub maybe_origin_model_type: Option<PublicMediaFileModelType>,
@@ -169,7 +177,7 @@ pub struct FeaturedMediaFile {
/// For Comfy / Video Style Transfer jobs, this might include
/// the name of the selected style.
pub maybe_style_name: Option<StyleTransferName>,
pub maybe_style_name: Option<ApiStyleTransferName>,
/// Duration for audio and video files, if available.
/// Measured in milliseconds.
@@ -284,10 +292,14 @@ pub async fn list_featured_media_files_handler(
);
FeaturedMediaFile {
token: m.token.clone(),
media_class: m.media_class,
media_type: m.media_type,
maybe_engine_category: m.maybe_engine_category,
maybe_animation_type: m.maybe_animation_type,
media_class: enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&m.media_class),
media_type: enums_convert::by_table::media_files::media_file_type::media_file_type_to_api(&m.media_type),
maybe_engine_category: enums_convert::by_table::media_files::media_file_engine_category::media_file_engine_category_to_api(&m.maybe_engine_category),
maybe_animation_type: enums_convert::by_table::media_files::media_file_animation_type::media_file_animation_type_to_api(&m.maybe_animation_type),
media_links: MediaLinksBuilder::from_media_path_and_env(
media_domain,
server_state.server_environment,
@@ -305,14 +317,17 @@ pub async fn list_featured_media_files_handler(
m.maybe_file_cover_image_public_bucket_prefix.as_deref(),
m.maybe_file_cover_image_public_bucket_extension.as_deref(),
),
origin: MediaFileOriginDetails::from_db_fields_str(
origin: enums_convert::by_table::media_files::media_file_origin_product_category::media_file_origin_product_category_to_api(&MediaFileOriginDetails::from_db_fields_str()
m.origin_category,
m.origin_product_category,
m.maybe_origin_model_type,
m.maybe_origin_model_token.as_deref(),
m.maybe_origin_model_title.as_deref()),
origin_category: m.origin_category,
origin_product_category: m.origin_product_category,
origin_category: enums_convert::by_table::media_files::media_file_origin_category::media_file_origin_category_to_api(&m.origin_category),
origin_product_category: enums_convert::by_table::media_files::media_file_origin_product_category::media_file_origin_product_category_to_api(&m.origin_product_category),
maybe_origin_model_type: m.maybe_origin_model_type
.map(|t| PublicMediaFileModelType::from_enum(t)),
maybe_origin_model_token: m.maybe_origin_model_token,
@@ -326,7 +341,8 @@ pub async fn list_featured_media_files_handler(
is_intermediate_system_file: m.is_intermediate_system_file,
maybe_title: m.maybe_title,
maybe_text_transcript: m.maybe_text_transcript,
maybe_style_name: m.maybe_prompt_args
maybe_style_name: enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&m.maybe_prompt_args)
.as_ref()
.and_then(|args| args.style_name.as_ref())
.and_then(|style| style.to_style_name()),
@@ -8,14 +8,22 @@ use artcraft_api_defs::common::responses::media_links::MediaLinks;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use chrono::{DateTime, Utc};
use enums_db::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_api::by_table::media_files::media_file_animation_type::MediaFileAnimationType as ApiMediaFileAnimationType;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use enums_db::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums_api::by_table::media_files::media_file_origin_category::MediaFileOriginCategory as ApiMediaFileOriginCategory;
use enums_db::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums_api::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory as ApiMediaFileOriginProductCategory;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::view_as::ViewAs;
use enums_api::common::view_as::ViewAs as ApiViewAs;
use enums_db::common::visibility::Visibility;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName as ApiStyleTransferName;
use enums_public::by_table::media_files::public_media_file_model_type::PublicMediaFileModelType;
use log::warn;
use mysql_queries::queries::media_files::list::list_media_files_by_batch_token::{list_media_files_by_batch_token, ListMediaFileByBatchArgs};
@@ -46,7 +54,7 @@ pub struct ListMediaFilesByBatchQueryParams {
pub page_index: Option<usize>,
#[deprecated(note="This field has no meaning for this endpoint. Not sure why it was added.")]
pub filter_media_type: Option<MediaFileType>,
pub filter_media_type: Option<ApiMediaFileType>,
}
#[derive(Serialize, ToSchema)]
@@ -61,31 +69,31 @@ pub struct MediaFilesByBatchListItem {
pub token: MediaFileToken,
/// The coarse-grained class of media file: image, video, etc.
pub media_class: MediaFileClass,
pub media_class: ApiMediaFileClass,
/// Type of media will dictate which fields are populated and what
/// the frontend should display (eg. video player vs audio player).
/// This is closer in meaning to a "mime type".
pub media_type: MediaFileType,
pub media_type: ApiMediaFileType,
/// If this is an engine/3D asset, this is the broad category (scene,
/// animation, etc.) of that object.
/// This can also be used for filtering in list/batch endpoints.
pub maybe_engine_category: Option<MediaFileEngineCategory>,
pub maybe_engine_category: Option<ApiMediaFileEngineCategory>,
/// If this is an engine/3D asset for an animation or a rig that can
/// be animated with either (or both) skeletal or blend shape animations,
/// this describes the animation regime used or supported.
pub maybe_animation_type: Option<MediaFileAnimationType>,
pub maybe_animation_type: Option<ApiMediaFileAnimationType>,
/// Details where the media file came from.
pub origin: MediaFileOriginDetails,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub origin_category: MediaFileOriginCategory,
pub origin_category: ApiMediaFileOriginCategory,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub origin_product_category: MediaFileOriginProductCategory,
pub origin_product_category: ApiMediaFileOriginProductCategory,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub maybe_origin_model_type: Option<PublicMediaFileModelType>,
@@ -127,7 +135,7 @@ pub struct MediaFilesByBatchListItem {
/// For Comfy / Video Style Transfer jobs, this might include
/// the name of the selected style.
pub maybe_style_name: Option<StyleTransferName>,
pub maybe_style_name: Option<ApiStyleTransferName>,
/// Duration for audio and video files, if available.
/// Measured in milliseconds.
@@ -240,16 +248,23 @@ pub async fn list_media_files_by_batch_token_handler(
// Don't allow access to certain media types.
match record.media_type {
MediaFileType::Bvh |
MediaFileType::Fbx |
MediaFileType::Glb |
MediaFileType::Gltf => return false,
_ => {},
}
// Don't allow access to certain products.
match record.origin_product_category {
MediaFileOriginProductCategory::VideoFilter |
MediaFileOriginProductCategory::Mocap |
MediaFileOriginProductCategory::Workflow => return false,
_ => {},
}
true
@@ -262,18 +277,25 @@ pub async fn list_media_files_by_batch_token_handler(
);
MediaFilesByBatchListItem {
token: record.token.clone(),
media_class: record.media_class,
media_type: record.media_type,
maybe_engine_category: record.maybe_engine_category,
maybe_animation_type: record.maybe_animation_type,
origin: MediaFileOriginDetails::from_db_fields_str(
media_class: enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&record.media_class),
media_type: enums_convert::by_table::media_files::media_file_type::media_file_type_to_api(&record.media_type),
maybe_engine_category: enums_convert::by_table::media_files::media_file_engine_category::media_file_engine_category_to_api(&record.maybe_engine_category),
maybe_animation_type: enums_convert::by_table::media_files::media_file_animation_type::media_file_animation_type_to_api(&record.maybe_animation_type),
origin: enums_convert::by_table::media_files::media_file_origin_product_category::media_file_origin_product_category_to_api(&MediaFileOriginDetails::from_db_fields_str()
record.origin_category,
record.origin_product_category,
record.maybe_origin_model_type,
record.maybe_origin_model_token.as_deref(),
record.maybe_origin_model_title.as_deref()),
origin_category: record.origin_category,
origin_product_category: record.origin_product_category,
origin_category: enums_convert::by_table::media_files::media_file_origin_category::media_file_origin_category_to_api(&record.origin_category),
origin_product_category: enums_convert::by_table::media_files::media_file_origin_product_category::media_file_origin_product_category_to_api(&record.origin_product_category),
maybe_origin_model_type: record.maybe_origin_model_type
.map(|t| PublicMediaFileModelType::from_enum(t)),
maybe_origin_model_token: record.maybe_origin_model_token,
@@ -287,12 +309,14 @@ pub async fn list_media_files_by_batch_token_handler(
.to_string(),
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,
creator_set_visibility: enums_convert::common::visibility::visibility_to_api(&record.creator_set_visibility),
is_user_upload: record.is_user_upload,
is_intermediate_system_file: record.is_intermediate_system_file,
maybe_title: record.maybe_title,
maybe_text_transcript: record.maybe_text_transcript,
maybe_style_name: record.maybe_prompt_args
maybe_style_name: enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&record.maybe_prompt_args)
.as_ref()
.and_then(|args| args.style_name.as_ref())
.and_then(|style| style.to_style_name()),
@@ -8,14 +8,22 @@ use artcraft_api_defs::common::responses::media_links::MediaLinks;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use chrono::{DateTime, Utc};
use enums_db::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_api::by_table::media_files::media_file_animation_type::MediaFileAnimationType as ApiMediaFileAnimationType;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use enums_db::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums_api::by_table::media_files::media_file_origin_category::MediaFileOriginCategory as ApiMediaFileOriginCategory;
use enums_db::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums_api::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory as ApiMediaFileOriginProductCategory;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::view_as::ViewAs;
use enums_api::common::view_as::ViewAs as ApiViewAs;
use enums_db::common::visibility::Visibility;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName as ApiStyleTransferName;
use enums_public::by_table::media_files::public_media_file_model_type::PublicMediaFileModelType;
use log::{info, warn};
use mysql_queries::queries::media_files::list::list_media_files_for_user::{list_media_files_for_user, ListMediaFileForUserArgs};
@@ -96,31 +104,31 @@ pub struct MediaFileForUserListItem {
pub token: MediaFileToken,
/// The coarse-grained class of media file: image, video, etc.
pub media_class: MediaFileClass,
pub media_class: ApiMediaFileClass,
/// Type of media will dictate which fields are populated and what
/// the frontend should display (eg. video player vs audio player).
/// This is closer in meaning to a "mime type".
pub media_type: MediaFileType,
pub media_type: ApiMediaFileType,
/// If this is an engine/3D asset, this is the broad category (scene,
/// animation, etc.) of that object.
/// This can also be used for filtering in list/batch endpoints.
pub maybe_engine_category: Option<MediaFileEngineCategory>,
pub maybe_engine_category: Option<ApiMediaFileEngineCategory>,
/// If this is an engine/3D asset for an animation or a rig that can
/// be animated with either (or both) skeletal or blend shape animations,
/// this describes the animation regime used or supported.
pub maybe_animation_type: Option<MediaFileAnimationType>,
pub maybe_animation_type: Option<ApiMediaFileAnimationType>,
/// Details where the media file came from.
pub origin: MediaFileOriginDetails,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub origin_category: MediaFileOriginCategory,
pub origin_category: ApiMediaFileOriginCategory,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub origin_product_category: MediaFileOriginProductCategory,
pub origin_product_category: ApiMediaFileOriginProductCategory,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub maybe_origin_model_type: Option<PublicMediaFileModelType>,
@@ -162,7 +170,7 @@ pub struct MediaFileForUserListItem {
/// For Comfy / Video Style Transfer jobs, this might include
/// the name of the selected style.
pub maybe_style_name: Option<StyleTransferName>,
pub maybe_style_name: Option<ApiStyleTransferName>,
/// Duration for audio and video files, if available.
/// Measured in milliseconds.
@@ -301,10 +309,15 @@ pub async fn list_media_files_for_user_handler(
// Don't allow access to certain media types.
match record.media_type {
MediaFileType::Bvh |
MediaFileType::Fbx |
MediaFileType::Glb |
MediaFileType::Gltf |
MediaFileType::SceneRon => return false,
_ => {},
}
// // Don't allow access to certain products.
@@ -324,18 +337,25 @@ pub async fn list_media_files_for_user_handler(
);
MediaFileForUserListItem {
token: record.token.clone(),
media_class: record.media_class,
media_type: record.media_type,
maybe_engine_category: record.maybe_engine_category,
maybe_animation_type: record.maybe_animation_type,
origin: MediaFileOriginDetails::from_db_fields_str(
media_class: enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&record.media_class),
media_type: enums_convert::by_table::media_files::media_file_type::media_file_type_to_api(&record.media_type),
maybe_engine_category: enums_convert::by_table::media_files::media_file_engine_category::media_file_engine_category_to_api(&record.maybe_engine_category),
maybe_animation_type: enums_convert::by_table::media_files::media_file_animation_type::media_file_animation_type_to_api(&record.maybe_animation_type),
origin: enums_convert::by_table::media_files::media_file_origin_product_category::media_file_origin_product_category_to_api(&MediaFileOriginDetails::from_db_fields_str()
record.origin_category,
record.origin_product_category,
record.maybe_origin_model_type,
record.maybe_origin_model_token.as_deref(),
record.maybe_origin_model_title.as_deref()),
origin_category: record.origin_category,
origin_product_category: record.origin_product_category,
origin_category: enums_convert::by_table::media_files::media_file_origin_category::media_file_origin_category_to_api(&record.origin_category),
origin_product_category: enums_convert::by_table::media_files::media_file_origin_product_category::media_file_origin_product_category_to_api(&record.origin_product_category),
maybe_origin_model_type: record.maybe_origin_model_type
.map(|t| PublicMediaFileModelType::from_enum(t)),
maybe_origin_model_token: record.maybe_origin_model_token,
@@ -353,12 +373,14 @@ pub async fn list_media_files_for_user_handler(
record.maybe_file_cover_image_public_bucket_prefix.as_deref(),
record.maybe_file_cover_image_public_bucket_extension.as_deref(),
),
creator_set_visibility: record.creator_set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_api(&record.creator_set_visibility),
is_user_upload: record.is_user_upload,
is_intermediate_system_file: record.is_intermediate_system_file,
maybe_title: record.maybe_title,
maybe_text_transcript: record.maybe_text_transcript,
maybe_style_name: record.maybe_prompt_args
maybe_style_name: enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&record.maybe_prompt_args)
.as_ref()
.and_then(|args| args.style_name.as_ref())
.and_then(|style| style.to_style_name()),
@@ -8,14 +8,22 @@ use artcraft_api_defs::common::responses::media_links::MediaLinks;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use chrono::{DateTime, Utc};
use enums_db::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_api::by_table::media_files::media_file_animation_type::MediaFileAnimationType as ApiMediaFileAnimationType;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use enums_db::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums_api::by_table::media_files::media_file_origin_category::MediaFileOriginCategory as ApiMediaFileOriginCategory;
use enums_db::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums_api::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory as ApiMediaFileOriginProductCategory;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::view_as::ViewAs;
use enums_api::common::view_as::ViewAs as ApiViewAs;
use enums_db::common::visibility::Visibility;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName as ApiStyleTransferName;
use enums_public::by_table::media_files::public_media_file_model_type::PublicMediaFileModelType;
use log::warn;
use mysql_queries::queries::media_files::list::list_media_files::{list_media_files, ListMediaFilesArgs};
@@ -93,28 +101,28 @@ pub struct MediaFileListItem {
pub token: MediaFileToken,
/// The coarse-grained class of media file: image, video, etc.
pub media_class: MediaFileClass,
pub media_class: ApiMediaFileClass,
/// Type of media will dictate which fields are populated and what
/// the frontend should display (eg. video player vs audio player).
/// This is closer in meaning to a "mime type".
pub media_type: MediaFileType,
pub media_type: ApiMediaFileType,
/// If this is an engine/3D asset, this is the broad category (scene,
/// animation, etc.) of that object.
/// This can also be used for filtering in list/batch endpoints.
pub maybe_engine_category: Option<MediaFileEngineCategory>,
pub maybe_engine_category: Option<ApiMediaFileEngineCategory>,
/// If this is an engine/3D asset for an animation or a rig that can
/// be animated with either (or both) skeletal or blend shape animations,
/// this describes the animation regime used or supported.
pub maybe_animation_type: Option<MediaFileAnimationType>,
pub maybe_animation_type: Option<ApiMediaFileAnimationType>,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub origin_category: MediaFileOriginCategory,
pub origin_category: ApiMediaFileOriginCategory,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub origin_product_category: MediaFileOriginProductCategory,
pub origin_product_category: ApiMediaFileOriginProductCategory,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub maybe_origin_model_type: Option<PublicMediaFileModelType>,
@@ -164,7 +172,7 @@ pub struct MediaFileListItem {
/// For Comfy / Video Style Transfer jobs, this might include
/// the name of the selected style.
pub maybe_style_name: Option<StyleTransferName>,
pub maybe_style_name: Option<ApiStyleTransferName>,
/// Duration for audio and video files, if available.
/// Measured in milliseconds.
@@ -330,18 +338,25 @@ pub async fn list_media_files_handler(
);
MediaFileListItem {
token: record.token.clone(),
media_class: record.media_class,
media_type: record.media_type,
maybe_engine_category: record.maybe_engine_category,
maybe_animation_type: record.maybe_animation_type,
origin: MediaFileOriginDetails::from_db_fields_str(
media_class: enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&record.media_class),
media_type: enums_convert::by_table::media_files::media_file_type::media_file_type_to_api(&record.media_type),
maybe_engine_category: enums_convert::by_table::media_files::media_file_engine_category::media_file_engine_category_to_api(&record.maybe_engine_category),
maybe_animation_type: enums_convert::by_table::media_files::media_file_animation_type::media_file_animation_type_to_api(&record.maybe_animation_type),
origin: enums_convert::by_table::media_files::media_file_origin_product_category::media_file_origin_product_category_to_api(&MediaFileOriginDetails::from_db_fields_str()
record.origin_category,
record.origin_product_category,
record.maybe_origin_model_type,
record.maybe_origin_model_token.as_deref(),
record.maybe_origin_model_title.as_deref()),
origin_category: record.origin_category,
origin_product_category: record.origin_product_category,
origin_category: enums_convert::by_table::media_files::media_file_origin_category::media_file_origin_category_to_api(&record.origin_category),
origin_product_category: enums_convert::by_table::media_files::media_file_origin_product_category::media_file_origin_product_category_to_api(&record.origin_product_category),
maybe_origin_model_type: record.maybe_origin_model_type
.map(|m| PublicMediaFileModelType::from_enum(m)),
maybe_origin_model_token: record.maybe_origin_model_token,
@@ -372,12 +387,14 @@ pub async fn list_media_files_handler(
positive_rating_count: record.maybe_ratings_positive_count.unwrap_or(0),
bookmark_count: record.maybe_bookmark_count.unwrap_or(0),
},
creator_set_visibility: record.creator_set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_api(&record.creator_set_visibility),
is_user_upload: record.is_user_upload,
is_intermediate_system_file: record.is_intermediate_system_file,
maybe_title: record.maybe_title,
maybe_text_transcript: record.maybe_text_transcript,
maybe_style_name: record.maybe_prompt_args
maybe_style_name: enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&record.maybe_prompt_args)
.as_ref()
.and_then(|args| args.style_name.as_ref())
.and_then(|style| style.to_style_name()),
@@ -7,12 +7,19 @@ use artcraft_api_defs::common::responses::media_links::MediaLinks;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use chrono::{DateTime, Utc};
use enums_db::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_api::by_table::media_files::media_file_animation_type::MediaFileAnimationType as ApiMediaFileAnimationType;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use enums_db::by_table::media_files::media_file_origin_category::MediaFileOriginCategory;
use enums_api::by_table::media_files::media_file_origin_category::MediaFileOriginCategory as ApiMediaFileOriginCategory;
use enums_db::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory;
use enums_api::by_table::media_files::media_file_origin_product_category::MediaFileOriginProductCategory as ApiMediaFileOriginProductCategory;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::no_table::style_transfer::style_transfer_name::StyleTransferName;
use enums_api::no_table::style_transfer::style_transfer_name::StyleTransferName as ApiStyleTransferName;
use enums_public::by_table::media_files::public_media_file_model_type::PublicMediaFileModelType;
use log::{debug, error, warn};
use mysql_queries::queries::media_files::get::batch_get_media_files_by_tokens::batch_get_media_files_by_tokens;
@@ -40,22 +47,22 @@ pub struct PinnedMediaFile {
pub token: MediaFileToken,
/// The coarse-grained class of media file: image, video, etc.
pub media_class: MediaFileClass,
pub media_class: ApiMediaFileClass,
/// Type of media will dictate which fields are populated and what
/// the frontend should display (eg. video player vs audio player).
/// This is closer in meaning to a "mime type".
pub media_type: MediaFileType,
pub media_type: ApiMediaFileType,
/// If this is an engine/3D asset, this is the broad category (scene,
/// animation, etc.) of that object.
/// This can also be used for filtering in list/batch endpoints.
pub maybe_engine_category: Option<MediaFileEngineCategory>,
pub maybe_engine_category: Option<ApiMediaFileEngineCategory>,
/// If this is an engine/3D asset for an animation or a rig that can
/// be animated with either (or both) skeletal or blend shape animations,
/// this describes the animation regime used or supported.
pub maybe_animation_type: Option<MediaFileAnimationType>,
pub maybe_animation_type: Option<ApiMediaFileAnimationType>,
/// (DEPRECATED) URL path to the media file
#[deprecated(note="This field doesn't point to the full URL. Use media_links instead to leverage the CDN.")]
@@ -74,10 +81,10 @@ pub struct PinnedMediaFile {
pub cover_image: MediaFileCoverImageDetails,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub origin_category: MediaFileOriginCategory,
pub origin_category: ApiMediaFileOriginCategory,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub origin_product_category: MediaFileOriginProductCategory,
pub origin_product_category: ApiMediaFileOriginProductCategory,
#[deprecated(note="Use MediaFileOriginDetails instead")]
pub maybe_origin_model_type: Option<PublicMediaFileModelType>,
@@ -106,7 +113,7 @@ pub struct PinnedMediaFile {
/// For Comfy / Video Style Transfer jobs, this might include
/// the name of the selected style.
pub maybe_style_name: Option<StyleTransferName>,
pub maybe_style_name: Option<ApiStyleTransferName>,
/// Duration for audio and video files, if available.
/// Measured in milliseconds.
@@ -211,10 +218,14 @@ pub async fn list_pinned_media_files_handler(
PinnedMediaFile {
token: m.token.clone(),
media_class: m.media_class,
media_type: m.media_type,
maybe_engine_category: m.maybe_engine_category,
maybe_animation_type: m.maybe_animation_type,
media_class: enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&m.media_class),
media_type: enums_convert::by_table::media_files::media_file_type::media_file_type_to_api(&m.media_type),
maybe_engine_category: enums_convert::by_table::media_files::media_file_engine_category::media_file_engine_category_to_api(&m.maybe_engine_category),
maybe_animation_type: enums_convert::by_table::media_files::media_file_animation_type::media_file_animation_type_to_api(&m.maybe_animation_type),
media_links: MediaLinksBuilder::from_media_path_and_env(
media_domain,
server_state.server_environment,
@@ -232,14 +243,17 @@ pub async fn list_pinned_media_files_handler(
m.maybe_file_cover_image_public_bucket_prefix.as_deref(),
m.maybe_file_cover_image_public_bucket_extension.as_deref(),
),
origin: MediaFileOriginDetails::from_db_fields_str(
origin: enums_convert::by_table::media_files::media_file_origin_product_category::media_file_origin_product_category_to_api(&MediaFileOriginDetails::from_db_fields_str()
m.origin_category,
m.origin_product_category,
m.maybe_origin_model_type,
m.maybe_origin_model_token.as_deref(),
m.maybe_origin_model_title.as_deref()),
origin_category: m.origin_category,
origin_product_category: m.origin_product_category,
origin_category: enums_convert::by_table::media_files::media_file_origin_category::media_file_origin_category_to_api(&m.origin_category),
origin_product_category: enums_convert::by_table::media_files::media_file_origin_product_category::media_file_origin_product_category_to_api(&m.origin_product_category),
maybe_origin_model_type: m.maybe_origin_model_type
.map(|m| PublicMediaFileModelType::from_enum(m)),
maybe_origin_model_token: m.maybe_origin_model_token,
@@ -253,7 +267,8 @@ pub async fn list_pinned_media_files_handler(
is_intermediate_system_file: m.is_intermediate_system_file,
maybe_title: m.maybe_title,
maybe_text_transcript: m.maybe_text_transcript,
maybe_style_name: m.maybe_prompt_args
maybe_style_name: enums_convert::no_table::style_transfer::style_transfer_name::style_transfer_name_to_api(&m.maybe_prompt_args)
.as_ref()
.and_then(|args| args.style_name.as_ref())
.and_then(|style| style.to_style_name()),
@@ -9,9 +9,13 @@ use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path:
use chrono::{DateTime, Utc};
use elasticsearch_schema::searches::search_media_files::{search_media_files, SearchArgs};
use enums_db::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_api::by_table::media_files::media_file_animation_type::MediaFileAnimationType as ApiMediaFileAnimationType;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::visibility::Visibility;
use log::warn;
use tokens::tokens::media_files::MediaFileToken;
@@ -75,22 +79,22 @@ pub struct SearchFeaturedMediaFileListItem {
pub token: MediaFileToken,
/// The coarse-grained class of media file: image, video, etc.
pub media_class: MediaFileClass,
pub media_class: ApiMediaFileClass,
/// Type of media will dictate which fields are populated and what
/// the frontend should display (eg. video player vs audio player).
/// This is closer in meaning to a "mime type".
pub media_type: MediaFileType,
pub media_type: ApiMediaFileType,
/// If this is an engine/3D asset, this is the broad category (scene,
/// animation, etc.) of that object.
/// This can also be used for filtering in list/batch endpoints.
pub maybe_engine_category: Option<MediaFileEngineCategory>,
pub maybe_engine_category: Option<ApiMediaFileEngineCategory>,
/// If this is an engine/3D asset for an animation or a rig that can
/// be animated with either (or both) skeletal or blend shape animations,
/// this describes the animation regime used or supported.
pub maybe_animation_type: Option<MediaFileAnimationType>,
pub maybe_animation_type: Option<ApiMediaFileAnimationType>,
/// (DEPRECATED) URL path to the media file
#[deprecated(note="This field doesn't point to the full URL. Use media_links instead to leverage the CDN.")]
@@ -223,10 +227,14 @@ pub async fn search_featured_media_files_handler(
result.maybe_public_bucket_extension.as_deref());
SearchFeaturedMediaFileListItem {
token: result.token.clone(),
media_class: result.media_class,
media_type: result.media_type,
maybe_engine_category: result.maybe_engine_category,
maybe_animation_type: result.maybe_animation_type,
media_class: enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&result.media_class),
media_type: enums_convert::by_table::media_files::media_file_type::media_file_type_to_api(&result.media_type),
maybe_engine_category: enums_convert::by_table::media_files::media_file_engine_category::media_file_engine_category_to_api(&result.maybe_engine_category),
maybe_animation_type: enums_convert::by_table::media_files::media_file_animation_type::media_file_animation_type_to_api(&result.maybe_animation_type),
media_links: MediaLinksBuilder::from_media_path_and_env(
media_domain,
server_state.server_environment,
@@ -257,7 +265,8 @@ pub async fn search_featured_media_files_handler(
is_user_upload: result.is_user_upload.unwrap_or(false),
is_intermediate_system_file: result.is_intermediate_system_file.unwrap_or(false),
is_featured: result.is_featured,
creator_set_visibility: result.creator_set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_api(&result.creator_set_visibility),
maybe_title: result.maybe_title,
// maybe_text_transcript: result.maybe_text_transcript,
// maybe_style_name: result.maybe_prompt_args
@@ -9,9 +9,13 @@ use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path:
use chrono::{DateTime, Utc};
use elasticsearch_schema::searches::search_media_files::{search_media_files, SearchArgs};
use enums_db::by_table::media_files::media_file_animation_type::MediaFileAnimationType;
use enums_api::by_table::media_files::media_file_animation_type::MediaFileAnimationType as ApiMediaFileAnimationType;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_engine_category::MediaFileEngineCategory;
use enums_api::by_table::media_files::media_file_engine_category::MediaFileEngineCategory as ApiMediaFileEngineCategory;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::visibility::Visibility;
use log::warn;
use tokens::tokens::media_files::MediaFileToken;
@@ -76,22 +80,22 @@ pub struct SearchMediaFileListItem {
pub token: MediaFileToken,
/// The coarse-grained class of media file: image, video, etc.
pub media_class: MediaFileClass,
pub media_class: ApiMediaFileClass,
/// Type of media will dictate which fields are populated and what
/// the frontend should display (eg. video player vs audio player).
/// This is closer in meaning to a "mime type".
pub media_type: MediaFileType,
pub media_type: ApiMediaFileType,
/// If this is an engine/3D asset, this is the broad category (scene,
/// animation, etc.) of that object.
/// This can also be used for filtering in list/batch endpoints.
pub maybe_engine_category: Option<MediaFileEngineCategory>,
pub maybe_engine_category: Option<ApiMediaFileEngineCategory>,
/// If this is an engine/3D asset for an animation or a rig that can
/// be animated with either (or both) skeletal or blend shape animations,
/// this describes the animation regime used or supported.
pub maybe_animation_type: Option<MediaFileAnimationType>,
pub maybe_animation_type: Option<ApiMediaFileAnimationType>,
/// (DEPRECATED) URL path to the media file
#[deprecated(note="This field doesn't point to the full URL. Use media_links instead to leverage the CDN.")]
@@ -250,10 +254,14 @@ pub async fn search_session_media_files_handler(
result.maybe_public_bucket_extension.as_deref());
SearchMediaFileListItem {
token: result.token.clone(),
media_class: result.media_class,
media_type: result.media_type,
maybe_engine_category: result.maybe_engine_category,
maybe_animation_type: result.maybe_animation_type,
media_class: enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&result.media_class),
media_type: enums_convert::by_table::media_files::media_file_type::media_file_type_to_api(&result.media_type),
maybe_engine_category: enums_convert::by_table::media_files::media_file_engine_category::media_file_engine_category_to_api(&result.maybe_engine_category),
maybe_animation_type: enums_convert::by_table::media_files::media_file_animation_type::media_file_animation_type_to_api(&result.maybe_animation_type),
media_links: MediaLinksBuilder::from_media_path_and_env(
media_domain,
server_state.server_environment,
@@ -284,7 +292,8 @@ pub async fn search_session_media_files_handler(
is_featured: result.is_featured,
is_user_upload: result.is_user_upload.unwrap_or(false),
is_intermediate_system_file: result.is_intermediate_system_file.unwrap_or(false),
creator_set_visibility: result.creator_set_visibility,
creator_set_visibility: enums_convert::common::visibility::visibility_to_api(&result.creator_set_visibility),
maybe_title: result.maybe_title,
// maybe_text_transcript: result.maybe_text_transcript,
// maybe_style_name: result.maybe_prompt_args
@@ -14,7 +14,9 @@ use utoipa::ToSchema;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::visibility::Visibility;
use hashing::sha256::sha256_hash_bytes::sha256_hash_bytes;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -315,7 +317,8 @@ pub async fn upload_audio_media_file_handler(
})?;
let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs {
maybe_media_class: Some(MediaFileClass::Audio),
maybe_media_class: Some(enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&MediaFileClass::Audio)),
media_file_type: MediaFileType::Audio,
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(),
@@ -8,7 +8,9 @@ use utoipa::ToSchema;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::visibility::Visibility;
use hashing::sha256::sha256_hash_bytes::sha256_hash_bytes;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -203,7 +205,8 @@ pub async fn upload_engine_asset_media_file_handler(
// TODO(bt, 2024-02-22): This should be a transaction.
let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs {
maybe_media_class: Some(MediaFileClass::Dimensional),
maybe_media_class: Some(enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&MediaFileClass::Dimensional)),
media_file_type,
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(),
@@ -17,7 +17,9 @@ use crate::http_server::validations::validate_idempotency_token_format::validate
use crate::state::server_state::ServerState;
use bucket_paths::legacy::typified_paths::public::media_files::bucket_file_path::MediaFileBucketPath;
use enums_db::by_table::media_files::media_file_class::MediaFileClass;
use enums_api::by_table::media_files::media_file_class::MediaFileClass as ApiMediaFileClass;
use enums_db::by_table::media_files::media_file_type::MediaFileType;
use enums_api::by_table::media_files::media_file_type::MediaFileType as ApiMediaFileType;
use enums_db::common::visibility::Visibility;
use hashing::sha256::sha256_hash_bytes::sha256_hash_bytes;
use http_server_common::request::get_request_ip::get_request_ip;
@@ -283,7 +285,8 @@ pub async fn upload_image_media_file_handler(
.map(|token| token.0.clone());
let (token, record_id) = insert_media_file_from_file_upload(InsertMediaFileFromUploadArgs {
maybe_media_class: Some(MediaFileClass::Image),
maybe_media_class: Some(enums_convert::by_table::media_files::media_file_class::media_file_class_to_api(&MediaFileClass::Image)),
media_file_type: MediaFileType::Image,
maybe_creator_user_token: maybe_user_token.as_ref(),
maybe_creator_anonymous_visitor_token: maybe_avt_token.as_ref(),
Loaded 100 of 151 files, more files were not shown because too many files have changed in this diff. Show more