use axum::{ Router, extract::DefaultBodyLimit, middleware, routing::{get, patch, post}, }; use crate::{ auth::require_bearer_auth, editor_agent::{ create_editor_agent_conversation, delete_editor_agent_conversation, get_editor_agent_conversation, list_editor_agent_conversations, stream_editor_agent_message, }, editor_project::{ create_editor_asset, create_editor_asset_folder, create_editor_project, create_editor_project_resource, delete_editor_asset, delete_editor_asset_folder, delete_editor_project, edit_editor_image, extract_editor_ui_design_assets, generate_editor_icon_spritesheet, generate_editor_image, get_editor_asset_library, get_editor_generation_pricing, get_editor_project, list_editor_projects, list_public_editor_project_resources, load_recent_editor_project, remove_editor_image_background, rename_editor_project, save_editor_project_layout, split_editor_icon_spritesheet, submit_editor_asset_showcase, toggle_editor_showcase_asset_like, update_editor_asset, update_editor_asset_folder, update_editor_project_resource_showcase, }, state::AppState, }; const EDITOR_AGENT_MESSAGE_BODY_LIMIT_BYTES: usize = 2 * 1024 * 1024; pub fn router(state: AppState) -> Router { Router::new() .route( "/api/editor/generation-pricing", get(get_editor_generation_pricing), ) .route( "/api/editor/showcase/resources", get(list_public_editor_project_resources), ) .route( "/api/editor/projects/recent", get(load_recent_editor_project).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/projects", get(list_editor_projects) .post(create_editor_project) .route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/projects/{project_id}", get(get_editor_project) .patch(save_editor_project_layout) .delete(delete_editor_project) .route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/projects/{project_id}/metadata", patch(rename_editor_project).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/projects/{project_id}/resources", post(create_editor_project_resource).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/projects/{project_id}/agent-conversations", get(list_editor_agent_conversations) .post(create_editor_agent_conversation) .route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/agent-conversations/{conversation_id}", get(get_editor_agent_conversation) .delete(delete_editor_agent_conversation) .route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/agent-conversations/{conversation_id}/messages/stream", post(stream_editor_agent_message) .layer(DefaultBodyLimit::max(EDITOR_AGENT_MESSAGE_BODY_LIMIT_BYTES)) .route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/project-resources/{resource_id}/showcase", patch(update_editor_project_resource_showcase).route_layer( middleware::from_fn_with_state(state.clone(), require_bearer_auth), ), ) .route( "/api/editor/assets/library", get(get_editor_asset_library).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/assets/folders", post(create_editor_asset_folder).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/assets/folders/{folder_id}", patch(update_editor_asset_folder) .delete(delete_editor_asset_folder) .route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/assets", post(create_editor_asset).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/assets/{asset_id}", patch(update_editor_asset) .delete(delete_editor_asset) .route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/assets/{asset_id}/showcase-submissions", post(submit_editor_asset_showcase).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/showcase/assets/{showcase_id}/likes", post(toggle_editor_showcase_asset_like).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/images/generations", post(generate_editor_image).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/images/edits", post(edit_editor_image).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/images/background-removals", post(remove_editor_image_background).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/icon-spritesheets/generations", post(generate_editor_icon_spritesheet).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/icon-spritesheets/slices", post(split_editor_icon_spritesheet).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) .route( "/api/editor/ui-designs/assets/extractions", post(extract_editor_ui_design_assets).route_layer(middleware::from_fn_with_state( state.clone(), require_bearer_auth, )), ) }