dogy_backend_api/middleware/log/
layer.rs1use 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
16pub 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 (*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}