omni_director/api_clean/
middleware.rs

1//! # API Middleware
2//!
3//! Middleware components for request processing.
4
5use axum::{
6    extract::Request,
7    http::StatusCode,
8    middleware::Next,
9    response::Response,
10};
11use std::time::Instant;
12
13/// Request logging middleware
14pub async fn request_logging_middleware(
15    request: Request,
16    next: Next,
17) -> Result<Response, StatusCode> {
18    let start = Instant::now();
19    let method = request.method().clone();
20    let uri = request.uri().clone();
21    
22    println!("📥 {} {}", method, uri);
23    
24    let response = next.run(request).await;
25    
26    let duration = start.elapsed();
27    let status = response.status();
28    
29    println!("📤 {} {} {} ({:.2}ms)", method, uri, status, duration.as_secs_f64() * 1000.0);
30    
31    Ok(response)
32}
33
34/// Error handling middleware
35pub async fn error_handling_middleware(
36    request: Request,
37    next: Next,
38) -> Result<Response, StatusCode> {
39    let response = next.run(request).await;
40    
41    // Log errors if status code indicates an error
42    if response.status().is_client_error() || response.status().is_server_error() {
43        println!("❌ Error response: {}", response.status());
44    }
45    
46    Ok(response)
47}
48
49/// CORS middleware (if not using tower-http)
50pub async fn cors_middleware(
51    request: Request,
52    next: Next,
53) -> Result<Response, StatusCode> {
54    let mut response = next.run(request).await;
55    
56    let headers = response.headers_mut();
57    headers.insert("Access-Control-Allow-Origin", "*".parse().unwrap());
58    headers.insert("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS".parse().unwrap());
59    headers.insert("Access-Control-Allow-Headers", "Content-Type, Authorization".parse().unwrap());
60    
61    Ok(response)
62}
63
64/// Authentication middleware (placeholder for future implementation)
65pub async fn auth_middleware(
66    request: Request,
67    next: Next,
68) -> Result<Response, StatusCode> {
69    // TODO: Implement authentication logic
70    // For now, just pass through all requests
71    Ok(next.run(request).await)
72}
73
74/// Rate limiting middleware (placeholder for future implementation)
75pub async fn rate_limit_middleware(
76    request: Request,
77    next: Next,
78) -> Result<Response, StatusCode> {
79    // TODO: Implement rate limiting logic
80    // For now, just pass through all requests
81    Ok(next.run(request).await)
82}