lmrc-cli 0.3.16

CLI tool for scaffolding LMRC Stack infrastructure projects
Documentation
//! Routing handlers

use axum::{
    extract::{Request, State},
    http::StatusCode,
    response::{IntoResponse, Response},
};

use crate::error::AppError;
use crate::state::AppState;
use crate::proxy;
use crate::middleware::subdomain::Subdomain;

/// Main subdomain router
pub async fn subdomain_router(
    State(state): State<AppState>,
    request: Request,
) -> Result<Response, AppError> {
    // Get subdomain from extensions (set by middleware)
    let subdomain = request
        .extensions()
        .get::<Subdomain>()
        .map(|s| s.0.clone())
        .unwrap_or_else(|| "infra".to_string()); // Default to infra

    if subdomain == "infra" {
        // Infrastructure routes - handled by main router
        // This shouldn't be reached as infra routes are handled in main.rs
        Ok(StatusCode::NOT_FOUND.into_response())
    } else {
        // User service routes - proxy to configured backend
        route_user_service(State(state), request).await
    }
}

/// Route user service requests
pub async fn route_user_service(
    State(state): State<AppState>,
    request: Request,
) -> Result<Response, AppError> {
    // Get subdomain from extensions
    let subdomain = request
        .extensions()
        .get::<Subdomain>()
        .ok_or_else(|| AppError::BadRequest("Missing subdomain".to_string()))?;

    // Look up backend URL from configuration
    let backend_url = state
        .config
        .routing
        .user_routes
        .get(&subdomain.0)
        .ok_or_else(|| {
            AppError::NotFound(format!("No route configured for subdomain: {}", subdomain.0))
        })?;

    // Proxy to backend
    proxy::client::proxy_request(request, backend_url, proxy::client::ProxyConfig::default()).await
}