dogy_backend_api/middleware/log/
layer.rs

1use std::sync::Arc;
2
3use crate::{
4    middleware::{auth::layer::CurrentUser, log::core::ClientErrorResponse},
5    Error,
6};
7use axum::{
8    http::{Method, Uri},
9    response::{IntoResponse, Response},
10    Json,
11};
12use serde_json::to_value;
13
14use super::core::log_request;
15
16// Logging and Response Mapper Middleware
17pub async fn log_middleware(uri: Uri, req_method: Method, res: Response) -> Response {
18    let current_user = res.extensions().get::<CurrentUser>();
19    let web_error = res.extensions().get::<Arc<Error>>().map(Arc::as_ref);
20    let client_status_error = web_error.map(|se| se.client_status_error());
21
22    let error_response = client_status_error
23        .as_ref()
24        .map(|(status_code, client_error)| {
25            let client_error = to_value(client_error).ok();
26            let code = client_error.as_ref().and_then(|v| v.get("code"));
27            let detail = client_error.as_ref().and_then(|v| v.get("details"));
28
29            let client_error_body = ClientErrorResponse {
30                status: "error".to_string(),
31                code: code.cloned(),
32                details: detail.cloned(),
33            };
34
35            //error!(code = ?client_error_body.code, status = "error", detail = ?client_error_body.detail, "Client error response");
36
37            (*status_code, Json(client_error_body)).into_response()
38        });
39
40    let client_error = client_status_error.unzip().1;
41    let _ = log_request(current_user, uri, req_method, web_error, client_error);
42
43    error_response.unwrap_or(res)
44}