backbone-bucket 0.3.0

Bucket Bounded Context: File Storage Module for Backbone Framework
Documentation
//! Bucket Module Routes
//!
//! Generated by metaphor-schema. Do not edit manually.
//!
//! This module provides route composition with dual pattern support:
//! - Stateless routes: `create_stateless_routes()` -> `Router<()>`
//! - Stateful routes: `create_stateful_routes()` -> `Router<AppState>`

use axum::Router;
use std::sync::Arc;

// Import handlers
use crate::presentation::http::{
    create_bucket_routes,
    create_content_hash_routes,
    create_conversion_job_routes,
    create_file_comment_routes,
    create_file_lock_routes,
    create_file_share_routes,
    create_processing_job_routes,
    create_stored_file_routes,
    create_upload_session_routes,
    create_user_quota_routes
};

// Import AppState for stateful routes
use crate::handlers::AppState;

// ============================================================
// PATTERN 1: STATELESS ROUTES
// ============================================================

/// Create stateless routes for the Bucket module.
///
/// These routes don't require shared state and are simpler to use.
/// Use this when you only need standard CRUD operations.
///
/// # Example
///
/// ```ignore
/// let module = BucketModule::builder().with_database(pool).build()?;
/// let routes = create_stateless_routes(&module);
/// let app = Router::new().merge(routes);
/// ```
pub fn create_stateless_routes(module: &crate::BucketModule) -> Router<()> {
    Router::new()
        .merge(create_bucket_routes(module.bucket_service.clone()))
        .merge(create_content_hash_routes(module.content_hash_service.clone()))
        .merge(create_conversion_job_routes(module.conversion_job_service.clone()))
        .merge(create_file_comment_routes(module.file_comment_service.clone()))
        .merge(create_file_lock_routes(module.file_lock_service.clone()))
        .merge(create_file_share_routes(module.file_share_service.clone()))
        .merge(create_processing_job_routes(module.processing_job_service.clone()))
        .merge(create_stored_file_routes(module.stored_file_service.clone()))
        .merge(create_upload_session_routes(module.upload_session_service.clone()))
        .merge(create_user_quota_routes(module.user_quota_service.clone()))
}

/// Get all routes (stateless) for the Bucket module.
///
/// This is a convenience function that wraps routes with API versioning.
pub fn get_routes(module: &crate::BucketModule) -> Router<()> {
    Router::new()
        .nest("/api/v1", create_stateless_routes(module))
}

// ============================================================
// PATTERN 2: STATEFUL ROUTES (WITH APPSTATE)
// ============================================================

/// Create stateful routes for the Bucket module.
///
/// These routes require AppState and support custom handlers
/// that need access to services via dependency injection.
///
/// # Example
///
/// ```ignore
/// let module = BucketModule::builder().with_database(pool).build()?;
/// let state = AppState::from_module(&module);
/// let routes = create_stateful_routes();
/// let app = Router::new().merge(routes).with_state(state);
/// ```
pub fn create_stateful_routes() -> Router<AppState> {
    Router::new()
        // Add custom handlers here that need AppState
        // .route("/custom", get(custom_handler))
}

/// Create combined routes (stateless CRUD + stateful custom handlers).
///
/// This merges both stateless CRUD routes and stateful custom routes.
pub fn create_combined_routes(module: &crate::BucketModule) -> Router<AppState> {
    // First create stateless routes
    let crud_routes: Router<()> = create_stateless_routes(module);

    // Convert to stateful by adding state requirement
    // Note: The CRUD routes don't actually use the state,
    // but this allows them to be merged with stateful routes.
    let crud_routes_stateful: Router<AppState> = crud_routes.with_state(()).into();

    // Merge with stateful routes
    Router::new()
        .merge(crud_routes_stateful)
        .merge(create_stateful_routes())
}

/// Get all routes (stateful) for the Bucket module.
///
/// This is a convenience function that wraps routes with API versioning.
pub fn get_routes_with_state(module: &crate::BucketModule) -> Router<AppState> {
    Router::new()
        .nest("/api/v1", create_combined_routes(module))
}

// ============================================================
// CUSTOM HANDLERS
// ============================================================

// <<< CUSTOM HANDLERS START >>>
// Add custom route handlers here
// Example:
//
// use axum::extract::State;
// use axum::response::IntoResponse;
//
// pub async fn custom_handler(
//     State(state): State<AppState>,
// ) -> impl IntoResponse {
//     // Use state.user_service, etc.
//     "Custom response"
// }
// <<< CUSTOM HANDLERS END >>>