Compare commits

...
Author SHA1 Message Date
Brandon Thomas b4ad2b72a5 refactor 2025-09-23 22:43:28 -04:00
Brandon Thomas 916730d0a1 refactor 2025-09-23 22:25:33 -04:00
Brandon Thomas c3a6efa4d5 refactor 2025-09-23 22:17:30 -04:00
Brandon Thomas 29b96b8dec three routes packages 2025-09-23 22:05:04 -04:00
Brandon Thomas 8484c469d3 cleanup routes 2025-09-23 21:24:25 -04:00
32 changed files with 1177 additions and 991 deletions
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,73 @@
use crate::http_server::routes::application_routes::comments_routes::add_comments_routes;
use crate::http_server::routes::application_routes::credits_routes::add_credits_routes;
use crate::http_server::routes::application_routes::featured_item_routes::add_featured_item_routes;
use crate::http_server::routes::application_routes::generate_routes::add_generate_routes;
use crate::http_server::routes::application_routes::job_routes::add_job_routes;
use crate::http_server::routes::application_routes::media_files_routes::add_media_file_routes;
use crate::http_server::routes::application_routes::moderation_routes::add_moderator_routes;
use crate::http_server::routes::application_routes::stripe_artcraft_routes::add_stripe_artcraft_routes;
use crate::http_server::routes::application_routes::subscription_routes::add_subscription_routes;
use crate::http_server::routes::application_routes::tag_routes::add_tag_routes;
use crate::http_server::routes::application_routes::tts_routes::add_tts_routes;
use crate::http_server::routes::application_routes::user_bookmarks_routes::add_user_bookmarks_routes;
use crate::http_server::routes::application_routes::user_rating_routes::add_user_rating_routes;
use crate::http_server::routes::application_routes::user_routes::add_user_routes;
use crate::http_server::routes::application_routes::voice_conversion_routes::add_voice_conversion_routes;
use crate::http_server::routes::application_routes::webhook_routes::add_webhook_routes;
use crate::http_server::routes::application_routes::weights_routes::add_weights_routes;
use actix_http::body::MessageBody;
use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::{App, Error};
use billing_component::default_routes::add_suggested_stripe_billing_routes;
use crate::http_server::routes::application_routes::prompts_routes::add_prompts_routes;
/// Add the core application routes.
pub fn add_application_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
let mut app = add_moderator_routes(app); // /moderation
// Artcraft surface area
app = add_generate_routes(app); // /v1/generate/...
app = add_webhook_routes(app); // /v1/webhooks/... (fal)
// Remaining FakeYou surface area
app = add_tag_routes(app); // /v1/tags
app = add_tts_routes(app); // /tts
app = add_weights_routes(app); // v1/weights
app = add_voice_conversion_routes(app); // /v1/voice_conversion
// Media files routes
app = add_media_file_routes(app); // /v1/media_files/...
app = add_featured_item_routes(app); // /v1/featured_item/...
app = add_prompts_routes(app); // /v1/prompts/...
// Job system
app = add_job_routes(app);
// User and user-adjacent routes
app = add_comments_routes(app); // /v1/comments/...
app = add_user_bookmarks_routes(app); // /v1/user_bookmarks/...
app = add_user_rating_routes(app); // /v1/user_rating/...
app = add_user_routes(app); // /create_account, /session, /login, /logout, etc.
// Artcraft Billing pieces
app = add_credits_routes(app); // /v1/credits/...
app = add_stripe_artcraft_routes(app); // /v1/stripe_artcraft/...
app = add_subscription_routes(app); // /v1/subscriptions/...
// FakeYou Billing component - still necessary for FakeYou monetization
app = add_suggested_stripe_billing_routes(app); // /stripe, billing, webhooks, etc.
app
}
@@ -0,0 +1,28 @@
use crate::http_server::endpoints::comments::create_comment_handler::create_comment_handler;
use crate::http_server::endpoints::comments::delete_comment_handler::delete_comment_handler;
use crate::http_server::endpoints::comments::list_comments_handler::list_comments_handler;
use actix_helpers::route_builder::RouteBuilder;
use actix_http::body::MessageBody;
use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::error::Error;
use actix_web::App;
pub fn add_comments_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
RouteBuilder::from_app(app)
.add_get("/v1/comments/list/{entity_type}/{entity_token}", list_comments_handler)
.add_post("/v1/comments/new", create_comment_handler)
.add_post("/v1/comments/delete/{comment_token}", delete_comment_handler)
.into_app()
}
@@ -0,0 +1,38 @@
use actix_http::body::MessageBody;
use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::error::Error;
use actix_web::{web, App, HttpResponse};
use crate::http_server::endpoints::featured_items::create_featured_item_handler::create_featured_item_handler;
use crate::http_server::endpoints::featured_items::delete_featured_item_handler::delete_featured_item_handler;
use crate::http_server::endpoints::featured_items::get_is_featured_item_handler::get_is_featured_item_handler;
// ==================== FEATURED ITEM ROUTES ====================
pub fn add_featured_item_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(web::scope("/v1/featured_item")
.service(web::resource("/create")
.route(web::post().to(create_featured_item_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/delete")
.route(web::delete().to(delete_featured_item_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/is_featured/{entity_type}/{entity_token}")
.route(web::get().to(get_is_featured_item_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
@@ -0,0 +1,19 @@
mod comments_routes;
mod credits_routes;
mod featured_item_routes;
mod generate_routes;
mod job_routes;
mod media_files_routes;
mod moderation_routes;
mod stripe_artcraft_routes;
mod subscription_routes;
mod tag_routes;
mod tts_routes;
mod user_bookmarks_routes;
mod user_rating_routes;
mod user_routes;
mod voice_conversion_routes;
mod webhook_routes;
mod weights_routes;
pub (super) mod add_application_routes;
mod prompts_routes;
@@ -0,0 +1,27 @@
use crate::http_server::endpoints::prompts::create_prompt_handler::create_prompt_handler;
use crate::http_server::endpoints::prompts::get_prompt_handler::get_prompt_handler;
use actix_helpers::route_builder::RouteBuilder;
use actix_http::body::MessageBody;
use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::error::Error;
use actix_web::App;
pub fn add_prompts_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
RouteBuilder::from_app(app)
// NB: This poor RouteBuilder utility requires that POST comes first, otherwise the GET glob
// will capture it and force 504 Method Not Allowed for all POSTs.
.add_post("/v1/prompts/create", create_prompt_handler)
.add_get("/v1/prompts/{token}", get_prompt_handler)
.into_app()
}
@@ -0,0 +1,120 @@
use actix_http::body::MessageBody;
use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::error::Error;
use actix_web::{web, App, HttpResponse};
use crate::http_server::endpoints::tts::delete_tts_model::delete_tts_model_handler;
use crate::http_server::endpoints::tts::delete_tts_result::delete_tts_inference_result_handler;
use crate::http_server::endpoints::tts::edit_tts_model::edit_tts_model_handler;
use crate::http_server::endpoints::tts::edit_tts_result::edit_tts_inference_result_handler;
use crate::http_server::endpoints::tts::enqueue_infer_f5_tts_handler::enqueue_infer_f5_tts_handler::enqueue_infer_f5_tts_handler;
use crate::http_server::endpoints::tts::enqueue_infer_tts_handler::enqueue_infer_tts_handler::enqueue_infer_tts_handler;
use crate::http_server::endpoints::tts::enqueue_upload_tts_model::upload_tts_model_handler;
use crate::http_server::endpoints::tts::get_pending_tts_inference_job_count::get_pending_tts_inference_job_count_handler;
use crate::http_server::endpoints::tts::get_tts_inference_job_status::get_tts_inference_job_status_handler;
use crate::http_server::endpoints::tts::get_tts_model::get_tts_model_handler;
use crate::http_server::endpoints::tts::get_tts_model_use_count::get_tts_model_use_count_handler;
use crate::http_server::endpoints::tts::get_tts_result::get_tts_inference_result_handler;
use crate::http_server::endpoints::tts::get_tts_upload_model_job_status::get_tts_upload_model_job_status_handler;
use crate::http_server::endpoints::tts::list_tts_models::list_tts_models_handler;
use crate::http_server::endpoints::tts::search_tts_models_handler::search_tts_models_handler;
// ==================== TTS ROUTES ====================
pub fn add_tts_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
// NB(bt,2024-04-03): Newer /v1/tts/* routes don't have public use, but we'll start using it
app.service(web::resource("/v1/tts/inference")
.route(web::post().to(enqueue_infer_tts_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/v1/tts/f5_inference")
.route(web::post().to(enqueue_infer_f5_tts_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
// NB(bt,2024-04-03): Older root /tts/* routes should be drained of traffic. They are used in the Twitch Streamer API though.
.service(
web::scope("/tts")
.service(
web::resource("/upload")
.route(web::post().to(upload_tts_model_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/inference")
.route(web::post().to(enqueue_infer_tts_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/list")
.route(web::get().to(list_tts_models_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/search")
.route(web::post().to(search_tts_models_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/model/{token}")
.route(web::get().to(get_tts_model_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/model/{token}/delete")
.route(web::post().to(delete_tts_model_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/model/{model_token}/count")
.route(web::get().to(get_tts_model_use_count_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/model/{model_token}/edit")
.route(web::post().to(edit_tts_model_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/result/{token}")
.route(web::get().to(get_tts_inference_result_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/result/{token}/edit")
.route(web::post().to(edit_tts_inference_result_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/result/{token}/delete")
.route(web::post().to(delete_tts_inference_result_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/job/{token}")
.route(web::get().to(get_tts_inference_job_status_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/upload_model_job/{token}")
.route(web::get().to(get_tts_upload_model_job_status_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/queue_length")
.route(web::get().to(get_pending_tts_inference_job_count_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
@@ -0,0 +1,33 @@
use crate::http_server::endpoints::user_bookmarks::batch_get_user_bookmarks_handler::batch_get_user_bookmarks_handler;
use crate::http_server::endpoints::user_bookmarks::create_user_bookmark_handler::create_user_bookmark_handler;
use crate::http_server::endpoints::user_bookmarks::delete_user_bookmark_handler::delete_user_bookmark_handler;
use crate::http_server::endpoints::user_bookmarks::list_user_bookmarks_for_entity_handler::list_user_bookmarks_for_entity_handler;
use crate::http_server::endpoints::user_bookmarks::list_user_bookmarks_for_user_handler::list_user_bookmarks_for_user_handler;
use actix_helpers::route_builder::RouteBuilder;
use actix_http::body::MessageBody;
use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::error::Error;
use actix_web::App;
pub fn add_user_bookmarks_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
RouteBuilder::from_app(app)
.add_get("/v1/user_bookmarks/batch", batch_get_user_bookmarks_handler)
.add_post("/v1/user_bookmarks/create", create_user_bookmark_handler)
.add_post("/v1/user_bookmarks/delete/{user_bookmark_token}", delete_user_bookmark_handler)
//.add_get("/v1/user_bookmarks/list/session", list_user_bookmarks_for_session_handler)
.add_get("/v1/user_bookmarks/list/user/{username}", list_user_bookmarks_for_user_handler)
.add_get("/v1/user_bookmarks/list/entity/{entity_type}/{entity_token}", list_user_bookmarks_for_entity_handler)
.into_app()
}
@@ -0,0 +1,37 @@
use actix_http::body::MessageBody;
use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::error::Error;
use actix_web::{web, App, HttpResponse};
use crate::http_server::endpoints::user_ratings::batch_get_user_rating_handler::batch_get_user_rating_handler;
use crate::http_server::endpoints::user_ratings::get_user_rating_handler::get_user_rating_handler;
use crate::http_server::endpoints::user_ratings::set_user_rating_handler::set_user_rating_handler;
pub fn add_user_rating_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(web::scope("/v1/user_rating")
.service(web::resource("/batch")
.route(web::get().to(batch_get_user_rating_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/rate")
.route(web::post().to(set_user_rating_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/view/{entity_type}/{entity_token}")
.route(web::get().to(get_user_rating_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
@@ -0,0 +1,41 @@
use actix_http::body::MessageBody;
use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::error::Error;
use actix_web::{web, App, HttpResponse};
use crate::http_server::endpoints::voice_conversion::enqueue_seed_vc_inference_handler::enqueue_infer_seed_vc_handler;
use crate::http_server::endpoints::voice_conversion::enqueue_voice_conversion_inference_handler::enqueue_voice_conversion_inference_handler;
use crate::http_server::endpoints::voice_conversion::list_voice_conversion_models_handler::list_voice_conversion_models_handler;
pub fn add_voice_conversion_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(
web::scope("/v1/voice_conversion")
.service(
web::resource("/inference")
.route(web::post().to(enqueue_voice_conversion_inference_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/seed_vc_inference")
.route(web::post().to(enqueue_infer_seed_vc_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/model_list")
.route(web::get().to(list_voice_conversion_models_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
@@ -0,0 +1,648 @@
use crate::http_server::deprecated_endpoints::animation::enqueue_face_animation::enqueue_face_animation_handler;
use crate::http_server::deprecated_endpoints::animation::enqueue_rerender_animation::enqueue_rerender_animation_handler;
use crate::http_server::deprecated_endpoints::api_tokens::create_api_token::create_api_token_handler;
use crate::http_server::deprecated_endpoints::api_tokens::delete_api_token::delete_api_token_handler;
use crate::http_server::deprecated_endpoints::api_tokens::edit_api_token::edit_api_token_handler;
use crate::http_server::deprecated_endpoints::api_tokens::list_api_tokens::list_api_tokens_handler;
use crate::http_server::deprecated_endpoints::categories::create_category::create_category_handler;
use crate::http_server::deprecated_endpoints::categories::get_category::get_category_handler;
use crate::http_server::deprecated_endpoints::categories::tts::assign_tts_category::assign_tts_category_handler;
use crate::http_server::deprecated_endpoints::categories::tts::list_fully_computed_assigned_tts_categories::list_fully_computed_assigned_tts_categories::list_fully_computed_assigned_tts_categories_handler;
use crate::http_server::deprecated_endpoints::categories::tts::list_tts_categories::list_tts_categories_handler;
use crate::http_server::deprecated_endpoints::categories::tts::list_tts_model_assigned_categories::list_tts_model_assigned_categories_handler;
use crate::http_server::deprecated_endpoints::conversion::enqueue_fbx_to_gltf_handler::enqueue_fbx_to_gltf_handler;
use crate::http_server::deprecated_endpoints::conversion::enqueue_render_engine_scene_to_video_handler::enqueue_render_engine_scene_to_video_handler;
use crate::http_server::deprecated_endpoints::engine::create_scene_handler::create_scene_handler;
use crate::http_server::deprecated_endpoints::engine::get_scene_handler::get_scene_handler;
use crate::http_server::deprecated_endpoints::engine::update_scene_handler::update_scene_handler;
use crate::http_server::deprecated_endpoints::events::list_events::list_events_handler;
use crate::http_server::deprecated_endpoints::flags::design_refresh_flag::disable_design_refresh_flag_handler::disable_design_refresh_flag_handler;
use crate::http_server::deprecated_endpoints::flags::design_refresh_flag::enable_design_refresh_flag_handler::enable_design_refresh_flag_handler;
use crate::http_server::deprecated_endpoints::investor_demo::disable_demo_mode_handler::disable_demo_mode_handler;
use crate::http_server::deprecated_endpoints::investor_demo::enable_demo_mode_handler::enable_demo_mode_handler;
use crate::http_server::deprecated_endpoints::leaderboard::get_leaderboard::leaderboard_handler;
use crate::http_server::deprecated_endpoints::media_uploads::list_user_media_uploads_of_type::list_user_media_uploads_of_type_handler;
use crate::http_server::deprecated_endpoints::media_uploads::upload_audio::upload_audio_handler;
use crate::http_server::deprecated_endpoints::media_uploads::upload_image::upload_image_handler;
use crate::http_server::deprecated_endpoints::media_uploads::upload_media::upload_media_handler;
use crate::http_server::deprecated_endpoints::mocap::enqueue_mocapnet::enqueue_mocapnet_handler;
use crate::http_server::deprecated_endpoints::vocoders::get_vocoder::get_vocoder_handler;
use crate::http_server::deprecated_endpoints::vocoders::list_vocoders::list_vocoders_handler;
use crate::http_server::deprecated_endpoints::w2l::delete_w2l_result::delete_w2l_inference_result_handler;
use crate::http_server::deprecated_endpoints::w2l::delete_w2l_template::delete_w2l_template_handler;
use crate::http_server::deprecated_endpoints::w2l::edit_w2l_result::edit_w2l_inference_result_handler;
use crate::http_server::deprecated_endpoints::w2l::edit_w2l_template::edit_w2l_template_handler;
use crate::http_server::deprecated_endpoints::w2l::enqueue_infer_w2l_with_uploads::enqueue_infer_w2l_with_uploads;
use crate::http_server::deprecated_endpoints::w2l::enqueue_upload_w2l_template::upload_w2l_template_handler;
use crate::http_server::deprecated_endpoints::w2l::get_w2l_inference_job_status::get_w2l_inference_job_status_handler;
use crate::http_server::deprecated_endpoints::w2l::get_w2l_result::get_w2l_inference_result_handler;
use crate::http_server::deprecated_endpoints::w2l::get_w2l_template::get_w2l_template_handler;
use crate::http_server::deprecated_endpoints::w2l::get_w2l_template_use_count::get_w2l_template_use_count_handler;
use crate::http_server::deprecated_endpoints::w2l::get_w2l_upload_template_job_status::get_w2l_upload_template_job_status_handler;
use crate::http_server::deprecated_endpoints::w2l::list_w2l_templates::list_w2l_templates_handler;
use crate::http_server::deprecated_endpoints::w2l::set_w2l_template_mod_approval::set_w2l_template_mod_approval_handler;
use crate::http_server::endpoints::download_job::enqueue_generic_download::enqueue_generic_download_handler;
use crate::http_server::endpoints::download_job::get_generic_upload_job_status::get_generic_download_job_status_handler;
use crate::http_server::endpoints::misc::enable_alpha_easy_handler::enable_alpha_easy_handler;
use crate::http_server::endpoints::misc::enable_alpha_handler::enable_alpha_handler;
use crate::http_server::endpoints::trending::list_trending_tts_models::list_trending_tts_models_handler;
use crate::http_server::endpoints::voice_clone_requests::check_if_voice_clone_request_submitted::check_if_voice_clone_request_submitted_handler;
use crate::http_server::endpoints::voice_clone_requests::create_voice_clone_request::create_voice_clone_request_handler;
use crate::http_server::endpoints::voice_designer::inference::enqueue_tts_request::enqueue_tts_request;
use crate::http_server::endpoints::voice_designer::inference::enqueue_vc_request::enqueue_vc_request;
use crate::http_server::endpoints::voice_designer::voice_dataset_samples::delete_sample::delete_sample_handler;
use crate::http_server::endpoints::voice_designer::voice_dataset_samples::list_samples_by_dataset::list_samples_by_dataset_handler;
use crate::http_server::endpoints::voice_designer::voice_dataset_samples::upload_zs_sample::upload_zs_sample_handler;
use crate::http_server::endpoints::voice_designer::voice_datasets::create_dataset::create_dataset_handler;
use crate::http_server::endpoints::voice_designer::voice_datasets::delete_dataset::delete_dataset_handler;
use crate::http_server::endpoints::voice_designer::voice_datasets::get_dataset::get_dataset_handler;
use crate::http_server::endpoints::voice_designer::voice_datasets::list_datasets_by_session::list_datasets_by_session_handler;
use crate::http_server::endpoints::voice_designer::voice_datasets::list_datasets_by_user::list_datasets_by_user_handler;
use crate::http_server::endpoints::voice_designer::voice_datasets::update_dataset::update_dataset_handler;
use crate::http_server::endpoints::voice_designer::voices::create_voice::create_voice_handler;
use crate::http_server::endpoints::voice_designer::voices::delete_voice::delete_voice_handler;
use crate::http_server::endpoints::voice_designer::voices::get_voice::get_voice_handler;
use crate::http_server::endpoints::voice_designer::voices::list_available_voices::list_available_voices_handler;
use crate::http_server::endpoints::voice_designer::voices::list_voices_by_session::list_voices_by_session_handler;
use crate::http_server::endpoints::voice_designer::voices::list_voices_by_user::list_voices_by_user_handler;
use crate::http_server::endpoints::voice_designer::voices::search_voices::search_voices;
use crate::http_server::endpoints::voice_designer::voices::update_voice::update_voice_handler;
use crate::http_server::routes::legacy_routes::beta_key_routes::add_beta_key_routes;
use crate::http_server::routes::legacy_routes::control_plane_sora_routes::add_control_plane_sora_routes;
use crate::http_server::routes::legacy_routes::desktop_vc_app_routes::add_desktop_vc_app_routes;
use crate::http_server::routes::legacy_routes::image_studio_routes::add_image_studio_routes;
use crate::http_server::routes::legacy_routes::model_download_routes::add_model_download_routes;
use crate::http_server::routes::legacy_routes::studio_gen2_routes::add_studio_gen2_routes;
use crate::http_server::routes::legacy_routes::workflow_routes::add_workflow_routes;
use actix_helpers::route_builder::RouteBuilder;
use actix_http::body::MessageBody;
use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::error::Error;
use actix_web::{web, App, HttpResponse};
use crate::http_server::endpoints::app_state::get_app_state_handler::get_app_state_handler;
use crate::http_server::endpoints::service::status_alert_handler::status_alert_handler;
use crate::http_server::endpoints::stats::get_unified_queue_stats_handler::get_unified_queue_stats_handler;
pub fn add_legacy_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
let mut app = add_w2l_routes(app);
app = add_vocoder_routes(app); // /vocoder
app = add_remote_download_routes(app); // /v1/remote_downloads (prev. /retrieval, aka. "generic_download_jobs")
app = add_category_routes(app); // /category
app = add_api_token_routes(app); // /api_tokens
app = add_voice_clone_request_routes(app); // /voice_clone_requests
app = add_investor_demo_routes(app); // /demo_mode // TODO: DEFINITELY TEMPORARY
app = add_flag_routes(app); // /flag
app = add_voice_designer_routes(app); // /v1/voice_designer
app = add_beta_key_routes(app); // /v1/beta_keys
app = add_model_download_routes(app);
app = add_studio_gen2_routes(app);
app = add_image_studio_routes(app);
app = add_control_plane_sora_routes(app); // /v1/control_plane/...
app = add_workflow_routes(app);
app = add_engine_routes(app); // /v1/engine/...
app = add_desktop_vc_app_routes(app); // /v1/vc/...
app = add_media_upload_routes(app); // /v1/media_upload/...
app = add_trending_routes(app); // /v1/trending/...
// ==================== Animations ====================
let mut app = RouteBuilder::from_app(app)
.add_post("/v1/animation/face_animation/create", enqueue_face_animation_handler)
.add_post("/v1/animation/rerender/create", enqueue_rerender_animation_handler)
.into_app();
// ==================== Mocap ========================
let mut app = RouteBuilder::from_app(app)
.add_post("/v1/mocap/mocapnet/create", enqueue_mocapnet_handler)
.into_app();
// ==================== Format Conversion ====================
let mut app = RouteBuilder::from_app(app)
.add_post("/v1/conversion/enqueue_fbx_to_gltf", enqueue_fbx_to_gltf_handler)
.into_app();
// =================== BVH from Workflow ====================
// TODO(bt,2024-03-15): Migrate from "bvh_to_workflow" to "render_engine_scene"
let mut app = RouteBuilder::from_app(app)
.add_post("/v1/conversion/enqueue_bvh_to_workflow", enqueue_render_engine_scene_to_video_handler)
.add_post("/v1/conversion/enqueue_render_engine_scene", enqueue_render_engine_scene_to_video_handler)
.into_app();
let app = app.service(web::resource("/leaderboard")
.route(web::get().to(leaderboard_handler))
.route(web::head().to(|| HttpResponse::Ok()))
);
// ==================== FakeYou Frontend Application State ====================
let mut app = RouteBuilder::from_app(app)
.add_get("/v1/app_state", get_app_state_handler)
.into_app();
// ==================== Stats ====================
let mut app = RouteBuilder::from_app(app)
.add_get("/v1/stats/queues", get_unified_queue_stats_handler)
.into_app();
let app = app.service(
web::resource("/events")
.route(web::get().to(list_events_handler))
.route(web::head().to(|| HttpResponse::Ok()))
);
let app = app
.service(enable_alpha_handler)
.service(enable_alpha_easy_handler);
app
}
// ==================== VOCODER ROUTES ====================
fn add_vocoder_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(
web::scope("/vocoder")
.service(
web::resource("/list")
.route(web::get().to(list_vocoders_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/model/{token}")
.route(web::get().to(get_vocoder_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
// ==================== WAV2LIP ROUTES ====================
fn add_w2l_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(
web::scope("/w2l")
.service(
web::resource("/upload")
.route(web::post().to(upload_w2l_template_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/inference")
.route(web::post().to(enqueue_infer_w2l_with_uploads))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/list")
.route(web::get().to(list_w2l_templates_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/template/{token}")
.route(web::get().to(get_w2l_template_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/template/{template_token}/count")
.route(web::get().to(get_w2l_template_use_count_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/template/{template_token}/edit")
.route(web::post().to(edit_w2l_template_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/template/{token}/moderate")
.route(web::post().to(set_w2l_template_mod_approval_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/template/{token}/delete")
.route(web::post().to(delete_w2l_template_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/result/{token}")
.route(web::get().to(get_w2l_inference_result_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/result/{token}/edit")
.route(web::post().to(edit_w2l_inference_result_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/result/{token}/delete")
.route(web::post().to(delete_w2l_inference_result_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/job/{token}")
.route(web::get().to(get_w2l_inference_job_status_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/upload_template_job/{token}")
.route(web::get().to(get_w2l_upload_template_job_status_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
// ==================== RETRIEVAL ROUTES ("GENERIC_DOWNLOAD_JOBS") ====================
fn add_remote_download_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
RouteBuilder::from_app(app)
// NB: These are the new route names
.add_post("/v1/remote_download/enqueue", enqueue_generic_download_handler)
.add_get("/v1/remote_download/job_status/{token}", get_generic_download_job_status_handler)
// NB: These are the old, deprecated route names that should be removed
.add_post("/retrieval/enqueue", enqueue_generic_download_handler)
.add_get("/retrieval/job_status/{token}", get_generic_download_job_status_handler)
.into_app()
}
// ==================== CATEGORY ROUTES ====================
fn add_category_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(
web::scope("/v1/category")
.service(
web::scope("/list")
.service(
web::resource("/tts")
.route(web::get().to(list_tts_categories_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
.service(
web::scope("/computed_assignments")
.service(
web::resource("/tts")
.route(web::get().to(list_fully_computed_assigned_tts_categories_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
)
.service(
web::scope("/category")
.service(
web::resource("/create")
.route(web::post().to(create_category_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/view/{token}")
.route(web::get().to(get_category_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::scope("/list")
.service(
web::resource("/tts")
.route(web::get().to(list_tts_categories_handler)) // TODO: Deprecate with use of /v1* copy
.route(web::head().to(|| HttpResponse::Ok()))
)
)
.service(
web::scope("/assign")
.service(
web::resource("/tts")
.route(web::post().to(assign_tts_category_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
.service(
web::scope("/assignments")
.service(
web::resource("/tts/{token}")
.route(web::get().to(list_tts_model_assigned_categories_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
)
}
// ==================== API TOKEN ROUTES ====================
fn add_api_token_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(web::scope("/api_tokens")
.service(web::resource("/create")
.route(web::post().to(create_api_token_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/edit")
.route(web::post().to(edit_api_token_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/{api_token}/delete")
.route(web::post().to(delete_api_token_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/list")
.route(web::get().to(list_api_tokens_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
// ==================== API TOKEN ROUTES ====================
fn add_voice_clone_request_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(web::scope("/voice_clone_requests")
.service(web::resource("/create")
.route(web::post().to(create_voice_clone_request_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/check")
.route(web::post().to(check_if_voice_clone_request_submitted_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
// ==================== INVESTOR DEMO MODE ====================
fn add_investor_demo_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(web::scope("/demo_mode")
.service(web::resource("/enable")
.route(web::get().to(enable_demo_mode_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/disable")
.route(web::get().to(disable_demo_mode_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
// ==================== FLAG ROUTES ====================
fn add_flag_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(web::scope("/flags")
.service(web::scope("/design_refresh")
.service(web::resource("/enable")
.route(web::get().to(enable_design_refresh_flag_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/disable")
.route(web::get().to(disable_design_refresh_flag_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
)
}
// ==================== MEDIA UPLOAD ROUTES ====================
fn add_media_upload_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(web::scope("/v1/media_uploads")
.service(web::resource("/upload")
.route(web::post().to(upload_media_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/upload_audio")
.route(web::post().to(upload_audio_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/upload_image")
.route(web::post().to(upload_image_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/by_session/{media_type}")
.route(web::get().to(list_user_media_uploads_of_type_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
// ==================== TRENDING ROUTES ====================
fn add_trending_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(web::scope("/v1/trending")
.service(web::resource("/tts_models")
.route(web::get().to(list_trending_tts_models_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
//fn add_image_gen_routes<T,B> (app:App<T>)-> App<T>
// where
// B: MessageBody,
// T: ServiceFactory<
// ServiceRequest,
// Config = (),
// Response = ServiceResponse<B>,
// Error = Error,
// InitError = (),
// >,
//{
// //
// app.service(
// web::scope("/v1/image_gen")
// .service(
// web::scope("/upload")
// .route("/lora", web::post().to(enqueue_image_generation_request))
// .route("/model", web::post().to(enqueue_image_generation_request))
// )
// .service(
// web::scope("/enqueue")
// .route("/inference", web::post().to(enqueue_image_generation_request))
// )
// )
//}
// ==================== Engine Routes ====================
fn add_engine_routes<T, B>(app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = ()
>
{
app.service(web::scope("/v1/engine")
.service(web::resource("/create_scene")
.route(web::post().to(create_scene_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/scene/{token}")
.route(web::get().to(get_scene_handler))
.route(web::post().to(update_scene_handler))
)
)
}
fn add_voice_designer_routes<T,B> (app:App<T>)-> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(
web::scope("/v1/voice_designer")
.service(
web::scope("/dataset")
.route("/create", web::post().to(create_dataset_handler))
.service(web::resource("/{dataset_token}/update")
.route(web::post().to(update_dataset_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.route("/{dataset_token}", web::get().to(get_dataset_handler))
.route("/{dataset_token}/delete", web::delete().to(delete_dataset_handler))
.route("/user/{username}/list", web::get().to(list_datasets_by_user_handler))
.route("/session/list", web::get().to(list_datasets_by_session_handler))
)
.service(
web::scope("/voice")
.route("/list", web::get().to(list_available_voices_handler))
.route("/search", web::post().to(search_voices))
.route("/create", web::post().to(create_voice_handler))
.route("/{voice_token}", web::get().to(get_voice_handler))
.route("/{voice_token}/update", web::post().to(update_voice_handler))
.route("/{voice_token}/delete", web::delete().to(delete_voice_handler))
.route("/user/{username}/list", web::get().to(list_voices_by_user_handler))
.route("/session/list", web::get().to(list_voices_by_session_handler))
)
.service(
web::scope("/sample")
.route("/upload", web::post().to(upload_zs_sample_handler))
.route("/{sample_token}/delete", web::delete().to(delete_sample_handler))
.route("/dataset/{dataset_token}/list", web::get().to(list_samples_by_dataset_handler))
)
.service(
web::scope("/inference")
.route("/enqueue_tts", web::post().to(enqueue_tts_request))
.route("/enqueue_vc", web::post().to(enqueue_vc_request))
)
)
}
@@ -4,7 +4,7 @@ use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::{web, App, Error, HttpResponse};
pub fn add_control_plane_routes<T, B> (app: App<T>) -> App<T>
pub fn add_control_plane_sora_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
@@ -0,0 +1,40 @@
use crate::http_server::deprecated_endpoints::stubs::app_model_downloads::get_app_model_downloads_handler;
use crate::http_server::deprecated_endpoints::stubs::app_news::get_app_news_handler;
use crate::http_server::deprecated_endpoints::stubs::app_plans::get_app_plans_handler;
use crate::http_server::deprecated_endpoints::stubs::post_app_analytics::post_app_analytics_handler;
use actix_http::body::MessageBody;
use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::error::Error;
use actix_web::{web, App, HttpResponse};
pub fn add_desktop_vc_app_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app.service(web::scope("/v1/vc")
.service(web::resource("/report_analytics")
.route(web::post().to(post_app_analytics_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/news")
.route(web::get().to(get_app_news_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/features")
.route(web::get().to(get_app_plans_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/downloads")
.route(web::get().to(get_app_model_downloads_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
)
}
@@ -0,0 +1,8 @@
pub (super) mod add_legacy_routes;
mod beta_key_routes;
mod control_plane_sora_routes;
mod image_studio_routes;
mod model_download_routes;
mod studio_gen2_routes;
mod workflow_routes;
mod desktop_vc_app_routes;
@@ -1,18 +1,4 @@
mod add_control_plane_routes;
mod add_credits_routes;
mod add_generate_routes;
mod add_image_studio_routes;
mod add_stripe_artcraft_routes;
mod add_studio_gen2_routes;
mod add_webhook_routes;
mod beta_key_routes;
mod job_routes;
mod media_files_routes;
mod model_download_routes;
mod moderation_routes;
mod tag_routes;
mod user_routes;
mod weights_routes;
mod workflow_routes;
pub mod add_routes;
mod add_subscription_routes;
mod application_routes;
mod legacy_routes;
mod service_routes;
@@ -0,0 +1,51 @@
use crate::http_server::endpoints::misc::default_route_404::default_route_404;
use crate::http_server::endpoints::misc::detect_locale_handler::detect_locale_handler;
use crate::http_server::endpoints::misc::root_index::get_root_index;
use crate::http_server::endpoints::service::health_check_handler::get_health_check_handler;
use crate::http_server::endpoints::service::public_info_handler::get_public_info_handler;
use crate::http_server::endpoints::service::status_alert_handler::status_alert_handler;
use actix_http::body::MessageBody;
use actix_service::ServiceFactory;
use actix_web::dev::{ServiceRequest, ServiceResponse};
use actix_web::{web, App, Error, HttpResponse};
/// Add the core service routes.
pub fn add_service_routes<T, B> (app: App<T>) -> App<T>
where
B: MessageBody,
T: ServiceFactory<
ServiceRequest,
Config = (),
Response = ServiceResponse<B>,
Error = Error,
InitError = (),
>,
{
app
.service(
web::resource("/_status")
.route(web::get().to(get_health_check_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
// TODO(bt,2023-01-21): Couldn't scope to /v1/, actix routing table might not like collision
web::resource("/server_info")
.route(web::get().to(get_public_info_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/detect_locale")
.route(web::get().to(detect_locale_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(
web::resource("/v1/status_alert_check")
.route(web::get().to(status_alert_handler))
.route(web::head().to(|| HttpResponse::Ok()))
)
.service(web::resource("/")
.route(web::get().to(get_root_index))
.route(web::head().to(|| HttpResponse::Ok()))
)
.default_service( web::route().to(default_route_404))
}