backbone-banking 0.7.0

Cash & bank — bank/account master, statement import, reconciliation, and clearing postings (5th GL producer)
Documentation
//! Banking 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_bank_routes,
    create_bank_read_routes,
    create_bank_account_routes,
    create_bank_account_read_routes,
    create_bank_clearance_routes,
    create_bank_clearance_read_routes,
    create_bank_reconciliation_routes,
    create_bank_reconciliation_read_routes,
    create_bank_statement_import_routes,
    create_bank_statement_import_read_routes,
    create_bank_transaction_routes,
    create_bank_transaction_read_routes,
    create_fx_gain_loss_routes,
    create_fx_gain_loss_read_routes,
    create_reconcile_preset_routes,
    create_reconcile_preset_read_routes
};

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

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

/// Create stateless routes for the Banking 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 = BankingModule::builder().with_database(pool).build()?;
/// let routes = create_stateless_routes(&module);
/// let app = Router::new().merge(routes);
/// ```
pub fn create_stateless_routes(module: &crate::BankingModule) -> Router<()> {
    Router::new()
        .merge(create_bank_routes(module.bank_service.clone()))
        .merge(create_bank_account_routes(module.bank_account_service.clone()))
        .merge(create_bank_clearance_routes(module.bank_clearance_service.clone()))
        .merge(create_bank_reconciliation_routes(module.bank_reconciliation_service.clone()))
        .merge(create_bank_statement_import_routes(module.bank_statement_import_service.clone()))
        .merge(create_bank_transaction_routes(module.bank_transaction_service.clone()))
        .merge(create_fx_gain_loss_routes(module.fx_gain_loss_service.clone()))
        .merge(create_reconcile_preset_routes(module.reconcile_preset_service.clone()))
}

/// Read-only routes for the Banking module — every entity mounted READ-ONLY (the guarded base).
///
/// The generic `create_stateless_routes` exposes full mutable CRUD with no domain
/// validation; this exposes only reads, so generic mutation can't bypass a write
/// service's invariants. Extend it: `create_readonly_banking_routes(m).merge(my_validated_writes)`.
pub fn create_readonly_banking_routes(module: &crate::BankingModule) -> Router<()> {
    Router::new()
        .merge(create_bank_read_routes(module.bank_service.clone()))
        .merge(create_bank_account_read_routes(module.bank_account_service.clone()))
        .merge(create_bank_clearance_read_routes(module.bank_clearance_service.clone()))
        .merge(create_bank_reconciliation_read_routes(module.bank_reconciliation_service.clone()))
        .merge(create_bank_statement_import_read_routes(module.bank_statement_import_service.clone()))
        .merge(create_bank_transaction_read_routes(module.bank_transaction_service.clone()))
        .merge(create_fx_gain_loss_read_routes(module.fx_gain_loss_service.clone()))
        .merge(create_reconcile_preset_read_routes(module.reconcile_preset_service.clone()))
}

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

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

/// Create stateful routes for the Banking module.
///
/// These routes require AppState and support custom handlers
/// that need access to services via dependency injection.
///
/// # Example
///
/// ```ignore
/// let module = BankingModule::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::BankingModule) -> 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 Banking module.
///
/// This is a convenience function that wraps routes with API versioning.
pub fn get_routes_with_state(module: &crate::BankingModule) -> 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 >>>